ETH Price: $3,509.90 (+0.01%)
Gas: 2 Gwei

Contract

0x155c900d32F9614A0D4e4Ea1c8A8cA803CbcDbA1
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040111154502020-10-23 23:13:211366 days ago1603494801IN
 Create: MYSTIC
0 ETH0.1173319722.1

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-23
*/

// 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);
}

library Address { // helper for address type - see openzeppelin-contracts/blob/master/contracts/utils/Address.sol
    function isContract(address account) internal view returns (bool) {
        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
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() internal {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

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 deployment under eip-1167 proxy pattern
    
    // HARD-CODED LIMITS
    uint256 constant MAX_GUILD_BOUND = 10**36; // maximum bound for guild member 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 name; // set at summoning
    string public constant symbol = "DAO";
    
    // *******************
    // 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 totalSupply; // total shares & loot across all members (total guild tokens)
    uint256 public totalGuildBankTokens; // total tokens with non-zero balance in guild bank

    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]
    
    address[] public approvedTokens;
    mapping(address => bool) public tokenWhitelist;
    
    uint256[] public proposalQueue;
    mapping(uint256 => bytes) public actions; 
    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;

    // **************
    // EVENT TRACKING
    // **************
    event SubmitProposal(address indexed applicant, uint256 sharesRequested, uint256 lootRequested, uint256 tributeOffered, address tributeToken, uint256 paymentRequested, address paymentToken, bytes32 details, uint8[8] 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 ProcessGuildKickProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessWhitelistProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event UpdateDelegateKey(address indexed memberAddress, address newDelegateKey);
    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 ConvertSharesToLoot(address indexed memberAddress, uint256 amount);
    event StakeTokenForShares(address indexed memberAddress, uint256 amount);
    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
    
    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[8] flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, standard]
        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
    }
    
    modifier onlyDelegate {
        require(members[memberAddressByDelegateKey[msg.sender]].shares > 0, "!delegate");
        _;
    }

    function init(
        address _depositToken,
        address _stakeToken,
        address[] memory _summoner,
        uint256[] memory _summonerShares,
        uint256 _summonerDeposit,
        uint256 _proposalDeposit,
        uint256 _processingReward,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _dilutionBound,
        string memory _guildName
    ) 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++) {
            growGuild(_summoner[i], _summonerShares[i], 0);
        }
        
        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;
        name = _guildName;
        initialized = true;
    }
    
    /*****************
    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 MYSTIC until the proposal is processed - if ether, wrap into wETH
        if (msg.value > 0) {
            require(tributeToken == wETH && msg.value == tributeOffered, "!ethBalance");
            (bool success, ) = wETH.call{value: msg.value}("");
            require(success, "!ethCall");
            IERC20(wETH).safeTransfer(address(this), msg.value);
        } else {
            IERC20(tributeToken).safeTransferFrom(msg.sender, address(this), tributeOffered);
        }
        
        unsafeAddToBalance(ESCROW, tributeToken, tributeOffered);
        
        uint8[8] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, standard]
        flags[7] = 1; // standard

        _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, // target account for action (e.g., address to receive ether, token, dao, etc.)
        uint256 actionTokenAmount, // helps check outbound guild bank token amount does not exceed internal balance / amount to update bank if successful 
        uint256 actionValue, // ether value, if any, in call 
        bytes32 details, // details tx staged for member execution - as external, extra care should be applied in diligencing action 
        bytes calldata data // data for function call
    ) external nonReentrant returns (uint256 proposalId) {
        uint8[8] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, standard]
        flags[6] = 1; // action
        
        _submitProposal(actionTo, 0, 0, actionValue, address(0), actionTokenAmount, address(0), details, flags, data);
        
        return proposalCount - 1;
    }

    function submitGuildKickProposal(address memberToKick, bytes32 details) external nonReentrant returns (uint256 proposalId) {
        Member memory member = members[memberToKick];
        require(member.shares > 0 || member.loot > 0, "!share||loot");
        require(members[memberToKick].jailed == 0, "jailed");
        uint8[8] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, standard]
        flags[5] = 1; // guildkick

        _submitProposal(memberToKick, 0, 0, 0, address(0), 0, address(0), details, flags, "");
        
        return proposalCount - 1;
    }
    
    function submitWhitelistProposal(address tokenToWhitelist, bytes32 details) external nonReentrant 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[8] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick, action, standard]
        flags[4] = 1; // whitelist

        _submitProposal(address(0), 0, 0, 0, tokenToWhitelist, 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[8] 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;
        // NOTE: argument order matters, avoid stack too deep
        emit SubmitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, data, proposalCount, msg.sender, memberAddressByDelegateKey[msg.sender]);
        
        proposalCount += 1;
    }

    function sponsorProposal(uint256 proposalId) external nonReentrant onlyDelegate {
        // collect proposal deposit from sponsor & store it in 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;
        proposal.sponsor = memberAddressByDelegateKey[msg.sender];
        proposal.flags[0] = 1; // sponsored
        // append proposal to the queue
        proposalQueue.push(proposalId);
        
        emit SponsorProposal(msg.sender, proposal.sponsor, 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");
        uint256 proposalId = proposalQueue[proposalIndex];
        Proposal storage proposal = proposals[proposalId];
        require(uintVote < 3, ">2");
        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(proposalId, 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[7] == 1, "!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

            growGuild(proposal.applicant, proposal.sharesRequested, 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 accounted tokens than the available guild bank balance
        if (tokenWhitelist[proposal.applicant] && proposal.paymentRequested > userTokenBalances[GUILD][proposal.applicant]) {
            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.applicant]) {
                unsafeSubtractFromBalance(GUILD, proposal.applicant, proposal.paymentRequested);
                // if the action proposal spends 100% of guild bank balance for a token, decrement total guild bank tokens
                if (userTokenBalances[GUILD][proposal.applicant] == 0 && proposal.paymentRequested > 0) {totalGuildBankTokens -= 1;}
            }
            return (success, returnData);
        }
        
        _returnDeposit(proposal.sponsor);
        
        emit ProcessActionProposal(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 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 _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
        balanceOf[memberAddress] = balanceOf[memberAddress].sub(sharesAndLootToBurn);
        member.shares = member.shares.sub(sharesToBurn);
        member.loot = member.loot.sub(lootToBurn);
        totalShares = totalShares.sub(sharesToBurn);
        totalLoot = totalLoot.sub(lootToBurn);
        totalSupply = totalShares.add(totalLoot);

        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);
        emit Transfer(memberAddress, address(0), sharesAndLootToBurn);
    }

    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, "!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[8] 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 growGuild(address account, uint256 shares, uint256 loot) internal {
        // if the account is already a member, add to their existing shares & loot
        if (members[account].exists == 1) {
            members[account].shares = members[account].shares.add(shares);
            members[account].loot = members[account].loot.add(loot);

        // if the account is a new member, create a new record for them
        } else {
            // if new member is already taken by a member's delegateKey, reset it to their member address
            if (members[memberAddressByDelegateKey[account]].exists == 1) {
                address memberToOverride = memberAddressByDelegateKey[account];
                memberAddressByDelegateKey[memberToOverride] = memberToOverride;
                members[memberToOverride].delegateKey = memberToOverride;
            }
        
            members[account] = Member({
                delegateKey : account,
                exists : 1, // 'true'
                shares : shares,
                loot : loot.add(members[account].loot), // take into account loot from pre-membership transfers
                highestIndexYesVote : 0,
                jailed : 0
            });
            memberAddressByDelegateKey[account] = account;
        }
        
        uint256 sharesAndLoot = shares.add(loot);
        // mint new guild token, update total shares & loot 
        balanceOf[account] = balanceOf[account].add(sharesAndLoot);
        totalShares = totalShares.add(shares);
        totalLoot = totalLoot.add(loot);
        totalSupply = totalShares.add(totalLoot);
        
        emit Transfer(address(0), account, sharesAndLoot);
    }
    
    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 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 stakeTokenForShares(uint256 amount) external nonReentrant {
        IERC20(stakeToken).safeTransferFrom(msg.sender, address(this), amount); // deposit stake token & claim shares (1:1)
        growGuild(msg.sender, amount, 0);
        require(totalSupply <= MAX_GUILD_BOUND, "guild maxed");
        emit StakeTokenForShares(msg.sender, amount);
    }

    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":"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":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeTokenForShares","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[8]","name":"flags","type":"uint8[8]"},{"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":"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[8]","name":"","type":"uint8[8]"}],"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"},{"internalType":"string","name":"_guildName","type":"string"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"stakeTokenForShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"actionTo","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"}]

608060405234801561001057600080fd5b506001600055615eb780620000266000396000f3fe6080604052600436106103bc5760003560e01c80637a609641116101f2578063b470aade1161010d578063e1780345116100a0578063ea7b6ffd1161006f578063ea7b6ffd14611187578063f2428621146111dc578063f5d54c77146111f1578063ff82cc6c14611206576103c3565b8063e1780345146110eb578063e1a0e3fa1461111e578063e63bc62d14611148578063e681c4aa14611172576103c3565b8063da35c664116100dc578063da35c6641461103e578063dd62ed3e14611053578063dfdd369e1461108e578063e0a8f6f5146110c1576103c3565b8063b470aade14610df1578063c169591f14610e06578063c4549c9314610e30578063c89039c514611029576103c3565b80639746d94011610185578063a4d2d9ec11610154578063a4d2d9ec14610d07578063a9059cbb14610d40578063afe5475f14610d79578063b2643aab14610d8e576103c3565b80639746d94014610c6b57806399653fbe14610c955780639d1722cb14610cc8578063a3dc380014610cdd576103c3565b80638b15a605116101c15780638b15a60514610b7b5780639398573714610b905780639425a47614610c2c57806395d89b4114610c56576103c3565b80637a60964114610afd5780637d5b6c7214610b2757806383240f8314610b3c5780638340bbce14610b66576103c3565b80633793ab3c116102e2578063635e99aa1161027557806373f8fd4b1161024457806373f8fd4b14610a65578063753d756314610aa057806378a8956714610ad3578063797daf7014610ae8576103c3565b8063635e99aa146109cf57806363858f2d146109e45780636d4475eb146109f957806370a0823114610a32576103c3565b8063402c1794116102b1578063402c1794146108875780634482394b146108ba57806351ed6a301461098757806359999b411461099c576103c3565b80633793ab3c146107eb5780633a98ef39146108155780633b214a741461082a5780633fc24bba14610854576103c3565b80630cf20cc91161035a57806323b872dd1161032957806323b872dd146107355780632582bf2a1461077857806327efc086146107ab578063313ce567146107c0576103c3565b80630cf20cc91461066f57806315eb349e146106aa57806318160ddd146106da5780631dafede0146106ef576103c3565b806306fdde031161039657806306fdde0314610511578063086146d21461059b57806308ae4b0c146105b0578063095ea7b314610622576103c3565b8063013cf08b146103c857806303e32fa114610490578063044a0ca8146104b7576103c3565b366103c357005b600080fd5b3480156103d457600080fd5b506103f2600480360360208110156103eb57600080fd5b50356112b1565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b34801561049c57600080fd5b506104a5611330565b60408051918252519081900360200190f35b3480156104c357600080fd5b506104f0600480360360408110156104da57600080fd5b506001600160a01b038135169060200135611336565b6040518082600281111561050057fe5b815260200191505060405180910390f35b34801561051d57600080fd5b50610526611429565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610560578181015183820152602001610548565b50505050905090810190601f16801561058d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105a757600080fd5b506104a56114b7565b3480156105bc57600080fd5b506105e3600480360360208110156105d357600080fd5b50356001600160a01b03166114df565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561062e57600080fd5b5061065b6004803603604081101561064557600080fd5b506001600160a01b03813516906020013561151f565b604080519115158252519081900360200190f35b34801561067b57600080fd5b506106a86004803603604081101561069257600080fd5b506001600160a01b0381351690602001356115bf565b005b3480156106b657600080fd5b506106a8600480360360408110156106cd57600080fd5b508035906020013561161d565b3480156106e657600080fd5b506104a56116ca565b3480156106fb57600080fd5b506107196004803603602081101561071257600080fd5b50356116d0565b604080516001600160a01b039092168252519081900360200190f35b34801561074157600080fd5b5061065b6004803603606081101561075857600080fd5b506001600160a01b038135811691602081013590911690604001356116f7565b34801561078457600080fd5b506106a86004803603602081101561079b57600080fd5b50356001600160a01b0316611850565b3480156107b757600080fd5b50610719611abb565b3480156107cc57600080fd5b506107d5611ac1565b6040805160ff9092168252519081900360200190f35b3480156107f757600080fd5b506106a86004803603602081101561080e57600080fd5b5035611ac6565b34801561082157600080fd5b506104a5611cd1565b34801561083657600080fd5b506104a56004803603602081101561084d57600080fd5b5035611cd7565b34801561086057600080fd5b5061065b6004803603602081101561087757600080fd5b50356001600160a01b0316611cf5565b34801561089357600080fd5b50610719600480360360208110156108aa57600080fd5b50356001600160a01b0316611d0a565b3480156108c657600080fd5b506106a8600480360360608110156108dd57600080fd5b810190602081018135600160201b8111156108f757600080fd5b82018360208201111561090957600080fd5b803590602001918460208302840111600160201b8311171561092a57600080fd5b919390929091602081019035600160201b81111561094757600080fd5b82018360208201111561095957600080fd5b803590602001918460208302840111600160201b8311171561097a57600080fd5b9193509150351515611d25565b34801561099357600080fd5b50610719611e6b565b3480156109a857600080fd5b506106a8600480360360208110156109bf57600080fd5b50356001600160a01b0316611e7a565b3480156109db57600080fd5b506104a561210c565b3480156109f057600080fd5b506104a5612112565b348015610a0557600080fd5b506104a560048036036040811015610a1c57600080fd5b506001600160a01b038135169060200135612118565b348015610a3e57600080fd5b506104a560048036036020811015610a5557600080fd5b50356001600160a01b03166122ca565b348015610a7157600080fd5b506104a560048036036040811015610a8857600080fd5b506001600160a01b03813581169160200135166122dc565b348015610aac57600080fd5b5061065b60048036036020811015610ac357600080fd5b50356001600160a01b0316612307565b348015610adf57600080fd5b506104a561231c565b348015610af457600080fd5b506104a5612322565b348015610b0957600080fd5b506106a860048036036020811015610b2057600080fd5b5035612328565b348015610b3357600080fd5b506104a5612425565b348015610b4857600080fd5b5061052660048036036020811015610b5f57600080fd5b503561242b565b348015610b7257600080fd5b506104a5612493565b348015610b8757600080fd5b506104a5612499565b348015610b9c57600080fd5b506104a5600480360360a0811015610bb357600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b50909250905061249f565b348015610c3857600080fd5b5061065b60048036036020811015610c4f57600080fd5b5035612564565b348015610c6257600080fd5b5061052661258b565b348015610c7757600080fd5b506106a860048036036020811015610c8e57600080fd5b50356125aa565b348015610ca157600080fd5b506106a860048036036040811015610cb857600080fd5b508035906020013560ff16612b8f565b348015610cd457600080fd5b506104a5612f85565b348015610ce957600080fd5b5061065b60048036036020811015610d0057600080fd5b5035612f8b565b348015610d1357600080fd5b506104a560048036036040811015610d2a57600080fd5b506001600160a01b03813516906020013561302c565b348015610d4c57600080fd5b5061065b60048036036040811015610d6357600080fd5b506001600160a01b038135169060200135613212565b348015610d8557600080fd5b506104a561330f565b348015610d9a57600080fd5b50610db860048036036020811015610db157600080fd5b5035613315565b604051808261010080838360005b83811015610dde578181015183820152602001610dc6565b5050505090500191505060405180910390f35b348015610dfd57600080fd5b506104a561337e565b348015610e1257600080fd5b506106a860048036036020811015610e2957600080fd5b5035613384565b348015610e3c57600080fd5b506106a86004803603610180811015610e5457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610e8757600080fd5b820183602082011115610e9957600080fd5b803590602001918460208302840111600160201b83111715610eba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f0957600080fd5b820183602082011115610f1b57600080fd5b803590602001918460208302840111600160201b83111715610f3c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929584359560208601359560408101359550606081013594506080810135935060a08101359260c082013592909161010081019060e00135600160201b811115610fb557600080fd5b820183602082011115610fc757600080fd5b803590602001918460018302840111600160201b83111715610fe857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613485945050505050565b34801561103557600080fd5b50610719613764565b34801561104a57600080fd5b506104a5613773565b34801561105f57600080fd5b506104a56004803603604081101561107657600080fd5b506001600160a01b0381358116916020013516613779565b34801561109a57600080fd5b506106a8600480360360208110156110b157600080fd5b50356001600160a01b0316613796565b3480156110cd57600080fd5b506106a8600480360360208110156110e457600080fd5b5035613937565b3480156110f757600080fd5b5061065b6004803603602081101561110e57600080fd5b50356001600160a01b0316613aef565b34801561112a57600080fd5b506106a86004803603602081101561114157600080fd5b5035613b04565b34801561115457600080fd5b506106a86004803603602081101561116b57600080fd5b5035613cea565b34801561117e57600080fd5b50610719614051565b6104a5600480360361010081101561119e57600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e00135614057565b3480156111e857600080fd5b506107196144e8565b3480156111fd57600080fd5b50610719614500565b34801561121257600080fd5b506112306004803603602081101561122957600080fd5b5035614506565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561127557818101518382015260200161125d565b50505050905090810190601f1680156112a25780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6018602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60045481565b6001600160a01b0382166000908152601b6020526040812054600160a01b900460ff16600114611397576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60165482106113d9576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60186000601684815481106113ea57fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156114af5780601f10611484576101008083540402835291602001916114af565b820191906000526020600020905b81548152906001019060200180831161149257829003601f168201915b505050505081565b60006114da6005546114d46009544261484c90919063ffffffff16565b90614861565b905090565b601b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b600081158061154f57503360009081526012602090815260408083206001600160a01b0387168452909152902054155b61155857600080fd5b3360008181526012602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60026000541415611605576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556116148282614883565b50506001600055565b60026000541415611663576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b6020526040902054600160a01b900460ff166001146116bf576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b61161433838361494c565b600f5481565b601481815481106116dd57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0383166000908152601260209081526040808320338452909152812054611725908361484c565b6001600160a01b0385166000818152601260209081526040808320338452825280832094909455918152601b9091522060020154611763908361484c565b6001600160a01b038086166000908152601b602052604080822060029081019490945591861681522001546117989083614c7a565b6001600160a01b038085166000908152601b60209081526040808320600201949094559187168152601190915220546117d1908361484c565b6001600160a01b0380861660009081526011602052604080822093909355908516815220546118009083614c7a565b6001600160a01b038085166000818152601160209081526040918290209490945580518681529051919392881692600080516020615e1483398151915292918290030190a35060015b9392505050565b60026000541415611896576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b60205260409020600101546118ed576040805162461bcd60e51b815260206004820152600c60248201526b10b9b430b932b437b63232b960a11b604482015290519081900360640190fd5b6001600160a01b03811661193d576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b0381163314611a2d576001600160a01b0381166000908152601b6020526040902054600160a01b900460ff16156119b7576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601c60209081526040808320549093168252601b90522054600160a01b900460ff1615611a2d576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b336000818152601b6020908152604080832080546001600160a01b039081168552601c845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506001600055565b61deed81565b601281565b60026000541415611b0c576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055611b1a81614c8c565b600060168281548110611b2957fe5b60009182526020808320919091015480835260189091526040909120600581015491925090600160201b900460ff16600114611b99576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611bb584614f58565b60145490915061019011611bc7575060005b8015611c585760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601560205260408120805460ff1916600190811790915592546014805494850181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601960205260409020805460ff191690556002830154611c8d91166150f1565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a3505060016000555050565b600d5481565b60168181548110611ce457fe5b600091825260209091200154905081565b601a6020526000908152604090205460ff1681565b601c602052600090815260409020546001600160a01b031681565b60026000541415611d6b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055838214611db8576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611e5e576000848483818110611dd157fe5b9050602002013590508215611e305733600090815260136020526040812090888885818110611dfc57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611e55878784818110611e3f57fe5b905060200201356001600160a01b031682614883565b50600101611dbb565b5050600160005550505050565b6002546001600160a01b031681565b60026000541415611ec0576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154611f2a576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc475602090815260408083205481516370a0823160e01b815230600482015291519394611fd694919390926370a082319260248083019392829003018186803b158015611fa457600080fd5b505afa158015611fb8573d6000803e3d6000fd5b505050506040513d6020811015611fce57600080fd5b50519061484c565b905060008111612017576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff16612073576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615df483398151915260205260409020541580156120a8575060c8601054105b156120b7576010805460010190555b6120c461dead8383615138565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b600e5481565b60075481565b600060026000541415612160576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b600260005561216d615b76565b506001600160a01b038381166000908152601b6020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a08301521515806121e5575060008160600151115b612225576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601b60205260409020600401541561227c576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b612284615bb8565b600160a0820152604080516020810190915260008082526122b591879190819081908190819081908c908a90615196565b5050600c546001600055600019019392505050565b60116020526000908152604090205481565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b60156020526000908152604090205460ff1681565b60145490565b60165490565b6002600054141561236e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b602052604090206001015461238f908261484c565b336000908152601b602052604090206001810191909155600201546123b49082614c7a565b336000908152601b6020526040902060020155600d546123d4908261484c565b600d55600e546123e49082614c7a565b600e5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506001600055565b60095481565b60176020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156114af5780601f10611484576101008083540402835291602001916114af565b60065481565b60035481565b6000600260005414156124e7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556124f4615bb8565b600160c0820152604080516020601f860181900481028201810190925284815261254c918a9160009182918b9183918e9183918e918b91908f908f908190840183828082843760009201919091525061519692505050565b5050600c546000190160016000559695505050505050565b600061257b60065483614c7a90919063ffffffff16565b6125836114b7565b101592915050565b6040518060400160405280600381526020016244414f60e81b81525081565b600260005414156125f0576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b90915290206001015461265a576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b600354600154612679916001600160a01b039091169033903090615507565b6001546003546126989161deaf916001600160a01b0390911690615138565b600081815260186020526040902060018101546001600160a01b03166126f1576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff1615612737576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615612784576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601b6020526040902060040154156127e6576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b60008160090154118015612821575060038101546001600160a01b03166000908152600080516020615df48339815191526020526040902054155b1561286f5760c86010541061286f576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff16600114156129c35760038101546001600160a01b031660009081526015602052604090205460ff16156128e6576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526019602052604090205460ff161561294d576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60145461019011612997576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601960205260409020805460ff19166001179055612a60565b600581015465010000000000900460ff1660011415612a605780546001600160a01b03166000908152601a602052604090205460ff1615612a3b576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601a60205260409020805460ff191660011790555b6000612ab7612a6d6114b7565b60165415612aaf57601680546018916000916000198101908110612a8d57fe5b90600052602060002001548152602001908152602001600020600a0154612ab2565b60005b615567565b6001908101600a8401819055336000818152601c60209081526040808320546002890180546001600160a01b0319166001600160a01b0392831617815560058a01805460ff191689179055601680549889018155948590527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242899097018a90559554925481518a8152600019909101928101929092528181018590525193955093169290917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a35050600160005550565b60026000541415612bd5576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154612c3f576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601c60209081526040808320546001600160a01b0316808452601b9092529091206016548410612ca8576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600060168581548110612cb757fe5b600091825260208083209091015480835260189091526040909120909150600360ff861610612d12576040805162461bcd60e51b81526020600482015260026024820152611f1960f11b604482015290519081900360640190fd5b60008560ff166002811115612d2357fe5b905081600a0154612d326114b7565b1015612d6f576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612d7c82600a0154612564565b15612db8576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f8301602052604081205460ff166002811115612de157fe5b14612e1b576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612e2957fe5b1480612e4057506002816002811115612e3e57fe5b145b612e7c576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f830160205260409020805482919060ff19166001836002811115612ead57fe5b02179055506001816002811115612ec057fe5b1415612f06576001840154600b8301805490910190556003840154871115612eea57600384018790555b81600d0154600f541115612f0157600f54600d8301555b612f2b565b6002816002811115612f1457fe5b1415612f2b576001840154600c8301805490910190555b6040805184815260ff8816602082015281516001600160a01b0388169233928b927f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a20929181900390910190a4505060016000555050505050565b60105481565b6016546000908210612fd0576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b6018600060168481548110612fe157fe5b9060005260206000200154815260200190815260200160002060050160016008811061300957fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b600060026000541415613074576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556001600160a01b0383166130bd576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6002546001600160a01b0384811691161415613120576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff161561317c576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b601454610190116131c6576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b6131ce615bb8565b60016080820152604080516020810190915260008082526131fe918190819081908990829081908b908a90615196565b5050600c5460001901600160005592915050565b336000908152601b602052604081206002015461322f908361484c565b336000908152601b60205260408082206002908101939093556001600160a01b0386168252902001546132629083614c7a565b6001600160a01b0384166000908152601b6020908152604080832060020193909355338252601190522054613297908361484c565b33600090815260116020526040808220929092556001600160a01b038516815220546132c39083614c7a565b6001600160a01b038416600081815260116020908152604091829020939093558051858152905191923392600080516020615e148339815191529281900390910190a350600192915050565b60085481565b61331d615bb8565b6000828152601860205260408082208151610100810192839052926005909101916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411613345575094979650505050505050565b60055481565b600260005414156133ca576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000819055546133e7906001600160a01b0316333084615507565b6133f33382600061557e565b6ec097ce7bc90715b34b9f1000000000600f541115613447576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917f83b37e7ebc9b774fe613926f7f5dd4594c0f8d39e7ca0169a9f6810011f2b6f8919081900360200190a2506001600055565b600a5460ff16156134cb576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b8a6001600160a01b03168c6001600160a01b03161415613532576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b88518a5114613588576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b858710156135c75760405162461bcd60e51b8152600401808060200182810382526024815260200180615e346024913960400191505060405180910390fd5b60005b8a5181101561360d576136058b82815181106135e257fe5b60200260200101518b83815181106135f657fe5b6020026020010151600061557e565b6001016135ca565b506ec097ce7bc90715b34b9f1000000000600d541115613662576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038c166000818152601560205260408120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b031916909117905587156136e3576010805460010190556136e361dead8d8a615138565b600180546001600160a01b03808f166001600160a01b03199283161790925560028054928e169290911691909117905560038790556004869055600585905560068490556007839055600882905542600955805161374890600b906020840190615bd7565b5050600a805460ff191660011790555050505050505050505050565b6001546001600160a01b031681565b600c5481565b601260209081526000928352604080842090915290825290205481565b600260005414156137dc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154613846576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b0381166000908152601b60205260409020600481015461389e576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b60008160020154116138df576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6138ec8160030154612f8b565b6139275760405162461bcd60e51b8152600401808060200182810382526041815260200180615d936041913960600191505060405180910390fd5b611614826000836002015461494c565b6002600054141561397d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155818152601860205260409020600581015460ff16156139d6576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615613a23576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613a70576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613ab09261deaf926001600160a01b039182169291169061583a565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506001600055565b60196020526000908152604090205460ff1681565b60026000541415613b4a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055613b5881614c8c565b600060168281548110613b6757fe5b6000918252602080832091909101548083526018909152604090912060058101549192509065010000000000900460ff16600114613bd4576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613bf084614f58565b90508015613c745760058201805462ff000019166201000017905581546001600160a01b03166000908152601b602052604090206004810185905560018101546002820154613c3e91614c7a565b60028201556001810154600d54613c549161484c565b600d556001810154600e54613c6891614c7a565b600e5560006001909101555b81546001600160a01b039081166000908152601a60205260409020805460ff191690556002830154613ca691166150f1565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b60026000541415613d30576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055613d3e81614c8c565b600060168281548110613d4d57fe5b60009182526020808320919091015480835260189091526040909120600581015491925090670100000000000000900460ff16600114613dc0576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613ddc84614f58565b90506ec097ce7bc90715b34b9f1000000000613e158360070154613e0f8560060154600f54614c7a90919063ffffffff16565b90614c7a565b1115613e1f575060005b60048201546001600160a01b03166000908152600080516020615df4833981519152602052604090205460088301541115613e58575060005b60008260090154118015613e93575060038201546001600160a01b03166000908152600080516020615df48339815191526020526040902054155b8015613ea2575060c860105410155b15613eab575060005b8015613fcb5760058201805462ff0000191662010000179055815460068301546007840154613ee4926001600160a01b0316919061557e565b60038201546001600160a01b03166000908152600080516020615df48339815191526020526040902054158015613f1f575060008260090154115b15613f2e576010805460010190555b60038201546009830154613f539161deaf9161dead916001600160a01b03169061583a565b815460048301546008840154613f7b9261dead926001600160a01b039182169291169061583a565b60048201546001600160a01b03166000908152600080516020615df48339815191526020526040902054158015613fb6575060008260080154115b15613fc657601080546000190190555b613ff6565b600182015460038301546009840154613ff69261deaf926001600160a01b039182169291169061583a565b600282015461400d906001600160a01b03166150f1565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61deaf81565b60006002600054141561409f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556ec097ce7bc90715b34b9f10000000006140be8989614c7a565b11156140ff576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526015602052604090205460ff1661416c576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff166141d9576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead148015906141ff57506001600160a01b03891661deaf14155b801561421657506001600160a01b03891661deed14155b614260576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b0389166000908152601b6020526040902060040154156142c1576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b6000861180156142f457506001600160a01b0385166000908152600080516020615df48339815191526020526040902054155b156143425760c860105410614342576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b3415614473576001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214801561437357508534145b6143b2576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b60405160009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29034908381818185875af1925050503d8060008114614408576040519150601f19603f3d011682016040523d82523d6000602084013e61440d565b606091505b505090508061444e576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b61446d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23034615850565b50614488565b6144886001600160a01b038616333089615507565b61449561deaf8688615138565b61449d615bb8565b600160e08201526040805160208101909152600081526144ce908b908b908b908b908b908b908b908b908a90615196565b5050600c5460001901600160005598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b6000606060026000541415614550576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b600260005561455e83614c8c565b60006016848154811061456d57fe5b6000918252602080832091909101548083526017825260408084206018909352909220600581015492935090916601000000000000900460ff166001146145e5576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff001916610100179055600061460187614f58565b82546001600160a01b031660009081526015602052604090205490915060ff168015614656575081546001600160a01b03166000908152600080516020615df483398151915260205260409020546008830154115b1561465f575060005b478260090154111561466f575060005b80156147eb5760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156147055780601f106146e3576101008083540402835291820191614705565b820191906000526020600020905b8154815290600101906020018083116146f1575b505091505060006040518083038185875af1925050503d8060008114614747576040519150601f19603f3d011682016040523d82523d6000602084013e61474c565b606091505b5085546001600160a01b0316600090815260156020526040902054919350915060ff16156147dc57835460088501546147949161dead916001600160a01b03909116906158a7565b83546001600160a01b03166000908152600080516020615df483398151915260205260409020541580156147cc575060008460080154115b156147dc57601080546000190190555b90965094506148409350505050565b6002820154614802906001600160a01b03166150f1565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b60016000559092909150565b60008282111561485b57600080fd5b50900390565b600080821161486f57600080fd5b600082848161487a57fe5b04949350505050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548111156148e6576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b6148fa6001600160a01b0383163383615850565b6149053383836158a7565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b600f546001600160a01b0384166000908152601b6020526040902060018101548411156149aa576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b82816002015410156149eb576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6149f88160030154612f8b565b614a335760405162461bcd60e51b8152600401808060200182810382526041815260200180615d936041913960600191505060405180910390fd5b6000614a3f8585614c7a565b6001600160a01b038716600090815260116020526040902054909150614a65908261484c565b6001600160a01b0387166000908152601160205260409020556001820154614a8d908661484c565b60018301556002820154614aa1908561484c565b6002830155600d54614ab3908661484c565b600d55600e54614ac3908561484c565b600e819055600d54614ad491614c7a565b600f5560005b601454811015614bff5761dead6000908152601360205260148054614b4291600080516020615df48339815191529184919086908110614b1657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615907565b90508015614bf65761dead60009081526013602052601480548392600080516020615df483398151915292909186908110614b7957fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526013909252908120601480548493919086908110614bca57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614ada565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a26040805182815290516000916001600160a01b03891691600080516020615e148339815191529181900360200190a3505050505050565b60008282018381101561184957600080fd5b6016548110614cce576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614cd6615c55565b6018600060168481548110614ce757fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610100810193849052909260a085019260058501916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614d6e5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050614e21600754613e0f600654846101400151614c7a90919063ffffffff16565b614e296114b7565b1015614e65576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff1615614eaf576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b811580614f1057506018600060166001850381548110614ecb57fe5b90600052602060002001548152602001908152602001600020600501600160088110614ef357fe5b602091828204019190069054906101000a900460ff1660ff166001145b614f54576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b6000614f62615c55565b6018600060168581548110614f7357fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610100810193849052909260a085019260058501916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614ffa5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e82015481525050905080610180015181610160015111156150a457600191505b6101a0810151600854600f546150b99161595b565b10156150c457600091505b80516001600160a01b03166000908152601b6020526040902060040154156150eb57600091505b50919050565b6001546004546151109161deaf9133916001600160a01b03169061583a565b6001546004546003546151359261deaf9285926001600160a01b03909216910361583a565b50565b6001600160a01b0392831660009081526013602090815260408083209490951682529283528381208054830190557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc47590925291902080549091019055565b61519e615c55565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066008811061524757fe5b602002015160ff166001141561527b57600c546000908152601760209081526040909120835161527992850190615bd7565b505b600c54600090815260186020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a082015182919061531c9060058301906008615cd5565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050601c6000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03168c6001600160a01b03167fa3d7bb2543375ecc932ca0aadf1a4017755f5e76f4d596cbe9353f635bfedebc8d8d8d8d8d8d8d8d8d600c54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600860200280838360005b83811015615468578181015183820152602001615450565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156154ae578181015183820152602001615496565b50505050905090810190601f1680156154db5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600c80546001019055505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615561908590615982565b50505050565b6000818310156155775781611849565b5090919050565b6001600160a01b0383166000908152601b6020526040902054600160a01b900460ff166001141561561e576001600160a01b0383166000908152601b60205260409020600101546155cf9083614c7a565b6001600160a01b0384166000908152601b602052604090206001810191909155600201546155fd9082614c7a565b6001600160a01b0384166000908152601b6020526040902060020155615789565b6001600160a01b038084166000908152601c60209081526040808320549093168252601b9052205460ff600160a01b90910416600114156156a6576001600160a01b038084166000908152601c602090815260408083205490931680835283832080546001600160a01b03199081168317909155601b90925292909120805490911690911790555b6040805160c0810182526001600160a01b03851680825260016020808401919091528284018690526000918252601b9052919091206002015460608201906156ef908490614c7a565b81526000602080830182905260409283018290526001600160a01b03808816808452601b8352848420865181548886015160ff16600160a01b0260ff60a01b19929095166001600160a01b03199182161791909116939093178155868601516001820155606087015160028201556080870151600382015560a090960151600490960195909555601c909152919020805490911690911790555b60006157958383614c7a565b6001600160a01b0385166000908152601160205260409020549091506157bb9082614c7a565b6001600160a01b038516600090815260116020526040902055600d546157e19084614c7a565b600d55600e546157f19083614c7a565b600e819055600d5461580291614c7a565b600f556040805182815290516001600160a01b03861691600091600080516020615e148339815191529181900360200190a350505050565b6158458483836158a7565b615561838383615138565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526158a2908490615982565b505050565b6001600160a01b039283166000908152601360209081526040808320949095168252928352838120805483900390557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc4759092529190208054919091039055565b60008161591357600080fd5b8361592057506000611849565b8383028385828161592d57fe5b0414156159465782818161593d57fe5b04915050611849565b8383868161595057fe5b040295945050505050565b60008261596a57506000611423565b8282028284828161597757fe5b041461184957600080fd5b615994826001600160a01b0316615b3a565b6159e5576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a235780518252601f199092019160209182019101615a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a85576040519150601f19603f3d011682016040523d82523d6000602084013e615a8a565b606091505b509150915081615ae1576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561556157808060200190516020811015615afd57600080fd5b50516155615760405162461bcd60e51b815260040180806020018281038252602a815260200180615e58602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615b6e57508115155b949350505050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b6040518061010001604052806008906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c1857805160ff1916838001178555615c45565b82800160010185558215615c45579182015b82811115615c45578251825591602001919060010190615c2a565b50615c51929150615d64565b5090565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615c8d615bb8565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b600183019183908215615d585791602002820160005b83821115615d2957835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615ceb565b8015615d565782816101000a81549060ff0219169055600101602081600001049283019260010302615d29565b505b50615c51929150615d79565b5b80821115615c515760008155600101615d65565b5b80821115615c5157805460ff19168155600101615d7a56fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f6365737365735265656e7472616e637947756172643a207265656e7472616e742063616c6c002264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271cddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b14b1d4cca6b0621f70db6cfef7d4a327f8c525cf12a7d41ad8ce20b063cf00764736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80637a609641116101f2578063b470aade1161010d578063e1780345116100a0578063ea7b6ffd1161006f578063ea7b6ffd14611187578063f2428621146111dc578063f5d54c77146111f1578063ff82cc6c14611206576103c3565b8063e1780345146110eb578063e1a0e3fa1461111e578063e63bc62d14611148578063e681c4aa14611172576103c3565b8063da35c664116100dc578063da35c6641461103e578063dd62ed3e14611053578063dfdd369e1461108e578063e0a8f6f5146110c1576103c3565b8063b470aade14610df1578063c169591f14610e06578063c4549c9314610e30578063c89039c514611029576103c3565b80639746d94011610185578063a4d2d9ec11610154578063a4d2d9ec14610d07578063a9059cbb14610d40578063afe5475f14610d79578063b2643aab14610d8e576103c3565b80639746d94014610c6b57806399653fbe14610c955780639d1722cb14610cc8578063a3dc380014610cdd576103c3565b80638b15a605116101c15780638b15a60514610b7b5780639398573714610b905780639425a47614610c2c57806395d89b4114610c56576103c3565b80637a60964114610afd5780637d5b6c7214610b2757806383240f8314610b3c5780638340bbce14610b66576103c3565b80633793ab3c116102e2578063635e99aa1161027557806373f8fd4b1161024457806373f8fd4b14610a65578063753d756314610aa057806378a8956714610ad3578063797daf7014610ae8576103c3565b8063635e99aa146109cf57806363858f2d146109e45780636d4475eb146109f957806370a0823114610a32576103c3565b8063402c1794116102b1578063402c1794146108875780634482394b146108ba57806351ed6a301461098757806359999b411461099c576103c3565b80633793ab3c146107eb5780633a98ef39146108155780633b214a741461082a5780633fc24bba14610854576103c3565b80630cf20cc91161035a57806323b872dd1161032957806323b872dd146107355780632582bf2a1461077857806327efc086146107ab578063313ce567146107c0576103c3565b80630cf20cc91461066f57806315eb349e146106aa57806318160ddd146106da5780631dafede0146106ef576103c3565b806306fdde031161039657806306fdde0314610511578063086146d21461059b57806308ae4b0c146105b0578063095ea7b314610622576103c3565b8063013cf08b146103c857806303e32fa114610490578063044a0ca8146104b7576103c3565b366103c357005b600080fd5b3480156103d457600080fd5b506103f2600480360360208110156103eb57600080fd5b50356112b1565b604051808f6001600160a01b031681526020018e6001600160a01b031681526020018d6001600160a01b031681526020018c6001600160a01b031681526020018b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390f35b34801561049c57600080fd5b506104a5611330565b60408051918252519081900360200190f35b3480156104c357600080fd5b506104f0600480360360408110156104da57600080fd5b506001600160a01b038135169060200135611336565b6040518082600281111561050057fe5b815260200191505060405180910390f35b34801561051d57600080fd5b50610526611429565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610560578181015183820152602001610548565b50505050905090810190601f16801561058d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105a757600080fd5b506104a56114b7565b3480156105bc57600080fd5b506105e3600480360360208110156105d357600080fd5b50356001600160a01b03166114df565b604080516001600160a01b03909716875260ff9095166020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561062e57600080fd5b5061065b6004803603604081101561064557600080fd5b506001600160a01b03813516906020013561151f565b604080519115158252519081900360200190f35b34801561067b57600080fd5b506106a86004803603604081101561069257600080fd5b506001600160a01b0381351690602001356115bf565b005b3480156106b657600080fd5b506106a8600480360360408110156106cd57600080fd5b508035906020013561161d565b3480156106e657600080fd5b506104a56116ca565b3480156106fb57600080fd5b506107196004803603602081101561071257600080fd5b50356116d0565b604080516001600160a01b039092168252519081900360200190f35b34801561074157600080fd5b5061065b6004803603606081101561075857600080fd5b506001600160a01b038135811691602081013590911690604001356116f7565b34801561078457600080fd5b506106a86004803603602081101561079b57600080fd5b50356001600160a01b0316611850565b3480156107b757600080fd5b50610719611abb565b3480156107cc57600080fd5b506107d5611ac1565b6040805160ff9092168252519081900360200190f35b3480156107f757600080fd5b506106a86004803603602081101561080e57600080fd5b5035611ac6565b34801561082157600080fd5b506104a5611cd1565b34801561083657600080fd5b506104a56004803603602081101561084d57600080fd5b5035611cd7565b34801561086057600080fd5b5061065b6004803603602081101561087757600080fd5b50356001600160a01b0316611cf5565b34801561089357600080fd5b50610719600480360360208110156108aa57600080fd5b50356001600160a01b0316611d0a565b3480156108c657600080fd5b506106a8600480360360608110156108dd57600080fd5b810190602081018135600160201b8111156108f757600080fd5b82018360208201111561090957600080fd5b803590602001918460208302840111600160201b8311171561092a57600080fd5b919390929091602081019035600160201b81111561094757600080fd5b82018360208201111561095957600080fd5b803590602001918460208302840111600160201b8311171561097a57600080fd5b9193509150351515611d25565b34801561099357600080fd5b50610719611e6b565b3480156109a857600080fd5b506106a8600480360360208110156109bf57600080fd5b50356001600160a01b0316611e7a565b3480156109db57600080fd5b506104a561210c565b3480156109f057600080fd5b506104a5612112565b348015610a0557600080fd5b506104a560048036036040811015610a1c57600080fd5b506001600160a01b038135169060200135612118565b348015610a3e57600080fd5b506104a560048036036020811015610a5557600080fd5b50356001600160a01b03166122ca565b348015610a7157600080fd5b506104a560048036036040811015610a8857600080fd5b506001600160a01b03813581169160200135166122dc565b348015610aac57600080fd5b5061065b60048036036020811015610ac357600080fd5b50356001600160a01b0316612307565b348015610adf57600080fd5b506104a561231c565b348015610af457600080fd5b506104a5612322565b348015610b0957600080fd5b506106a860048036036020811015610b2057600080fd5b5035612328565b348015610b3357600080fd5b506104a5612425565b348015610b4857600080fd5b5061052660048036036020811015610b5f57600080fd5b503561242b565b348015610b7257600080fd5b506104a5612493565b348015610b8757600080fd5b506104a5612499565b348015610b9c57600080fd5b506104a5600480360360a0811015610bb357600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a081016080820135600160201b811115610bee57600080fd5b820183602082011115610c0057600080fd5b803590602001918460018302840111600160201b83111715610c2157600080fd5b50909250905061249f565b348015610c3857600080fd5b5061065b60048036036020811015610c4f57600080fd5b5035612564565b348015610c6257600080fd5b5061052661258b565b348015610c7757600080fd5b506106a860048036036020811015610c8e57600080fd5b50356125aa565b348015610ca157600080fd5b506106a860048036036040811015610cb857600080fd5b508035906020013560ff16612b8f565b348015610cd457600080fd5b506104a5612f85565b348015610ce957600080fd5b5061065b60048036036020811015610d0057600080fd5b5035612f8b565b348015610d1357600080fd5b506104a560048036036040811015610d2a57600080fd5b506001600160a01b03813516906020013561302c565b348015610d4c57600080fd5b5061065b60048036036040811015610d6357600080fd5b506001600160a01b038135169060200135613212565b348015610d8557600080fd5b506104a561330f565b348015610d9a57600080fd5b50610db860048036036020811015610db157600080fd5b5035613315565b604051808261010080838360005b83811015610dde578181015183820152602001610dc6565b5050505090500191505060405180910390f35b348015610dfd57600080fd5b506104a561337e565b348015610e1257600080fd5b506106a860048036036020811015610e2957600080fd5b5035613384565b348015610e3c57600080fd5b506106a86004803603610180811015610e5457600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610e8757600080fd5b820183602082011115610e9957600080fd5b803590602001918460208302840111600160201b83111715610eba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f0957600080fd5b820183602082011115610f1b57600080fd5b803590602001918460208302840111600160201b83111715610f3c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929584359560208601359560408101359550606081013594506080810135935060a08101359260c082013592909161010081019060e00135600160201b811115610fb557600080fd5b820183602082011115610fc757600080fd5b803590602001918460018302840111600160201b83111715610fe857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613485945050505050565b34801561103557600080fd5b50610719613764565b34801561104a57600080fd5b506104a5613773565b34801561105f57600080fd5b506104a56004803603604081101561107657600080fd5b506001600160a01b0381358116916020013516613779565b34801561109a57600080fd5b506106a8600480360360208110156110b157600080fd5b50356001600160a01b0316613796565b3480156110cd57600080fd5b506106a8600480360360208110156110e457600080fd5b5035613937565b3480156110f757600080fd5b5061065b6004803603602081101561110e57600080fd5b50356001600160a01b0316613aef565b34801561112a57600080fd5b506106a86004803603602081101561114157600080fd5b5035613b04565b34801561115457600080fd5b506106a86004803603602081101561116b57600080fd5b5035613cea565b34801561117e57600080fd5b50610719614051565b6104a5600480360361010081101561119e57600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013581169160a08101359160c0820135169060e00135614057565b3480156111e857600080fd5b506107196144e8565b3480156111fd57600080fd5b50610719614500565b34801561121257600080fd5b506112306004803603602081101561122957600080fd5b5035614506565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561127557818101518382015260200161125d565b50505050905090810190601f1680156112a25780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6018602052600090815260409020805460018201546002830154600384015460048501546006860154600787015460088801546009890154600a8a0154600b8b0154600c8c0154600d8d0154600e909d01546001600160a01b039c8d169d9b8d169c9a8b169b998b169a9098169896979596949593949293919290918e565b60045481565b6001600160a01b0382166000908152601b6020526040812054600160a01b900460ff16600114611397576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b60165482106113d9576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b60186000601684815481106113ea57fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b600b805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156114af5780601f10611484576101008083540402835291602001916114af565b820191906000526020600020905b81548152906001019060200180831161149257829003601f168201915b505050505081565b60006114da6005546114d46009544261484c90919063ffffffff16565b90614861565b905090565b601b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03841694600160a01b90940460ff16939086565b600081158061154f57503360009081526012602090815260408083206001600160a01b0387168452909152902054155b61155857600080fd5b3360008181526012602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60026000541415611605576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556116148282614883565b50506001600055565b60026000541415611663576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b6020526040902054600160a01b900460ff166001146116bf576040805162461bcd60e51b815260206004820152600760248201526610b6b2b6b132b960c91b604482015290519081900360640190fd5b61161433838361494c565b600f5481565b601481815481106116dd57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0383166000908152601260209081526040808320338452909152812054611725908361484c565b6001600160a01b0385166000818152601260209081526040808320338452825280832094909455918152601b9091522060020154611763908361484c565b6001600160a01b038086166000908152601b602052604080822060029081019490945591861681522001546117989083614c7a565b6001600160a01b038085166000908152601b60209081526040808320600201949094559187168152601190915220546117d1908361484c565b6001600160a01b0380861660009081526011602052604080822093909355908516815220546118009083614c7a565b6001600160a01b038085166000818152601160209081526040918290209490945580518681529051919392881692600080516020615e1483398151915292918290030190a35060015b9392505050565b60026000541415611896576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b60205260409020600101546118ed576040805162461bcd60e51b815260206004820152600c60248201526b10b9b430b932b437b63232b960a11b604482015290519081900360640190fd5b6001600160a01b03811661193d576040805162461bcd60e51b815260206004820152601260248201527106e657744656c65676174654b6579203d20360741b604482015290519081900360640190fd5b6001600160a01b0381163314611a2d576001600160a01b0381166000908152601b6020526040902054600160a01b900460ff16156119b7576040805162461bcd60e51b8152602060048201526012602482015271216f7665727772697465206d656d6265727360701b604482015290519081900360640190fd5b6001600160a01b038181166000908152601c60209081526040808320549093168252601b90522054600160a01b900460ff1615611a2d576040805162461bcd60e51b815260206004820152600f60248201526e216f7665727772697465206b65797360881b604482015290519081900360640190fd5b336000818152601b6020908152604080832080546001600160a01b039081168552601c845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506001600055565b61deed81565b601281565b60026000541415611b0c576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055611b1a81614c8c565b600060168281548110611b2957fe5b60009182526020808320919091015480835260189091526040909120600581015491925090600160201b900460ff16600114611b99576040805162461bcd60e51b815260206004820152600a602482015269085dda1a5d195b1a5cdd60b21b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000611bb584614f58565b60145490915061019011611bc7575060005b8015611c585760058201805462ff00001916620100001790556003820180546001600160a01b039081166000908152601560205260408120805460ff1916600190811790915592546014805494850181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9092018054929091166001600160a01b03199092169190911790555b60038201546001600160a01b039081166000908152601960205260409020805460ff191690556002830154611c8d91166150f1565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a3505060016000555050565b600d5481565b60168181548110611ce457fe5b600091825260209091200154905081565b601a6020526000908152604090205460ff1681565b601c602052600090815260409020546001600160a01b031681565b60026000541415611d6b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055838214611db8576040805162461bcd60e51b8152602060048201526011602482015270746f6b656e7320213d20616d6f756e747360781b604482015290519081900360640190fd5b60005b84811015611e5e576000848483818110611dd157fe5b9050602002013590508215611e305733600090815260136020526040812090888885818110611dfc57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490505b611e55878784818110611e3f57fe5b905060200201356001600160a01b031682614883565b50600101611dbb565b5050600160005550505050565b6002546001600160a01b031681565b60026000541415611ec0576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154611f2a576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b03811660008181527ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc475602090815260408083205481516370a0823160e01b815230600482015291519394611fd694919390926370a082319260248083019392829003018186803b158015611fa457600080fd5b505afa158015611fb8573d6000803e3d6000fd5b505050506040513d6020811015611fce57600080fd5b50519061484c565b905060008111612017576040805162461bcd60e51b815260206004820152600760248201526608585b5bdd5b9d60ca1b604482015290519081900360640190fd5b6001600160a01b03821660009081526015602052604090205460ff16612073576040805162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600080516020615df483398151915260205260409020541580156120a8575060c8601054105b156120b7576010805460010190555b6120c461dead8383615138565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b600e5481565b60075481565b600060026000541415612160576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b600260005561216d615b76565b506001600160a01b038381166000908152601b6020908152604091829020825160c08101845281549485168152600160a01b90940460ff1691840191909152600181015491830182905260028101546060840152600381015460808401526004015460a08301521515806121e5575060008160600151115b612225576040805162461bcd60e51b815260206004820152600c60248201526b085cda185c995f1f1b1bdbdd60a21b604482015290519081900360640190fd5b6001600160a01b0384166000908152601b60205260409020600401541561227c576040805162461bcd60e51b81526020600482015260066024820152651a985a5b195960d21b604482015290519081900360640190fd5b612284615bb8565b600160a0820152604080516020810190915260008082526122b591879190819081908190819081908c908a90615196565b5050600c546001600055600019019392505050565b60116020526000908152604090205481565b6001600160a01b03918216600090815260136020908152604080832093909416825291909152205490565b60156020526000908152604090205460ff1681565b60145490565b60165490565b6002600054141561236e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601b602052604090206001015461238f908261484c565b336000908152601b602052604090206001810191909155600201546123b49082614c7a565b336000908152601b6020526040902060020155600d546123d4908261484c565b600d55600e546123e49082614c7a565b600e5560408051828152905133917f919a31da3abe80797e98aa9c2c7f702e81362432ae3e701295d162ceee68101b919081900360200190a2506001600055565b60095481565b60176020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156114af5780601f10611484576101008083540402835291602001916114af565b60065481565b60035481565b6000600260005414156124e7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556124f4615bb8565b600160c0820152604080516020601f860181900481028201810190925284815261254c918a9160009182918b9183918e9183918e918b91908f908f908190840183828082843760009201919091525061519692505050565b5050600c546000190160016000559695505050505050565b600061257b60065483614c7a90919063ffffffff16565b6125836114b7565b101592915050565b6040518060400160405280600381526020016244414f60e81b81525081565b600260005414156125f0576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b90915290206001015461265a576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b600354600154612679916001600160a01b039091169033903090615507565b6001546003546126989161deaf916001600160a01b0390911690615138565b600081815260186020526040902060018101546001600160a01b03166126f1576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600581015460ff1615612737576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615612784576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601b6020526040902060040154156127e6576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b60008160090154118015612821575060038101546001600160a01b03166000908152600080516020615df48339815191526020526040902054155b1561286f5760c86010541061286f576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b6005810154600160201b900460ff16600114156129c35760038101546001600160a01b031660009081526015602052604090205460ff16156128e6576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b60038101546001600160a01b031660009081526019602052604090205460ff161561294d576040805162461bcd60e51b81526020600482015260126024820152711dda1a5d195b1a5cdd081c1c9bdc1bdcd95960721b604482015290519081900360640190fd5b60145461019011612997576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b60038101546001600160a01b03166000908152601960205260409020805460ff19166001179055612a60565b600581015465010000000000900460ff1660011415612a605780546001600160a01b03166000908152601a602052604090205460ff1615612a3b576040805162461bcd60e51b815260206004820152600d60248201526c1ada58dac81c1c9bdc1bdcd959609a1b604482015290519081900360640190fd5b80546001600160a01b03166000908152601a60205260409020805460ff191660011790555b6000612ab7612a6d6114b7565b60165415612aaf57601680546018916000916000198101908110612a8d57fe5b90600052602060002001548152602001908152602001600020600a0154612ab2565b60005b615567565b6001908101600a8401819055336000818152601c60209081526040808320546002890180546001600160a01b0319166001600160a01b0392831617815560058a01805460ff191689179055601680549889018155948590527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242899097018a90559554925481518a8152600019909101928101929092528181018590525193955093169290917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd9181900360600190a35050600160005550565b60026000541415612bd5576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154612c3f576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b336000908152601c60209081526040808320546001600160a01b0316808452601b9092529091206016548410612ca8576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd95960ba1b604482015290519081900360640190fd5b600060168581548110612cb757fe5b600091825260208083209091015480835260189091526040909120909150600360ff861610612d12576040805162461bcd60e51b81526020600482015260026024820152611f1960f11b604482015290519081900360640190fd5b60008560ff166002811115612d2357fe5b905081600a0154612d326114b7565b1015612d6f576040805162461bcd60e51b815260206004820152600760248201526670656e64696e6760c81b604482015290519081900360640190fd5b612d7c82600a0154612564565b15612db8576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f8301602052604081205460ff166002811115612de157fe5b14612e1b576040805162461bcd60e51b81526020600482015260056024820152641d9bdd195960da1b604482015290519081900360640190fd5b6001816002811115612e2957fe5b1480612e4057506002816002811115612e3e57fe5b145b612e7c576040805162461bcd60e51b8152602060048201526008602482015267215965737c7c4e6f60c01b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f830160205260409020805482919060ff19166001836002811115612ead57fe5b02179055506001816002811115612ec057fe5b1415612f06576001840154600b8301805490910190556003840154871115612eea57600384018790555b81600d0154600f541115612f0157600f54600d8301555b612f2b565b6002816002811115612f1457fe5b1415612f2b576001840154600c8301805490910190555b6040805184815260ff8816602082015281516001600160a01b0388169233928b927f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a20929181900390910190a4505060016000555050505050565b60105481565b6016546000908210612fd0576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b6018600060168481548110612fe157fe5b9060005260206000200154815260200190815260200160002060050160016008811061300957fe5b602091828204019190069054906101000a900460ff1660ff166001149050919050565b600060026000541415613074576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556001600160a01b0383166130bd576040805162461bcd60e51b815260206004820152600660248201526510ba37b5b2b760d11b604482015290519081900360640190fd5b6002546001600160a01b0384811691161415613120576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e546f57686974656c697374203d207374616b65546f6b656e000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff161561317c576040805162461bcd60e51b815260206004820152600b60248201526a1dda1a5d195b1a5cdd195960aa1b604482015290519081900360640190fd5b601454610190116131c6576040805162461bcd60e51b815260206004820152600f60248201526e1dda1a5d195b1a5cdd081b585e1959608a1b604482015290519081900360640190fd5b6131ce615bb8565b60016080820152604080516020810190915260008082526131fe918190819081908990829081908b908a90615196565b5050600c5460001901600160005592915050565b336000908152601b602052604081206002015461322f908361484c565b336000908152601b60205260408082206002908101939093556001600160a01b0386168252902001546132629083614c7a565b6001600160a01b0384166000908152601b6020908152604080832060020193909355338252601190522054613297908361484c565b33600090815260116020526040808220929092556001600160a01b038516815220546132c39083614c7a565b6001600160a01b038416600081815260116020908152604091829020939093558051858152905191923392600080516020615e148339815191529281900390910190a350600192915050565b60085481565b61331d615bb8565b6000828152601860205260408082208151610100810192839052926005909101916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411613345575094979650505050505050565b60055481565b600260005414156133ca576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000819055546133e7906001600160a01b0316333084615507565b6133f33382600061557e565b6ec097ce7bc90715b34b9f1000000000600f541115613447576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b60408051828152905133917f83b37e7ebc9b774fe613926f7f5dd4594c0f8d39e7ca0169a9f6810011f2b6f8919081900360200190a2506001600055565b600a5460ff16156134cb576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9a5d1a585b1a5e995960aa1b604482015290519081900360640190fd5b8a6001600160a01b03168c6001600160a01b03161415613532576040805162461bcd60e51b815260206004820152601960248201527f6465706f736974546f6b656e203d207374616b65546f6b656e00000000000000604482015290519081900360640190fd5b88518a5114613588576040805162461bcd60e51b815260206004820152601a60248201527f73756d6d6f6e657220213d2073756d6d6f6e6572536861726573000000000000604482015290519081900360640190fd5b858710156135c75760405162461bcd60e51b8152600401808060200182810382526024815260200180615e346024913960400191505060405180910390fd5b60005b8a5181101561360d576136058b82815181106135e257fe5b60200260200101518b83815181106135f657fe5b6020026020010151600061557e565b6001016135ca565b506ec097ce7bc90715b34b9f1000000000600d541115613662576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b038c166000818152601560205260408120805460ff191660019081179091556014805491820181559091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b031916909117905587156136e3576010805460010190556136e361dead8d8a615138565b600180546001600160a01b03808f166001600160a01b03199283161790925560028054928e169290911691909117905560038790556004869055600585905560068490556007839055600882905542600955805161374890600b906020840190615bd7565b5050600a805460ff191660011790555050505050505050505050565b6001546001600160a01b031681565b600c5481565b601260209081526000928352604080842090915290825290205481565b600260005414156137dc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155338152601c60209081526040808320546001600160a01b03168352601b909152902060010154613846576040805162461bcd60e51b81526020600482015260096024820152682164656c656761746560b81b604482015290519081900360640190fd5b6001600160a01b0381166000908152601b60205260409020600481015461389e576040805162461bcd60e51b8152602060048201526007602482015266085a985a5b195960ca1b604482015290519081900360640190fd5b60008160020154116138df576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6138ec8160030154612f8b565b6139275760405162461bcd60e51b8152600401808060200182810382526041815260200180615d936041913960600191505060405180910390fd5b611614826000836002015461494c565b6002600054141561397d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000908155818152601860205260409020600581015460ff16156139d6576040805162461bcd60e51b81526020600482015260096024820152681cdc1bdb9cdbdc995960ba1b604482015290519081900360640190fd5b60058101546301000000900460ff1615613a23576040805162461bcd60e51b815260206004820152600960248201526818d85b98d95b1b195960ba1b604482015290519081900360640190fd5b60018101546001600160a01b03163314613a70576040805162461bcd60e51b815260206004820152600960248201526810b83937b837b9b2b960b91b604482015290519081900360640190fd5b60058101805463ff00000019166301000000179055600181015460038201546009830154613ab09261deaf926001600160a01b039182169291169061583a565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506001600055565b60196020526000908152604090205460ff1681565b60026000541415613b4a576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055613b5881614c8c565b600060168281548110613b6757fe5b6000918252602080832091909101548083526018909152604090912060058101549192509065010000000000900460ff16600114613bd4576040805162461bcd60e51b8152602060048201526005602482015264216b69636b60d81b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613bf084614f58565b90508015613c745760058201805462ff000019166201000017905581546001600160a01b03166000908152601b602052604090206004810185905560018101546002820154613c3e91614c7a565b60028201556001810154600d54613c549161484c565b600d556001810154600e54613c6891614c7a565b600e5560006001909101555b81546001600160a01b039081166000908152601a60205260409020805460ff191690556002830154613ca691166150f1565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b60026000541415613d30576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b6002600055613d3e81614c8c565b600060168281548110613d4d57fe5b60009182526020808320919091015480835260189091526040909120600581015491925090670100000000000000900460ff16600114613dc0576040805162461bcd60e51b8152602060048201526009602482015268085cdd185b99185c9960ba1b604482015290519081900360640190fd5b60058101805461ff0019166101001790556000613ddc84614f58565b90506ec097ce7bc90715b34b9f1000000000613e158360070154613e0f8560060154600f54614c7a90919063ffffffff16565b90614c7a565b1115613e1f575060005b60048201546001600160a01b03166000908152600080516020615df4833981519152602052604090205460088301541115613e58575060005b60008260090154118015613e93575060038201546001600160a01b03166000908152600080516020615df48339815191526020526040902054155b8015613ea2575060c860105410155b15613eab575060005b8015613fcb5760058201805462ff0000191662010000179055815460068301546007840154613ee4926001600160a01b0316919061557e565b60038201546001600160a01b03166000908152600080516020615df48339815191526020526040902054158015613f1f575060008260090154115b15613f2e576010805460010190555b60038201546009830154613f539161deaf9161dead916001600160a01b03169061583a565b815460048301546008840154613f7b9261dead926001600160a01b039182169291169061583a565b60048201546001600160a01b03166000908152600080516020615df48339815191526020526040902054158015613fb6575060008260080154115b15613fc657601080546000190190555b613ff6565b600182015460038301546009840154613ff69261deaf926001600160a01b039182169291169061583a565b600282015461400d906001600160a01b03166150f1565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61deaf81565b60006002600054141561409f576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b60026000556ec097ce7bc90715b34b9f10000000006140be8989614c7a565b11156140ff576040805162461bcd60e51b815260206004820152600b60248201526a19dd5a5b19081b585e195960aa1b604482015290519081900360640190fd5b6001600160a01b03851660009081526015602052604090205460ff1661416c576040805162461bcd60e51b815260206004820152601960248201527f74726962757465546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03831660009081526015602052604090205460ff166141d9576040805162461bcd60e51b815260206004820152601960248201527f7061796d656e74546f6b656e20213d2077686974656c69737400000000000000604482015290519081900360640190fd5b6001600160a01b03891661dead148015906141ff57506001600160a01b03891661deaf14155b801561421657506001600160a01b03891661deed14155b614260576040805162461bcd60e51b81526020600482015260166024820152756170706c6963616e7420756e72657365727661626c6560501b604482015290519081900360640190fd5b6001600160a01b0389166000908152601b6020526040902060040154156142c1576040805162461bcd60e51b815260206004820152601060248201526f185c1c1b1a58d85b9d081a985a5b195960821b604482015290519081900360640190fd5b6000861180156142f457506001600160a01b0385166000908152600080516020615df48339815191526020526040902054155b156143425760c860105410614342576040805162461bcd60e51b815260206004820152600f60248201526e19dd5a5b1918985b9ac81b585e1959608a1b604482015290519081900360640190fd5b3415614473576001600160a01b03851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214801561437357508534145b6143b2576040805162461bcd60e51b815260206004820152600b60248201526a2165746842616c616e636560a81b604482015290519081900360640190fd5b60405160009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29034908381818185875af1925050503d8060008114614408576040519150601f19603f3d011682016040523d82523d6000602084013e61440d565b606091505b505090508061444e576040805162461bcd60e51b815260206004820152600860248201526708595d1a10d85b1b60c21b604482015290519081900360640190fd5b61446d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23034615850565b50614488565b6144886001600160a01b038616333089615507565b61449561deaf8688615138565b61449d615bb8565b600160e08201526040805160208101909152600081526144ce908b908b908b908b908b908b908b908b908a90615196565b5050600c5460001901600160005598975050505050505050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61dead81565b6000606060026000541415614550576040805162461bcd60e51b815260206004820152601f6024820152600080516020615dd4833981519152604482015290519081900360640190fd5b600260005561455e83614c8c565b60006016848154811061456d57fe5b6000918252602080832091909101548083526017825260408084206018909352909220600581015492935090916601000000000000900460ff166001146145e5576040805162461bcd60e51b815260206004820152600760248201526610b0b1ba34b7b760c91b604482015290519081900360640190fd5b60058101805461ff001916610100179055600061460187614f58565b82546001600160a01b031660009081526015602052604090205490915060ff168015614656575081546001600160a01b03166000908152600080516020615df483398151915260205260409020546008830154115b1561465f575060005b478260090154111561466f575060005b80156147eb5760058201805462ff00001916620100001790558154600983015460405185546000936060936001600160a01b03909116929091889190819083906002600019600183161561010002019091160480156147055780601f106146e3576101008083540402835291820191614705565b820191906000526020600020905b8154815290600101906020018083116146f1575b505091505060006040518083038185875af1925050503d8060008114614747576040519150601f19603f3d011682016040523d82523d6000602084013e61474c565b606091505b5085546001600160a01b0316600090815260156020526040902054919350915060ff16156147dc57835460088501546147949161dead916001600160a01b03909116906158a7565b83546001600160a01b03166000908152600080516020615df483398151915260205260409020541580156147cc575060008460080154115b156147dc57601080546000190190555b90965094506148409350505050565b6002820154614802906001600160a01b03166150f1565b6040805182151581529051859189917f225ab65268ea3d2f5b1ed97e7d032147f17bba561ef01b819bfe3832bc05b0339181900360200190a3505050505b60016000559092909150565b60008282111561485b57600080fd5b50900390565b600080821161486f57600080fd5b600082848161487a57fe5b04949350505050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548111156148e6576040805162461bcd60e51b81526020600482015260086024820152672162616c616e636560c01b604482015290519081900360640190fd5b6148fa6001600160a01b0383163383615850565b6149053383836158a7565b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b600f546001600160a01b0384166000908152601b6020526040902060018101548411156149aa576040805162461bcd60e51b81526020600482015260076024820152662173686172657360c81b604482015290519081900360640190fd5b82816002015410156149eb576040805162461bcd60e51b8152602060048201526005602482015264085b1bdbdd60da1b604482015290519081900360640190fd5b6149f88160030154612f8b565b614a335760405162461bcd60e51b8152600401808060200182810382526041815260200180615d936041913960600191505060405180910390fd5b6000614a3f8585614c7a565b6001600160a01b038716600090815260116020526040902054909150614a65908261484c565b6001600160a01b0387166000908152601160205260409020556001820154614a8d908661484c565b60018301556002820154614aa1908561484c565b6002830155600d54614ab3908661484c565b600d55600e54614ac3908561484c565b600e819055600d54614ad491614c7a565b600f5560005b601454811015614bff5761dead6000908152601360205260148054614b4291600080516020615df48339815191529184919086908110614b1657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548487615907565b90508015614bf65761dead60009081526013602052601480548392600080516020615df483398151915292909186908110614b7957fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b1682526013909252908120601480548493919086908110614bca57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614ada565b50604080518681526020810186905281516001600160a01b038916927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a26040805182815290516000916001600160a01b03891691600080516020615e148339815191529181900360200190a3505050505050565b60008282018381101561184957600080fd5b6016548110614cce576040805162461bcd60e51b8152602060048201526009602482015268085c1c9bdc1bdcd85b60ba1b604482015290519081900360640190fd5b614cd6615c55565b6018600060168481548110614ce757fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610100810193849052909260a085019260058501916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614d6e5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e820154815250509050614e21600754613e0f600654846101400151614c7a90919063ffffffff16565b614e296114b7565b1015614e65576040805162461bcd60e51b815260206004820152600660248201526521726561647960d01b604482015290519081900360640190fd5b60a08101516020015160ff1615614eaf576040805162461bcd60e51b81526020600482015260096024820152681c1c9bd8d95cdcd95960ba1b604482015290519081900360640190fd5b811580614f1057506018600060166001850381548110614ecb57fe5b90600052602060002001548152602001908152602001600020600501600160088110614ef357fe5b602091828204019190069054906101000a900460ff1660ff166001145b614f54576040805162461bcd60e51b815260206004820152601060248201526f1c1c9a5bdc88085c1c9bd8d95cdcd95960821b604482015290519081900360640190fd5b5050565b6000614f62615c55565b6018600060168581548110614f7357fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b03908116825260018301548116958201959095526002820154851681850152600382015485166060820152600482015490941660808501528251610100810193849052909260a085019260058501916008918390855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411614ffa5790505050505050815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e82015481525050905080610180015181610160015111156150a457600191505b6101a0810151600854600f546150b99161595b565b10156150c457600091505b80516001600160a01b03166000908152601b6020526040902060040154156150eb57600091505b50919050565b6001546004546151109161deaf9133916001600160a01b03169061583a565b6001546004546003546151359261deaf9285926001600160a01b03909216910361583a565b50565b6001600160a01b0392831660009081526013602090815260408083209490951682529283528381208054830190557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc47590925291902080549091019055565b61519e615c55565b604051806101e001604052808c6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b031681526020018481526020018b81526020018a8152602001878152602001898152602001600081526020016000815260200160008152602001600081526020018581525090508060a0015160066008811061524757fe5b602002015160ff166001141561527b57600c546000908152601760209081526040909120835161527992850190615bd7565b505b600c54600090815260186020908152604091829020835181546001600160a01b03199081166001600160a01b03928316178355928501516001830180548516918316919091179055928401516002820180548416918516919091179055606084015160038201805484169185169190911790556080840151600482018054909316931692909217905560a082015182919061531c9060058301906008615cd5565b5060c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01556101a082015181600d01556101c082015181600e0155905050601c6000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03168c6001600160a01b03167fa3d7bb2543375ecc932ca0aadf1a4017755f5e76f4d596cbe9353f635bfedebc8d8d8d8d8d8d8d8d8d600c54604051808b81526020018a8152602001898152602001886001600160a01b03168152602001878152602001866001600160a01b0316815260200185815260200184600860200280838360005b83811015615468578181015183820152602001615450565b5050505090500180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156154ae578181015183820152602001615496565b50505050905090810190601f1680156154db5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390a45050600c80546001019055505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052615561908590615982565b50505050565b6000818310156155775781611849565b5090919050565b6001600160a01b0383166000908152601b6020526040902054600160a01b900460ff166001141561561e576001600160a01b0383166000908152601b60205260409020600101546155cf9083614c7a565b6001600160a01b0384166000908152601b602052604090206001810191909155600201546155fd9082614c7a565b6001600160a01b0384166000908152601b6020526040902060020155615789565b6001600160a01b038084166000908152601c60209081526040808320549093168252601b9052205460ff600160a01b90910416600114156156a6576001600160a01b038084166000908152601c602090815260408083205490931680835283832080546001600160a01b03199081168317909155601b90925292909120805490911690911790555b6040805160c0810182526001600160a01b03851680825260016020808401919091528284018690526000918252601b9052919091206002015460608201906156ef908490614c7a565b81526000602080830182905260409283018290526001600160a01b03808816808452601b8352848420865181548886015160ff16600160a01b0260ff60a01b19929095166001600160a01b03199182161791909116939093178155868601516001820155606087015160028201556080870151600382015560a090960151600490960195909555601c909152919020805490911690911790555b60006157958383614c7a565b6001600160a01b0385166000908152601160205260409020549091506157bb9082614c7a565b6001600160a01b038516600090815260116020526040902055600d546157e19084614c7a565b600d55600e546157f19083614c7a565b600e819055600d5461580291614c7a565b600f556040805182815290516001600160a01b03861691600091600080516020615e148339815191529181900360200190a350505050565b6158458483836158a7565b615561838383615138565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526158a2908490615982565b505050565b6001600160a01b039283166000908152601360209081526040808320949095168252928352838120805483900390557ff70de54536712c8ff8e72cff9589e58e41f45f6aceb543b6c431cd10034dc4759092529190208054919091039055565b60008161591357600080fd5b8361592057506000611849565b8383028385828161592d57fe5b0414156159465782818161593d57fe5b04915050611849565b8383868161595057fe5b040295945050505050565b60008261596a57506000611423565b8282028284828161597757fe5b041461184957600080fd5b615994826001600160a01b0316615b3a565b6159e5576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a235780518252601f199092019160209182019101615a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a85576040519150601f19603f3d011682016040523d82523d6000602084013e615a8a565b606091505b509150915081615ae1576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561556157808060200190516020811015615afd57600080fd5b50516155615760405162461bcd60e51b815260040180806020018281038252602a815260200180615e58602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615b6e57508115155b949350505050565b6040518060c0016040528060006001600160a01b03168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b6040518061010001604052806008906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c1857805160ff1916838001178555615c45565b82800160010185558215615c45579182015b82811115615c45578251825591602001919060010190615c2a565b50615c51929150615d64565b5090565b604080516101e08101825260008082526020820181905291810182905260608101829052608081019190915260a08101615c8d615bb8565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b600183019183908215615d585791602002820160005b83821115615d2957835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302615ceb565b8015615d565782816101000a81549060ff0219169055600101602081600001049283019260010302615d29565b505b50615c51929150615d79565b5b80821115615c515760008155600101615d65565b5b80821115615c5157805460ff19168155600101615d7a56fe21726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f746564205945532070726f6365737365735265656e7472616e637947756172643a207265656e7472616e742063616c6c002264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271cddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f70726f63657373696e67526577617264203e205f70726f706f73616c4465706f7369745361666545524332303a206572633230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b14b1d4cca6b0621f70db6cfef7d4a327f8c525cf12a7d41ad8ce20b063cf00764736f6c634300060c0033

Deployed Bytecode Sourcemap

3163:40003:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6020:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6020:45:0;;:::i;:::-;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3719:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37090:334;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37090:334:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4795:18;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36952:126;;;;;;;;;;;;;:::i;6191:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6191:41:0;-1:-1:-1;;;;;6191:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;6191:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41001:277;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41001:277:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;33096:128;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33096:128:0;;;;;;;;:::i;:::-;;30523:210;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30523:210:0;;;;;;;:::i;5333:26::-;;;;;;;;;;;;;:::i;5838:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5838:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;5838:31:0;;;;;;;;;;;;;;42581:582;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42581:582:0;;;;;;;;;;;;;;;;;:::i;35395:849::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35395:849:0;-1:-1:-1;;;;;35395:849:0;;:::i;5083:47::-;;;;;;;;;;;;;:::i;4753:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27864:935;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27864:935:0;;:::i;5201:26::-;;;;;;;;;;;;;:::i;5935:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5935:30:0;;:::i;6132:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6132:46:0;-1:-1:-1;;;;;6132:46:0;;:::i;6239:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6239:61:0;-1:-1:-1;;;;;6239:61:0;;:::i;33232:512::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33232:512:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33232:512:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33232:512:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33232:512:0;;;;;;;;;;;;-1:-1:-1;33232:512:0;-1:-1:-1;33232:512:0;;;;:::i;3427:25::-;;;;;;;;;;;;;:::i;34087:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34087:644:0;-1:-1:-1;;;;;34087:644:0;;:::i;5269:24::-;;;;;;;;;;;;;:::i;4011:32::-;;;;;;;;;;;;;:::i;15515:618::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15515:618:0;;;;;;;;:::i;5525:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5525:44:0;-1:-1:-1;;;;;5525:44:0;;:::i;37819:146::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37819:146:0;;;;;;;;;;:::i;5876:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5876:46:0;-1:-1:-1;;;;;5876:46:0;;:::i;37707:104::-;;;;;;;;;;;;;:::i;37583:112::-;;;;;;;;;;;;;:::i;41286:410::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41286:410:0;;:::i;4216:28::-;;;;;;;;;;;;;:::i;5972:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5972:40:0;;:::i;3938:33::-;;;;;;;;;;;;;:::i;3651:30::-;;;;;;;;;;;;;:::i;14486:1021::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14486:1021:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14486:1021:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14486:1021:0;;;;;;;;;;-1:-1:-1;14486:1021:0;;-1:-1:-1;14486:1021:0;-1:-1:-1;14486:1021:0;:::i;36586:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36586:169:0;;:::i;4840:37::-;;;;;;;;;;;;;:::i;18374:2134::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18374:2134:0;;:::i;20569:1803::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20569:1803:0;;;;;;;;;:::i;5429:35::-;;;;;;;;;;;;;:::i;36341:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36341:237:0;;:::i;16145:735::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16145:735:0;;;;;;;;:::i;42079:490::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42079:490:0;;;;;;;;:::i;4083:28::-;;;;;;;;;;;;;:::i;37432:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37432:139:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3840:29;;;;;;;;;;;;;:::i;41708:363::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41708:363:0;;:::i;10683:1701::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10683:1701:0;;;;;;;;-1:-1:-1;10683:1701:0;;-1:-1:-1;;;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10683:1701:0;;;;;;;;;;;;;;;-1:-1:-1;10683:1701:0;;;;;-1:-1:-1;10683:1701:0;;;;;-1:-1:-1;10683:1701:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10683:1701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10683:1701:0;;-1:-1:-1;10683:1701:0;;-1:-1:-1;;;;;10683:1701:0:i;3340:27::-;;;;;;;;;;;;;:::i;5137:28::-;;;;;;;;;;;;;:::i;5600:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5600:64:0;;;;;;;;;;:::i;32610:474::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32610:474:0;-1:-1:-1;;;;;32610:474:0;;:::i;34853:534::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34853:534:0;;:::i;6074:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6074:51:0;-1:-1:-1;;;;;6074:51:0;;:::i;26798:1054::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26798:1054:0;;:::i;22380:2600::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22380:2600:0;;:::i;5028:48::-;;;;;;;;;;;;;:::i;12468:2005::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12468:2005:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3518:73::-;;;;;;;;;;;;;:::i;4974:47::-;;;;;;;;;;;;;:::i;24993:1797::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24993:1797:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6020:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6020:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3719:31::-;;;;:::o;37090:334::-;-1:-1:-1;;;;;37215:22:0;;37190:4;37215:22;;;:7;:22;;;;;:29;-1:-1:-1;;;37215:29:0;;;;37248:1;37215:34;37207:54;;;;;-1:-1:-1;;;37207:54:0;;;;;;;;;;;;-1:-1:-1;;;37207:54:0;;;;;;;;;;;;;;;37296:13;:20;37280:36;;37272:58;;;;;-1:-1:-1;;;37272:58:0;;;;;;;;;;;;-1:-1:-1;;;37272:58:0;;;;;;;;;;;;;;;37348:9;:39;37358:13;37372;37358:28;;;;;;;;;;;;;;;;;;;;37348:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;37348:68:0;;;;:53;;:68;;;;;;;;;-1:-1:-1;37090:334:0;;;;;:::o;4795:18::-;;;;;;;;;;;;;;;-1:-1:-1;;4795:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36952:126::-;37001:7;37028:42;37055:14;;37028:22;37036:13;;37028:3;:7;;:22;;;;:::i;:::-;:26;;:42::i;:::-;37021:49;;36952:126;:::o;6191:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6191:41:0;;;-1:-1:-1;;;6191:41:0;;;;;;;;:::o;41001:277::-;41069:4;41094:11;;;:50;;-1:-1:-1;41119:10:0;41109:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;41109:30:0;;;;;;;;;;:35;41094:50;41086:59;;;;;;41166:10;41156:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;41156:30:0;;;;;;;;;;;;:39;;;41211:37;;;;;;;41156:30;;41166:10;41211:37;;;;;;;;;;;-1:-1:-1;41266:4:0;41001:277;;;;:::o;33096:128::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;33185:31:::1;33202:5:::0;33209:6;33185:16:::1;:31::i;:::-;-1:-1:-1::0;;2820:1:0;3126:7;:22;33096:128::o;30523:210::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;30632:10:::1;30624:19:::0;;:7:::1;:19;::::0;;;;:26;-1:-1:-1;;;30624:26:0;::::1;;;30654:1;30624:31;30616:51;;;::::0;;-1:-1:-1;;;30616:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30616:51:0;;;;;;;;;;;;;::::1;;30678:47;30688:10;30700:12;30714:10;30678:9;:47::i;5333:26::-:0;;;;:::o;5838:31::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5838:31:0;;-1:-1:-1;5838:31:0;:::o;42581:582::-;-1:-1:-1;;;;;42729:17:0;;42680:4;42729:17;;;:9;:17;;;;;;;;42747:10;42729:29;;;;;;;;:49;;42763:14;42729:33;:49::i;:::-;-1:-1:-1;;;;;42697:17:0;;;;;;:9;:17;;;;;;;;42715:10;42697:29;;;;;;;:81;;;;42812:15;;;:7;:15;;;;:20;;;:40;;42837:14;42812:24;:40::i;:::-;-1:-1:-1;;;;;42789:15:0;;;;;;;:7;:15;;;;;;:20;;;;:63;;;;42889:18;;;;;;:23;;:43;;42917:14;42889:27;:43::i;:::-;-1:-1:-1;;;;;42863:18:0;;;;;;;:7;:18;;;;;;;;:23;;:69;;;;42963:17;;;;;:9;:17;;;;;:37;;42985:14;42963:21;:37::i;:::-;-1:-1:-1;;;;;42943:17:0;;;;;;;:9;:17;;;;;;:57;;;;43034:20;;;;;;;:40;;43059:14;43034:24;:40::i;:::-;-1:-1:-1;;;;;43011:20:0;;;;;;;:9;:20;;;;;;;;;:63;;;;43090:43;;;;;;;43011:20;;43090:43;;;;-1:-1:-1;;;;;;;;;;;43090:43:0;;;;;;;;-1:-1:-1;43151:4:0;42581:582;;;;;;:::o;35395:849::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;35495:10:::1;35487:19:::0;;:7:::1;:19;::::0;;;;:26:::1;;::::0;35479:55:::1;;;::::0;;-1:-1:-1;;;35479:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35479:55:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35553:28:0;::::1;35545:59;;;::::0;;-1:-1:-1;;;35545:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35545:59:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35707:28:0;::::1;35725:10;35707:28;35703:233;;-1:-1:-1::0;;;;;35760:23:0;::::1;;::::0;;;:7:::1;:23;::::0;;;;:30;-1:-1:-1;;;35760:30:0;::::1;;;:35:::0;35752:66:::1;;;::::0;;-1:-1:-1;;;35752:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35752:66:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35849:42:0;;::::1;35841:51;35849:42:::0;;;:26:::1;:42;::::0;;;;;;;;;;::::1;35841:51:::0;;:7:::1;:51:::0;;;:58;-1:-1:-1;;;35841:58:0;::::1;;;:63:::0;35833:91:::1;;;::::0;;-1:-1:-1;;;35833:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35833:91:0;;;;;;;;;;;;;::::1;;35980:10;35948:21;35972:19:::0;;;:7:::1;:19;::::0;;;;;;;36029:18;;-1:-1:-1;;;;;36029:18:0;;::::1;36002:46:::0;;:26:::1;:46:::0;;;;;:59;;-1:-1:-1;;;;;;36002:59:0;;::::1;::::0;;;36072:42;;::::1;::::0;;;;;;;:55;;;::::1;::::0;::::1;::::0;;36138:35;;::::1;::::0;::::1;::::0;;36191:45;;;;;;;35972:19;;35980:10;36191:45:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2820:1:0;3126:7;:22;35395:849::o;5083:47::-;5123:6;5083:47;:::o;4753:35::-;4786:2;4753:35;:::o;27864:935::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;27954:45:::1;27985:13:::0;27954:30:::1;:45::i;:::-;28010:18;28031:13;28045;28031:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;28098:21;;;:9:::1;:21:::0;;;;;;;28138:14:::1;::::0;::::1;:17:::0;28031:28;;-1:-1:-1;28098:21:0;-1:-1:-1;;;28138:17:0;::::1;;;28159:1;28138:22;28130:45;;;::::0;;-1:-1:-1;;;28130:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28130:45:0;;;;;;;;;;;;;::::1;;28186:14;::::0;::::1;:21:::0;;-1:-1:-1;;28186:21:0::1;;;::::0;;:17;28248:23:::1;28257:13:::0;28248:8:::1;:23::i;:::-;28286:14;:21:::0;28233:38;;-1:-1:-1;4555:3:0::1;-1:-1:-1::0;28282:98:0::1;;-1:-1:-1::0;28363:5:0::1;28282:98;28396:7;28392:197;;;28420:14;::::0;::::1;:21:::0;;-1:-1:-1;;28420:21:0::1;::::0;::::1;::::0;;28490::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28490:21:0;;::::1;28420:17:::0;28467:46;;;:14:::1;28420:17;28467:46:::0;;;;:53;;-1:-1:-1;;28467:53:0::1;28440:1;28467:53:::0;;::::1;::::0;;;28555:21;;28535:14:::1;:42:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;28555:21;;;::::1;-1:-1:-1::0;;;;;;28535:42:0;;::::1;::::0;;;::::1;::::0;;28392:197:::1;28629:21;::::0;::::1;::::0;-1:-1:-1;;;;;28629:21:0;;::::1;28655:5;28601:51:::0;;;:19:::1;:51;::::0;;;;:59;;-1:-1:-1;;28601:59:0::1;::::0;;28688:16:::1;::::0;::::1;::::0;28673:32:::1;::::0;28688:16:::1;28673:14;:32::i;:::-;28731:60;::::0;;;::::1;;::::0;;;;28771:10;;28756:13;;28731:60:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;;27864:935:0:o;5201:26::-;;;;:::o;5935:30::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5935:30:0;:::o;6132:46::-;;;;;;;;;;;;;;;:::o;6239:61::-;;;;;;;;;;;;-1:-1:-1;;;;;6239:61:0;;:::o;33232:512::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;33364:31;;::::1;33356:61;;;::::0;;-1:-1:-1;;;33356:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33356:61:0;;;;;;;;;;;;;::::1;;33433:9;33428:309;33446:17:::0;;::::1;33428:309;;;33485:22;33510:7;;33518:1;33510:10;;;;;;;;;;;;;33485:35;;33539:3;33535:133;;;33630:10;33612:29;::::0;;;:17:::1;:29;::::0;;;;;33642:6;;33649:1;33642:9;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33642:9:0::1;-1:-1:-1::0;;;;;33612:40:0::1;-1:-1:-1::0;;;;;33612:40:0::1;;;;;;;;;;;;;33595:57;;33535:133;33682:43;33699:6;;33706:1;33699:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;33699:9:0::1;33710:14;33682:16;:43::i;:::-;-1:-1:-1::0;33465:3:0::1;;33428:309;;;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;;;;33232:512:0:o;3427:25::-;;;-1:-1:-1;;;;;3427:25:0;;:::o;34087:644::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;10618:10:::1;10591:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10591:38:0::1;10583:47:::0;;:7:::1;:47:::0;;;;;10591:38;10583:54:::1;::::0;10575:80:::1;;;::::0;;-1:-1:-1;;;10575:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10575:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34240:31:0;::::2;34171:23;34240:31:::0;;;:24;::::2;:31:::0;;;:24;:31;;;;34197:38;;-1:-1:-1;;;34197:38:0;;34229:4:::2;34197:38;::::0;::::2;::::0;;;34171:23;;34197:75:::2;::::0;34240:31;;;;34197:23:::2;::::0;:38;;;;;34240:24;34197:38;;;;;34240:31;34197:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34197:38:0;;:42:::2;:75::i;:::-;34171:101;;34394:1;34376:15;:19;34368:39;;;::::0;;-1:-1:-1;;;34368:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34368:39:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34426:21:0;::::2;;::::0;;;:14:::2;:21;::::0;;;;;::::2;;34418:46;;;::::0;;-1:-1:-1;;;34418:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34418:46:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;34489:31:0;::::2;:24;:31:::0;;;-1:-1:-1;;;;;;;;;;;34489:24:0::2;:31:::0;:24;:31;;;:36;:88;::::2;;;;4650:3;34529:20;;:48;34489:88;34485:122;;;34580:20;:25:::0;;34604:1:::2;34580:25;::::0;;34485:122:::2;34617:49;5014:6;34643:5;34650:15;34617:18;:49::i;:::-;34684:39;::::0;;;;;;;-1:-1:-1;;;;;34684:39:0;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;-1:-1:-1::0;;2820:1:0;3126:7;:22;34087:644::o;5269:24::-;;;;:::o;4011:32::-;;;;:::o;15515:618::-;15618:18;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;15649:20:::1;;:::i;:::-;-1:-1:-1::0;;;;;;15672:21:0;;::::1;;::::0;;;:7:::1;:21;::::0;;;;;;;;15649:44;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;15649:44:0;;::::1;;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;15712:17;;;:36:::1;;;15747:1;15733:6;:11;;;:15;15712:36;15704:61;;;::::0;;-1:-1:-1;;;15704:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15704:61:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;15784:21:0;::::1;;::::0;;;:7:::1;:21;::::0;;;;:28:::1;;::::0;:33;15776:52:::1;;;::::0;;-1:-1:-1;;;15776:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;15776:52:0;;;;;;;;;;;;;::::1;;15839:21;;:::i;:::-;15968:1;15957:8:::0;;::::1;:12:::0;15995:85:::1;::::0;;15957:8:::1;15995:85:::0;::::1;::::0;;;16025:1:::1;15995:85:::0;;;::::1;::::0;16011:12;;16025:1;;;;;;;;;;;16061:7;;15957:5;;15995:15:::1;:85::i;:::-;-1:-1:-1::0;;16108:13:0::1;::::0;16124:1:::1;3126:7:::0;:22;-1:-1:-1;;16108:17:0;;15515:618;-1:-1:-1;;;15515:618:0:o;5525:44::-;;;;;;;;;;;;;:::o;37819:146::-;-1:-1:-1;;;;;37927:23:0;;;37900:7;37927:23;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;;37819:146::o;5876:46::-;;;;;;;;;;;;;;;:::o;37707:104::-;37782:14;:21;37707:104;:::o;37583:112::-;37667:13;:20;37583:112;:::o;41286:410::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;41407:10:::1;41399:19:::0;;:7:::1;:19;::::0;;;;:26:::1;;::::0;:44:::1;::::0;41430:12;41399:30:::1;:44::i;:::-;41378:10;41370:19;::::0;;;:7:::1;:19;::::0;;;;:26:::1;::::0;::::1;:73:::0;;;;41481:24:::1;;::::0;:42:::1;::::0;41510:12;41481:28:::1;:42::i;:::-;41462:10;41454:19;::::0;;;:7:::1;:19;::::0;;;;:24:::1;;:69:::0;41548:11:::1;::::0;:29:::1;::::0;41564:12;41548:15:::1;:29::i;:::-;41534:11;:43:::0;41600:9:::1;::::0;:27:::1;::::0;41614:12;41600:13:::1;:27::i;:::-;41588:9;:39:::0;41643:45:::1;::::0;;;;;;;41663:10:::1;::::0;41643:45:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;2820:1:0;3126:7;:22;41286:410::o;4216:28::-;;;;:::o;5972:40::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5972:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3938:33;;;;:::o;3651:30::-;;;;:::o;14486:1021::-;15153:18;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;15184:21:::1;;:::i;:::-;15313:1;15302:8:::0;;::::1;:12:::0;15345:109:::1;::::0;;15302:8:::1;15345:109;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;15361:8;;15371:1:::1;::::0;;;15377:11;;15371:1;;15402:17;;15371:1;;15433:7;;15302:5;;15345:109;15449:4;;;;;;15345:109;::::1;15449:4:::0;;;;15345:109;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;15345:15:0::1;::::0;-1:-1:-1;;;15345:109:0:i:1;:::-;-1:-1:-1::0;;15482:13:0::1;::::0;-1:-1:-1;;15482:17:0;2820:1;3126:7;:22;14486:1021;;-1:-1:-1;;;;;;14486:1021:0:o;36586:169::-;36663:4;36709:38;36728:18;;36709:14;:18;;:38;;;;:::i;:::-;36687:18;:16;:18::i;:::-;:60;;;36586:169;-1:-1:-1;;36586:169:0:o;4840:37::-;;;;;;;;;;;;;;-1:-1:-1;;;4840:37:0;;;;:::o;18374:2134::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;10618:10:::1;10591:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10591:38:0::1;10583:47:::0;;:7:::1;:47:::0;;;;;10591:38;10583:54:::1;::::0;10575:80:::1;;;::::0;;-1:-1:-1;;;10575:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10575:80:0;;;;;;;;;;;;;::::1;;18633:15:::2;::::0;18575:12:::2;::::0;18568:81:::2;::::0;-1:-1:-1;;;;;18575:12:0;;::::2;::::0;18606:10:::2;::::0;18626:4:::2;::::0;18568:37:::2;:81::i;:::-;18687:12;::::0;18701:15:::2;::::0;18660:57:::2;::::0;5069:6:::2;::::0;-1:-1:-1;;;;;18687:12:0;;::::2;::::0;18660:18:::2;:57::i;:::-;18728:25;18756:21:::0;;;:9:::2;:21;::::0;;;;18796:17:::2;::::0;::::2;::::0;-1:-1:-1;;;;;18796:17:0::2;18788:53;;;::::0;;-1:-1:-1;;;18788:53:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18788:53:0;;;;;;;;;;;;;::::2;;18860:14;::::0;::::2;:17:::0;::::2;;:22:::0;18852:44:::2;;;::::0;;-1:-1:-1;;;18852:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18852:44:0;;;;;;;;;;;;;::::2;;18915:14;::::0;::::2;:17:::0;;;::::2;;;:22:::0;18907:44:::2;;;::::0;;-1:-1:-1;;;18907:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18907:44:0;;;;;;;;;;;;;::::2;;18978:18:::0;;-1:-1:-1;;;;;18978:18:0::2;18970:27;::::0;;;:7:::2;:27;::::0;;;;:34:::2;;::::0;:39;18962:68:::2;;;::::0;;-1:-1:-1;;;18962:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18962:68:0;;;;;;;;;;;;;::::2;;19073:1;19047:8;:23;;;:27;:83;;;;-1:-1:-1::0;19103:21:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;19103:21:0::2;19078:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;19078:24:0::2;:47:::0;:24;:47;;;:52;19047:83:::2;19043:192;;;4650:3;19155:20;;:48;19147:76;;;::::0;;-1:-1:-1;;;19147:76:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19147:76:0;;;;;;;;;;;;;::::2;;19282:14;::::0;::::2;:17:::0;-1:-1:-1;;;19282:17:0;::::2;;;19303:1;19282:22;19278:601;;;19353:21;::::0;::::2;::::0;-1:-1:-1;;;;;19353:21:0::2;19330:46;::::0;;;:14:::2;:46;::::0;;;;;::::2;;19329:47;19321:71;;;::::0;;-1:-1:-1;;;19321:71:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19321:71:0;;;;;;;;;;;;;::::2;;19444:21;::::0;::::2;::::0;-1:-1:-1;;;;;19444:21:0::2;19416:51;::::0;;;:19:::2;:51;::::0;;;;;::::2;;19415:52;19407:83;;;::::0;;-1:-1:-1;;;19407:83:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19407:83:0;;;;;;;;;;;;;::::2;;19513:14;:21:::0;4555:3:::2;-1:-1:-1::0;19505:77:0::2;;;::::0;;-1:-1:-1;;;19505:77:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19505:77:0;;;;;;;;;;;;;::::2;;19625:21;::::0;::::2;::::0;-1:-1:-1;;;;;19625:21:0::2;19597:51;::::0;;;:19:::2;:51;::::0;;;;:58;;-1:-1:-1;;19597:58:0::2;19651:4;19597:58;::::0;;19278:601:::2;;;19711:14;::::0;::::2;:17:::0;;;::::2;;;19732:1;19711:22;19707:172;;;19774:18:::0;;-1:-1:-1;;;;;19774:18:0::2;19759:34;::::0;;;:14:::2;:34;::::0;;;;;::::2;;19758:35;19750:61;;;::::0;;-1:-1:-1;;;19750:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19750:61:0;;;;;;;;;;;;;::::2;;19841:18:::0;;-1:-1:-1;;;;;19841:18:0::2;19826:34;::::0;;;:14:::2;:34;::::0;;;;:41;;-1:-1:-1;;19826:41:0::2;19863:4;19826:41;::::0;;19707:172:::2;19939:22;19964:159;19982:18;:16;:18::i;:::-;20015:13;:20:::0;:25;:97:::2;;20057:13;20071:20:::0;;20047:9:::2;::::0;:50:::2;::::0;-1:-1:-1;;20071:24:0;;;20057:39;::::2;;;;;;;;;;;;;20047:50;;;;;;;;;;;:65;;;20015:97;;;20043:1;20015:97;19964:3;:159::i;:::-;20126:1;19964:163:::0;;::::2;20140:23;::::0;::::2;:40:::0;;;20237:10:::2;20210:38;::::0;;;:26:::2;:38;::::0;;;;;;;;20191:16:::2;::::0;::::2;:57:::0;;-1:-1:-1;;;;;;20191:57:0::2;-1:-1:-1::0;;;;;20210:38:0;;::::2;20191:57;::::0;;20259:14:::2;::::0;::::2;:21:::0;;-1:-1:-1;;20259:21:0::2;::::0;::::2;::::0;;20345:13:::2;:30:::0;;;;::::2;::::0;;;;;;;;;::::2;::::0;;;20429:16;;20459:20;;20401:99;;;;;-1:-1:-1;;20459:24:0;;;20401:99;;::::2;::::0;;;;;;;;;;;19964:163;;-1:-1:-1;20429:16:0;::::2;::::0;20237:10;;20401:99:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;18374:2134:0:o;20569:1803::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;10618:10:::1;10591:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10591:38:0::1;10583:47:::0;;:7:::1;:47:::0;;;;;10591:38;10583:54:::1;::::0;10575:80:::1;;;::::0;;-1:-1:-1;;;10575:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10575:80:0;;;;;;;;;;;;;::::1;;20725:10:::2;20674:21;20698:38:::0;;;:26:::2;:38;::::0;;;;;;;;-1:-1:-1;;;;;20698:38:0::2;20771:22:::0;;;:7:::2;:22:::0;;;;;;20828:13:::2;:20:::0;20812:36;::::2;20804:58;;;::::0;;-1:-1:-1;;;20804:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20804:58:0;;;;;;;;;;;;;::::2;;20873:18;20894:13;20908;20894:28;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;20961:21;;;:9:::2;:21:::0;;;;;;;20894:28;;-1:-1:-1;21012:1:0::2;21001:12;::::0;::::2;;20993:27;;;::::0;;-1:-1:-1;;;20993:27:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20993:27:0;;;;;;;;;;;;;::::2;;21031:9;21048:8;21043:14;;;;;;;;;;21031:26;;21098:8;:23;;;21076:18;:16;:18::i;:::-;:45;;21068:65;;;::::0;;-1:-1:-1;;;21068:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21068:65:0;;;;;;;;;;;;;::::2;;21153:47;21176:8;:23;;;21153:22;:47::i;:::-;21152:48;21144:68;;;::::0;;-1:-1:-1;;;21144:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21144:68:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21231:37:0;::::2;21272:9;21231:37:::0;;;:22:::2;::::0;::::2;:37;::::0;;;;;::::2;;:50;::::0;::::2;;;;;;;21223:68;;;::::0;;-1:-1:-1;;;21223:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21223:68:0;;;;;;;;;;;;;::::2;;21318:8;21310:4;:16;;;;;;;;;:35;;;-1:-1:-1::0;21338:7:0::2;21330:4;:15;;;;;;;;;21310:35;21302:56;;;::::0;;-1:-1:-1;;;21302:56:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21302:56:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21369:37:0;::::2;;::::0;;;:22:::2;::::0;::::2;:37;::::0;;;;:44;;21409:4;;21369:37;-1:-1:-1;;21369:44:0::2;::::0;21409:4;21369:44:::2;::::0;::::2;;;;;;;;::::0;;-1:-1:-1;21438:8:0::2;21430:4;:16;;;;;;;;;21426:681;;;21484:13;::::0;::::2;::::0;21463:17:::2;::::0;::::2;:34:::0;;;;::::2;::::0;;21629:26:::2;::::0;::::2;::::0;21613:42;::::2;21609:125;;;21676:26;::::0;::::2;:42:::0;;;21609:125:::2;21878:8;:39;;;21864:11;;:53;21860:147;;;21980:11;::::0;21938:39:::2;::::0;::::2;:53:::0;21860:147:::2;21426:681;;;22038:7;22030:4;:15;;;;;;;;;22026:81;;;22082:13;::::0;::::2;::::0;22062:16:::2;::::0;::::2;:33:::0;;;;::::2;::::0;;22026:81:::2;22290:74;::::0;;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;;-1:-1:-1;;;;;22290:74:0;::::2;::::0;22328:10:::2;::::0;22313:13;;22290:74:::2;::::0;;;;;;;;;::::2;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;;;;;20569:1803:0:o;5429:35::-;;;;:::o;36341:237::-;36459:13;:20;36412:4;;36437:42;;36429:64;;;;;-1:-1:-1;;;36429:64:0;;;;;;;;;;;;-1:-1:-1;;;36429:64:0;;;;;;;;;;;;;;;36511:9;:45;36521:13;36535:19;36521:34;;;;;;;;;;;;;;;;36511:45;;;;;;;;;;;:51;;36563:1;36511:54;;;;;;;;;;;;;;;;;;;;;;;;;:59;;36569:1;36511:59;36504:66;;36341:237;;;:::o;16145:735::-;16252:18;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;-1:-1:-1;;;;;16291:30:0;::::1;16283:49;;;::::0;;-1:-1:-1;;;16283:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16283:49:0;;;;;;;;;;;;;::::1;;16371:10;::::0;-1:-1:-1;;;;;16351:30:0;;::::1;16371:10:::0;::::1;16351:30;;16343:72;;;::::0;;-1:-1:-1;;;16343:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;16435:32:0;::::1;;::::0;;;:14:::1;:32;::::0;;;;;::::1;;16434:33;16426:57;;;::::0;;-1:-1:-1;;;16426:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16426:57:0;;;;;;;;;;;;;::::1;;16502:14;:21:::0;4555:3:::1;-1:-1:-1::0;16494:77:0::1;;;::::0;;-1:-1:-1;;;16494:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16494:77:0;;;;;;;;;;;;;::::1;;16582:21;;:::i;:::-;16711:1;16700:8:::0;;::::1;:12:::0;16738:89:::1;::::0;;16700:8:::1;16738:89:::0;::::1;::::0;;;16762:1:::1;16738:89:::0;;;::::1;::::0;16762:1;;;;;;16775:16;;16762:1;;;;16808:7;;16700:5;;16738:15:::1;:89::i;:::-;-1:-1:-1::0;;16855:13:0::1;::::0;-1:-1:-1;;16855:17:0;2820:1;3126:7;:22;16145:735;;-1:-1:-1;;16145:735:0:o;42079:490::-;42210:10;42158:4;42202:19;;;:7;:19;;;;;:24;;;:44;;42231:14;42202:28;:44::i;:::-;42183:10;42175:19;;;;:7;:19;;;;;;:24;;;;:71;;;;-1:-1:-1;;;;;42283:18:0;;;;;;:23;;:43;;42311:14;42283:27;:43::i;:::-;-1:-1:-1;;;;;42257:18:0;;;;;;:7;:18;;;;;;;;:23;;:69;;;;42371:10;42361:21;;:9;:21;;;;:41;;42387:14;42361:25;:41::i;:::-;42347:10;42337:21;;;;:9;:21;;;;;;:65;;;;-1:-1:-1;;;;;42436:20:0;;;;;;:40;;42461:14;42436:24;:40::i;:::-;-1:-1:-1;;;;;42413:20:0;;;;;;:9;:20;;;;;;;;;:63;;;;42492:47;;;;;;;42413:20;;42501:10;;-1:-1:-1;;;;;;;;;;;42492:47:0;;;;;;;;;-1:-1:-1;42557:4:0;42079:490;;;;:::o;4083:28::-;;;;:::o;37432:139::-;37501:15;;:::i;:::-;37536:21;;;;:9;:21;;;;;;37529:34;;;;;;;;;;37536:27;;;;;37529:34;;37536:27;;37529:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37529:34:0;;37432:139;-1:-1:-1;;;;;;;37432:139:0:o;3840:29::-;;;;:::o;41708:363::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;41793:10;41786:70:::1;::::0;-1:-1:-1;;;;;41793:10:0::1;41822;41842:4;41849:6:::0;41786:35:::1;:70::i;:::-;41911:32;41921:10;41933:6;41941:1;41911:9;:32::i;:::-;4452:6;41962:11;;:30;;41954:54;;;::::0;;-1:-1:-1;;;41954:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41954:54:0;;;;;;;;;;;;;::::1;;42024:39;::::0;;;;;;;42044:10:::1;::::0;42024:39:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;2820:1:0;3126:7;:22;41708:363::o;10683:1701::-;11158:11;;;;11157:12;11149:36;;;;;-1:-1:-1;;;11149:36:0;;;;;;;;;;;;-1:-1:-1;;;11149:36:0;;;;;;;;;;;;;;;11221:11;-1:-1:-1;;;;;11204:28:0;:13;-1:-1:-1;;;;;11204:28:0;;;11196:66;;;;;-1:-1:-1;;;11196:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11301:15;:22;11281:9;:16;:42;11273:81;;;;;-1:-1:-1;;;11273:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11393:17;11373:16;:37;;11365:86;;;;-1:-1:-1;;;11365:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11477:9;11472:120;11496:9;:16;11492:1;:20;11472:120;;;11534:46;11544:9;11554:1;11544:12;;;;;;;;;;;;;;11558:15;11574:1;11558:18;;;;;;;;;;;;;;11578:1;11534:9;:46::i;:::-;11514:3;;11472:120;;;;4452:6;11620:11;;:30;;11612:54;;;;;-1:-1:-1;;;11612:54:0;;;;;;;;;;;;-1:-1:-1;;;11612:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11677:29:0;;;;;;:14;:29;;;;;:36;;-1:-1:-1;;11677:36:0;11709:4;11677:36;;;;;;11724:14;:34;;;;;;;;;;;;;;-1:-1:-1;;;;;;11724:34:0;;;;;;11783:20;;11779:151;;11820:20;:25;;11844:1;11820:25;;;11860:58;5014:6;11886:13;11901:16;11860:18;:58::i;:::-;11950:12;:28;;-1:-1:-1;;;;;11950:28:0;;;-1:-1:-1;;;;;;11950:28:0;;;;;;;11989:10;:24;;;;;;;;;;;;;;;12024:15;:34;;;12069:16;:36;;;12116:14;:32;;;12159:18;:40;;;12210:17;:38;;;12259:13;:30;;;12316:3;12300:13;:19;12330:17;;;;:4;;:17;;;;;:::i;:::-;-1:-1:-1;;12358:11:0;:18;;-1:-1:-1;;12358:18:0;12372:4;12358:18;;;-1:-1:-1;;;;;;;;;;;10683:1701:0:o;3340:27::-;;;-1:-1:-1;;;;;3340:27:0;;:::o;5137:28::-;;;;:::o;5600:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;32610:474::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;10618:10:::1;10591:38:::0;;:26:::1;:38;::::0;;;;;;;;-1:-1:-1;;;;;10591:38:0::1;10583:47:::0;;:7:::1;:47:::0;;;;;10591:38;10583:54:::1;::::0;10575:80:::1;;;::::0;;-1:-1:-1;;;10575:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10575:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;32720:21:0;::::2;32696;32720::::0;;;:7:::2;:21;::::0;;;;32760:13:::2;::::0;::::2;::::0;32752:38:::2;;;::::0;;-1:-1:-1;;;32752:38:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32752:38:0;;;;;;;;;;;;;::::2;;32823:1;32809:6;:11;;;:15;32801:33;;;::::0;;-1:-1:-1;;;32801:33:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32801:33:0;;;;;;;;;;;;;::::2;;32917:39;32929:6;:26;;;32917:11;:39::i;:::-;32909:117;;;;-1:-1:-1::0;;;32909:117:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33037:39;33047:12;33061:1;33064:6;:11;;;33037:9;:39::i;34853:534::-:0;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;;;34958:21;;;:9:::1;:21;::::0;;;;34998:14:::1;::::0;::::1;:17:::0;::::1;;:22:::0;34990:44:::1;;;::::0;;-1:-1:-1;;;34990:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34990:44:0;;;;;;;;;;;;;::::1;;35053:14;::::0;::::1;:17:::0;;;::::1;;;:22:::0;35045:44:::1;;;::::0;;-1:-1:-1;;;35045:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35045:44:0;;;;;;;;;;;;;::::1;;35122:17;::::0;::::1;::::0;-1:-1:-1;;;;;35122:17:0::1;35108:10;:31;35100:53;;;::::0;;-1:-1:-1;;;35100:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35100:53:0;;;;;;;;;;;;;::::1;;35164:14;::::0;::::1;:21:::0;;-1:-1:-1;;35164:21:0::1;::::0;::::1;::::0;;35184:1:::1;35249:17:::0;::::1;::::0;35179:1:::1;35268:21:::0;::::1;::::0;35291:23:::1;::::0;::::1;::::0;35218:97:::1;::::0;5069:6:::1;::::0;-1:-1:-1;;;;;35249:17:0;;::::1;::::0;35268:21;::::1;::::0;35218:22:::1;:97::i;:::-;35341:38;::::0;;35368:10:::1;35341:38:::0;;;;35356:10;;35341:38:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;2820:1:0;3126:7;:22;34853:534::o;6074:51::-;;;;;;;;;;;;;;;:::o;26798:1054::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;26888:45:::1;26919:13:::0;26888:30:::1;:45::i;:::-;26944:18;26965:13;26979;26965:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;27032:21;;;:9:::1;:21:::0;;;;;;;27072:14:::1;::::0;::::1;:17:::0;26965:28;;-1:-1:-1;27032:21:0;27072:17;;::::1;;;27093:1;27072:22;27064:40;;;::::0;;-1:-1:-1;;;27064:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27064:40:0;;;;;;;;;;;;;::::1;;27115:14;::::0;::::1;:21:::0;;-1:-1:-1;;27115:21:0::1;;;::::0;;:17;27177:23:::1;27186:13:::0;27177:8:::1;:23::i;:::-;27162:38;;27215:7;27211:448;;;27239:14;::::0;::::1;:21:::0;;-1:-1:-1;;27239:21:0::1;::::0;::::1;::::0;;27318:18;;-1:-1:-1;;;;;27318:18:0::1;27239:17:::0;27310:27;;;:7:::1;27239:17;27310:27:::0;;;;27352:13:::1;::::0;::::1;:29:::0;;;27259:1:::1;27466:13:::0;::::1;::::0;27254:1:::1;27450:11:::0;::::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;27436:11;::::0;::::1;:44:::0;27525:13:::1;::::0;::::1;::::0;27509:11:::1;::::0;:30:::1;::::0;:15:::1;:30::i;:::-;27495:11;:44:::0;27580:13:::1;::::0;::::1;::::0;27566:9:::1;::::0;:28:::1;::::0;:13:::1;:28::i;:::-;27554:9;:40:::0;27625:1:::1;27609:13;::::0;;::::1;:17:::0;27211:448:::1;27686:18:::0;;-1:-1:-1;;;;;27686:18:0;;::::1;27708:5;27671:34:::0;;;:14:::1;:34;::::0;;;;:42;;-1:-1:-1;;27671:42:0::1;::::0;;27741:16:::1;::::0;::::1;::::0;27726:32:::1;::::0;27741:16:::1;27726:14;:32::i;:::-;27784:60;::::0;;;::::1;;::::0;;;;27824:10;;27809:13;;27784:60:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;;26798:1054:0:o;22380:2600::-;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;22461:45:::1;22492:13:::0;22461:30:::1;:45::i;:::-;22517:18;22538:13;22552;22538:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;22605:21;;;:9:::1;:21:::0;;;;;;;22645:14:::1;::::0;::::1;:17:::0;22538:28;;-1:-1:-1;22605:21:0;22645:17;;::::1;;;22666:1;22645:22;22637:44;;;::::0;;-1:-1:-1;;;22637:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22637:44:0;;;;;;;;;;;;;::::1;;22692:14;::::0;::::1;:21:::0;;-1:-1:-1;;22692:21:0::1;;;::::0;;:17;22762:23:::1;22771:13:::0;22762:8:::1;:23::i;:::-;22747:38;;4452:6;22894:69;22940:8;:22;;;22894:41;22910:8;:24;;;22894:11;;:15;;:41;;;;:::i;:::-;:45:::0;::::1;:69::i;:::-;:87;22890:135;;;-1:-1:-1::0;23008:5:0::1;22890:135;23210:21;::::0;::::1;::::0;-1:-1:-1;;;;;23210:21:0::1;23185:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23185:24:0::1;:47:::0;:24;:47;;;23157:25:::1;::::0;::::1;::::0;:75:::1;23153:123;;;-1:-1:-1::0;23259:5:0::1;23153:123;23427:1;23401:8;:23;;;:27;:83;;;;-1:-1:-1::0;23457:21:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;23457:21:0::1;23432:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23432:24:0::1;:47:::0;:24;:47;;;:52;23401:83:::1;:136;;;;;4650:3;23488:20;;:49;;23401:136;23397:184;;;-1:-1:-1::0;23564:5:0::1;23397:184;23625:7;23621:1230;;;23649:14;::::0;::::1;:21:::0;;-1:-1:-1;;23649:21:0::1;::::0;::::1;::::0;;23708:18;;23728:24:::1;::::0;::::1;::::0;23754:22:::1;::::0;::::1;::::0;23698:79:::1;::::0;-1:-1:-1;;;;;23708:18:0::1;::::0;23728:24;23698:9:::1;:79::i;:::-;23960:21;::::0;::::1;::::0;-1:-1:-1;;;;;23960:21:0::1;23935:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;23935:24:0::1;:47:::0;:24;:47;;;:52;:83;::::1;;;;24017:1;23991:8;:23;;;:27;23935:83;23931:149;;;24039:20;:25:::0;;24063:1:::1;24039:25;::::0;;23931:149:::1;24134:21;::::0;::::1;::::0;24157:23:::1;::::0;::::1;::::0;24096:85:::1;::::0;5069:6:::1;::::0;5014::::1;::::0;-1:-1:-1;;;;;24134:21:0::1;::::0;24096:22:::1;:85::i;:::-;24226:18:::0;;24246:21:::1;::::0;::::1;::::0;24269:25:::1;::::0;::::1;::::0;24196:99:::1;::::0;5014:6:::1;::::0;-1:-1:-1;;;;;24226:18:0;;::::1;::::0;24246:21;::::1;::::0;24196:22:::1;:99::i;:::-;24454:21;::::0;::::1;::::0;-1:-1:-1;;;;;24454:21:0::1;24429:24;:47:::0;;;-1:-1:-1;;;;;;;;;;;24429:24:0::1;:47:::0;:24;:47;;;:52;:85;::::1;;;;24513:1;24485:8;:25;;;:29;24429:85;24425:151;;;24535:20;:25:::0;;-1:-1:-1;;24535:25:0;;;24425:151:::1;23621:1230;;;24773:17;::::0;::::1;::::0;24792:21:::1;::::0;::::1;::::0;24815:23:::1;::::0;::::1;::::0;24742:97:::1;::::0;5069:6:::1;::::0;-1:-1:-1;;;;;24773:17:0;;::::1;::::0;24792:21;::::1;::::0;24742:22:::1;:97::i;:::-;24878:16;::::0;::::1;::::0;24863:32:::1;::::0;-1:-1:-1;;;;;24878:16:0::1;24863:14;:32::i;:::-;24921:51;::::0;;;::::1;;::::0;;;;24952:10;;24937:13;;24921:51:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;2820:1:0;3126:7;:22;-1:-1:-1;;22380:2600:0:o;5028:48::-;5069:6;5028:48;:::o;12468:2005::-;12788:18;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;4452:6:::1;12827:34;:15:::0;12847:13;12827:19:::1;:34::i;:::-;:53;;12819:77;;;::::0;;-1:-1:-1;;;12819:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;12819:77:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;12915:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;12907:66;;;::::0;;-1:-1:-1;;;12907:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;12992:28:0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;::::1;;12984:66;;;::::0;;-1:-1:-1;;;12984:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13069:18:0;::::1;5014:6;13069:18;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;;;;;;13091:19:0;::::1;5069:6;13091:19;;13069:41;:63;;;;-1:-1:-1::0;;;;;;13114:18:0;::::1;5123:6;13114:18;;13069:63;13061:98;;;::::0;;-1:-1:-1;;;13061:98:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13061:98:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;13178:18:0;::::1;;::::0;;;:7:::1;:18;::::0;;;;:25:::1;;::::0;:30;13170:59:::1;;;::::0;;-1:-1:-1;;;13170:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13170:59:0;;;;;;;;;;;;;::::1;;13263:1;13246:14;:18;:65;;;;-1:-1:-1::0;;;;;;13268:38:0;::::1;:24;:38:::0;;;-1:-1:-1;;;;;;;;;;;13268:24:0::1;:38:::0;:24;:38;;;:43;13246:65:::1;13242:174;;;4650:3;13336:20;;:48;13328:76;;;::::0;;-1:-1:-1;;;13328:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13328:76:0;;;;;;;;;;;;;::::1;;13562:9;:13:::0;13558:408:::1;;-1:-1:-1::0;;;;;13600:20:0;::::1;3549:42;13600:20;:51:::0;::::1;;;;13637:14;13624:9;:27;13600:51;13592:75;;;::::0;;-1:-1:-1;;;13592:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13592:75:0;;;;;;;;;;;;;::::1;;13701:31;::::0;13683:12:::1;::::0;3549:42:::1;::::0;13718:9:::1;::::0;13683:12;13701:31;13683:12;13701:31;13718:9;3549:42;13701:31:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13682:50;;;13755:7;13747:28;;;::::0;;-1:-1:-1;;;13747:28:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;13747:28:0;;;;;;;;;;;;;::::1;;13790:51;3549:42;13824:4;13831:9;13790:25;:51::i;:::-;13558:408;;;;13874:80;-1:-1:-1::0;;;;;13874:37:0;::::1;13912:10;13932:4;13939:14:::0;13874:37:::1;:80::i;:::-;13986:56;5069:6;14013:12;14027:14;13986:18;:56::i;:::-;14063:21;;:::i;:::-;14192:1;14181:8:::0;;::::1;:12:::0;14218:140:::1;::::0;;14181:8:::1;14218:140:::0;::::1;::::0;;;-1:-1:-1;14218:140:0;;::::1;::::0;14234:9;;14245:15;;14262:13;;14277:14;;14293:12;;14307:16;;14325:12;;14339:7;;14181:5;;14218:15:::1;:140::i;:::-;-1:-1:-1::0;;14386:13:0::1;::::0;-1:-1:-1;;14386:17:0;2820:1;3126:7;:22;12468:2005;;-1:-1:-1;;;;;;;;12468:2005:0:o;3518:73::-;3549:42;3518:73;:::o;4974:47::-;5014:6;4974:47;:::o;24993:1797::-;25078:4;25084:12;2864:1;3019:7;;:19;;3011:63;;;;;-1:-1:-1;;;3011:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3011:63:0;;;;;;;;;;;;;;;2864:1;3085:7;:18;25109:45:::1;25140:13:::0;25109:30:::1;:45::i;:::-;25165:18;25186:13;25200;25186:28;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;::::0;25248:19;;;:7:::1;:19:::0;;;;;;25306:9:::1;:21:::0;;;;;;25346:14:::1;::::0;::::1;:17:::0;25186:28;;-1:-1:-1;25248:19:0;;25346:17;;::::1;;;25367:1;25346:22;25338:42;;;::::0;;-1:-1:-1;;;25338:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25338:42:0;;;;;;;;;;;;;::::1;;25391:14;::::0;::::1;:21:::0;;-1:-1:-1;;25391:21:0::1;;;::::0;;:17;25453:23:::1;25462:13:::0;25453:8:::1;:23::i;:::-;25621:18:::0;;-1:-1:-1;;;;;25621:18:0::1;25606:34;::::0;;;:14:::1;:34;::::0;;;;;25438:38;;-1:-1:-1;25606:34:0::1;;:110:::0;::::1;;;-1:-1:-1::0;25697:18:0;;-1:-1:-1;;;;;25697:18:0::1;25672:24;:44:::0;;;-1:-1:-1;;;;;;;;;;;25672:24:0::1;:44:::0;:24;:44;;;25644:25:::1;::::0;::::1;::::0;:72:::1;25606:110;25602:158;;;-1:-1:-1::0;25743:5:0::1;25602:158;25909:21;25883:8;:23;;;:47;25879:95;;;-1:-1:-1::0;25957:5:0::1;25879:95;25990:7;25986:661;;;26014:14;::::0;::::1;:21:::0;;-1:-1:-1;;26014:21:0::1;::::0;::::1;::::0;;26103:18;;26134:23:::1;::::0;::::1;::::0;26103:63:::1;::::0;;;26014:17;;26076:23:::1;::::0;-1:-1:-1;;;;;26103:18:0;;::::1;::::0;26134:23;;26159:6;;26103:63;;;26159:6;;26029:1:::1;-1:-1:-1::0;;26034:1:0::1;26103:63:::0;::::1;;26014:21;26103:63;::::0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26200:18:0;;-1:-1:-1;;;;;26200:18:0::1;26185:34;::::0;;;:14:::1;:34;::::0;;;;;26061:105;;-1:-1:-1;26061:105:0;-1:-1:-1;26185:34:0::1;;26181:412;;;26273:18:::0;;26293:25:::1;::::0;::::1;::::0;26240:79:::1;::::0;5014:6:::1;::::0;-1:-1:-1;;;;;26273:18:0;;::::1;::::0;26240:25:::1;:79::i;:::-;26491:18:::0;;-1:-1:-1;;;;;26491:18:0::1;26466:24;:44:::0;;;-1:-1:-1;;;;;;;;;;;26466:24:0::1;:44:::0;:24;:44;;;:49;:82;::::1;;;;26547:1;26519:8;:25;;;:29;26466:82;26462:116;;;26551:20;:25:::0;;-1:-1:-1;;26551:25:0;;;26462:116:::1;26615:7:::0;;-1:-1:-1;26624:10:0;-1:-1:-1;26607:28:0::1;::::0;-1:-1:-1;;;;26607:28:0::1;25986:661;26682:16;::::0;::::1;::::0;26667:32:::1;::::0;-1:-1:-1;;;;;26682:16:0::1;26667:14;:32::i;:::-;26725:57;::::0;;;::::1;;::::0;;;;26762:10;;26747:13;;26725:57:::1;::::0;;;;::::1;::::0;;::::1;3114:1;;;;;2820::::0;3126:7;:22;24993:1797;;;;-1:-1:-1;24993:1797:0:o;2168:150::-;2226:7;2259:1;2254;:6;;2246:15;;;;;;-1:-1:-1;2284:5:0;;;2168:150::o;2555:149::-;2613:7;2645:1;2641;:5;2633:14;;;;;;2658:9;2674:1;2670;:5;;;;;;;2555:149;-1:-1:-1;;;;2555:149:0:o;33756:323::-;33859:10;33841:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;33841:36:0;;;;;;;;;;:46;-1:-1:-1;33841:46:0;33833:67;;;;;-1:-1:-1;;;33833:67:0;;;;;;;;;;;;-1:-1:-1;;;33833:67:0;;;;;;;;;;;;;;;33911:46;-1:-1:-1;;;;;33911:26:0;;33938:10;33950:6;33911:26;:46::i;:::-;33968:52;33994:10;34006:5;34013:6;33968:25;:52::i;:::-;34036:35;;;-1:-1:-1;;;;;34036:35:0;;;;;;;;;;;;34045:10;;34036:35;;;;;;;;33756:323;;:::o;30741:1861::-;30881:11;;-1:-1:-1;;;;;30927:22:0;;30845:33;30927:22;;;:7;:22;;;;;30968:13;;;;:29;-1:-1:-1;30968:29:0;30960:49;;;;;-1:-1:-1;;;30960:49:0;;;;;;;;;;;;-1:-1:-1;;;30960:49:0;;;;;;;;;;;;;;;31043:10;31028:6;:11;;;:25;;31020:43;;;;;-1:-1:-1;;;31020:43:0;;;;;;;;;;;;-1:-1:-1;;;31020:43:0;;;;;;;;;;;;;;;31082:39;31094:6;:26;;;31082:11;:39::i;:::-;31074:117;;;;-1:-1:-1;;;31074:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31202:27;31232:28;:12;31249:10;31232:16;:28::i;:::-;-1:-1:-1;;;;;31344:24:0;;;;;;:9;:24;;;;;;31202:58;;-1:-1:-1;31344:49:0;;31202:58;31344:28;:49::i;:::-;-1:-1:-1;;;;;31317:24:0;;;;;;:9;:24;;;;;:76;31420:13;;;;:31;;31438:12;31420:17;:31::i;:::-;31404:13;;;:47;31476:11;;;;:27;;31492:10;31476:15;:27::i;:::-;31462:11;;;:41;31528:11;;:29;;31544:12;31528:15;:29::i;:::-;31514:11;:43;31580:9;;:25;;31594:10;31580:13;:25::i;:::-;31568:9;:37;;;31630:11;;:26;;:15;:26::i;:::-;31616:11;:40;31674:9;31669:787;31693:14;:21;31689:25;;31669:787;;;5014:6;31736:24;31773;;;:17;:24;;31798:14;:17;;31763:102;;-1:-1:-1;;;;;;;;;;;31773:24:0;31736;;31798:14;31813:1;;31798:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31798:17:0;31773:43;;;;;;;;;;;;;31818:19;31839:25;31763:9;:102::i;:::-;31736:129;-1:-1:-1;31884:20:0;;31880:565;;5014:6;32276:24;;;;:17;:24;;32301:14;:17;;32323:16;;-1:-1:-1;;;;;;;;;;;32276:24:0;;;32316:1;;32301:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32301:17:0;;;32276:43;;;;;;;;;;;;;;;:63;;;;;;;;;32358:32;;;;;:17;:32;;;;;;32391:14;:17;;32413:16;;32301:17;32391:14;32406:1;;32391:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32391:17:0;32358:51;;;;;;;;;;;;:71;;;;;;;31880:565;-1:-1:-1;31716:3:0;;31669:787;;;-1:-1:-1;32473:49:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32473:49:0;;;;;;;;;;;32538:56;;;;;;;;32570:1;;-1:-1:-1;;;;;32538:56:0;;;-1:-1:-1;;;;;;;;;;;32538:56:0;;;;;;;;30741:1861;;;;;;:::o;2006:150::-;2064:7;2096:5;;;2120:6;;;;2112:15;;;;;29737:527;29849:13;:20;29833:36;;29825:58;;;;;-1:-1:-1;;;29825:58:0;;;;;;;;;;;;-1:-1:-1;;;29825:58:0;;;;;;;;;;;;;;;29894:24;;:::i;:::-;29921:9;:39;29931:13;29945;29931:28;;;;;;;;;;;;;;;;;;;;;29921:39;;;;;;;;;;;;;;;29894:66;;;;;;;;;-1:-1:-1;;;;;29894:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29921:39;;29894:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30001:70;30053:17;;30001:47;30029:18;;30001:8;:23;;;:27;;:47;;;;:::i;:70::-;29979:18;:16;:18::i;:::-;:92;;29971:111;;;;;-1:-1:-1;;;29971:111:0;;;;;;;;;;;;-1:-1:-1;;;29971:111:0;;;;;;;;;;;;;;;30101:14;;;;:17;;;:22;;;30093:44;;;;;-1:-1:-1;;;30093:44:0;;;;;;;;;;;;-1:-1:-1;;;30093:44:0;;;;;;;;;;;;;;;30156:18;;;:79;;;30178:9;:43;30188:13;30218:1;30202:13;:17;30188:32;;;;;;;;;;;;;;;;30178:43;;;;;;;;;;;:49;;30228:1;30178:52;;;;;;;;;;;;;;;;;;;;;;;;;:57;;30234:1;30178:57;30156:79;30148:108;;;;;-1:-1:-1;;;30148:108:0;;;;;;;;;;;;-1:-1:-1;;;30148:108:0;;;;;;;;;;;;;;;29737:527;;:::o;28811:918::-;28875:12;28900:24;;:::i;:::-;28927:9;:39;28937:13;28951;28937:28;;;;;;;;;;;;;;;;;;;;;28927:39;;;;;;;;;;;;;;;28900:66;;;;;;;;;-1:-1:-1;;;;;28900:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28927:39;;28900:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29011:8;:16;;;28991:8;:17;;;:36;28987:83;;;29054:4;29044:14;;28987:83;29197:39;;;;29179:13;;29163:11;;:30;;:15;:30::i;:::-;29162:74;29158:122;;;29263:5;29253:15;;29158:122;29620:18;;-1:-1:-1;;;;;29612:27:0;;;;;:7;:27;;;;;:34;;;:39;29608:87;;29678:5;29668:15;;29608:87;29707:14;28811:918;;;:::o;30272:243::-;30376:12;;30390:16;;30333:74;;5069:6;;30364:10;;-1:-1:-1;;;;;30376:12:0;;30333:22;:74::i;:::-;30458:12;;30490:16;;30472:15;;30418:89;;5069:6;;30449:7;;-1:-1:-1;;;;;30458:12:0;;;;30472:34;30418:22;:89::i;:::-;30272:243;:::o;40284:193::-;-1:-1:-1;;;;;40377:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;40428:24;:31;;;;;;:41;;;;;;;40284:193::o;16888:1478::-;17250:24;;:::i;:::-;17277:595;;;;;;;;17313:9;-1:-1:-1;;;;;17277:595:0;;;;;17348:10;-1:-1:-1;;;;;17277:595:0;;;;;17391:1;-1:-1:-1;;;;;17277:595:0;;;;;17423:12;-1:-1:-1;;;;;17277:595:0;;;;;17465:12;-1:-1:-1;;;;;17277:595:0;;;;;17500:5;17277:595;;;;17538:15;17277:595;;;;17584:13;17277:595;;;;17631:16;17277:595;;;;17679:14;17277:595;;;;17725:1;17277:595;;;;17752:1;17277:595;;;;17778:1;17277:595;;;;17827:1;17277:595;;;;17853:7;17277:595;;;17250:622;;17897:8;:14;;;17912:1;17897:17;;;;;;;;;;;:22;;17918:1;17897:22;17893:84;;;17944:13;;17936:22;;;;:7;:22;;;;;;;;:29;;;;;;;;:::i;:::-;;17893:84;18007:13;;17997:24;;;;:9;:24;;;;;;;;;:35;;;;-1:-1:-1;;;;;;17997:35:0;;;-1:-1:-1;;;;;17997:35:0;;;;;;;;;;-1:-1:-1;17997:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18280:26;:38;18307:10;-1:-1:-1;;;;;18280:38:0;-1:-1:-1;;;;;18280:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18280:38:0;-1:-1:-1;;;;;18111:208:0;18268:10;-1:-1:-1;;;;;18111:208:0;18126:9;-1:-1:-1;;;;;18111:208:0;;18137:15;18154:13;18169:14;18185:12;18199:16;18217:12;18231:7;18240:5;18247:4;18253:13;;18111:208;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18111:208:0;;;;;;;;;;;-1:-1:-1;;;;;18111:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18340:13:0;:18;;18357:1;18340:18;;;-1:-1:-1;;;;;;;;;16888:1478:0:o;1227:205::-;1355:68;;;-1:-1:-1;;;;;1355:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:68:0;-1:-1:-1;;;1355:68:0;;;1328:96;;1348:5;;1328:19;:96::i;:::-;1227:205;;;;:::o;36833:107::-;36891:7;36923:1;36918;:6;;:14;;36931:1;36918:14;;;-1:-1:-1;36927:1:0;;36911:21;-1:-1:-1;36833:107:0:o;38546:1726::-;-1:-1:-1;;;;;38720:16:0;;;;;;:7;:16;;;;;:23;-1:-1:-1;;;38720:23:0;;;;38747:1;38720:28;38716:1146;;;-1:-1:-1;;;;;38791:16:0;;;;;;:7;:16;;;;;:23;;;:35;;38819:6;38791:27;:35::i;:::-;-1:-1:-1;;;;;38765:16:0;;;;;;:7;:16;;;;;:23;;;:61;;;;38865:21;;;:31;;38891:4;38865:25;:31::i;:::-;-1:-1:-1;;;;;38841:16:0;;;;;;:7;:16;;;;;:21;;:55;38716:1146;;;-1:-1:-1;;;;;39123:35:0;;;39115:44;39123:35;;;:26;:35;;;;;;;;;;;;39115:44;;:7;:44;;;:51;;-1:-1:-1;;;39115:51:0;;;;39123:35;39115:56;39111:316;;;-1:-1:-1;;;;;39219:35:0;;;39192:24;39219:35;;;:26;:35;;;;;;;;;;;;39273:44;;;;;;:63;;-1:-1:-1;;;;;;39273:63:0;;;;;;;;39355:7;:25;;;;;;;:56;;;;;;;;;;39111:316;39470:320;;;;;;;;-1:-1:-1;;;;;39470:320:0;;;;;39545:1;39470:320;;;;;;;;;;;;;;-1:-1:-1;39625:16:0;;;:7;:16;;;;;;:21;;;39470:320;;;;39616:31;;:4;;:8;:31::i;:::-;39470:320;;39744:1;39470:320;;;;;;;;;;;;;;-1:-1:-1;;;;;39451:16:0;;;;;;:7;:16;;;;;:339;;;;;;;;;;-1:-1:-1;;;39451:339:0;-1:-1:-1;;;;39451:339:0;;;;-1:-1:-1;;;;;;39451:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39805:26;:35;;;;;;:45;;;;;;;;;;38716:1146;39882:21;39906:16;:6;39917:4;39906:10;:16::i;:::-;-1:-1:-1;;;;;40016:18:0;;;;;;:9;:18;;;;;;39882:40;;-1:-1:-1;40016:37:0;;39882:40;40016:22;:37::i;:::-;-1:-1:-1;;;;;39995:18:0;;;;;;:9;:18;;;;;:58;40078:11;;:23;;40094:6;40078:15;:23::i;:::-;40064:11;:37;40124:9;;:19;;40138:4;40124:13;:19::i;:::-;40112:9;:31;;;40168:11;;:26;;:15;:26::i;:::-;40154:11;:40;40220:44;;;;;;;;-1:-1:-1;;;;;40220:44:0;;;40237:1;;-1:-1:-1;;;;;;;;;;;40220:44:0;;;;;;;;38546:1726;;;;:::o;40489:211::-;40598:46;40624:4;40630:5;40637:6;40598:25;:46::i;:::-;40655:37;40674:2;40678:5;40685:6;40655:18;:37::i;1038:177::-;1148:58;;;-1:-1:-1;;;;;1148:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1148:58:0;-1:-1:-1;;;1148:58:0;;;1121:86;;1141:5;;1121:19;:86::i;:::-;1038:177;;;:::o;40708:200::-;-1:-1:-1;;;;;40808:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;;40859:24;:31;;;;;;:41;;;;;;;;40708:200::o;38084:450::-;38187:7;38215:23;38207:32;;;;;;38256:12;38252:31;;-1:-1:-1;38279:1:0;38272:8;;38252:31;38310:16;;;38320:6;38310:7;:16;:7;38343:14;;;;;:24;38339:129;;;38438:18;38431:4;:25;;;;;;38424:32;;;;;38339:129;38520:6;38498:18;38488:7;:28;;;;;;38487:39;;38084:450;-1:-1:-1;;;;;38084:450:0:o;2330:213::-;2388:7;2412:6;2408:47;;-1:-1:-1;2442:1:0;2435:8;;2408:47;2479:5;;;2483:1;2479;:5;:1;2503:5;;;;;:10;2495:19;;;;;1444:479;1533:27;1541:5;-1:-1:-1;;;;;1533:25:0;;:27::i;:::-;1525:71;;;;;-1:-1:-1;;;1525:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1608:12;1622:23;1657:5;-1:-1:-1;;;;;1649:19:0;1669:4;1649:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1649:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1607:67;;;;1693:7;1685:52;;;;;-1:-1:-1;;;1685:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1754:17;;:21;1750:166;;1838:10;1827:30;;;;;;;;;;;;;;;-1:-1:-1;1827:30:0;1819:85;;;;-1:-1:-1;;;1819:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;515:317;575:4;741:20;;641:66;781:23;;;;;;:42;;-1:-1:-1;808:15:0;;;781:42;773:51;515:317;-1:-1:-1;;;;515:317:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://b14b1d4cca6b0621f70db6cfef7d4a327f8c525cf12a7d41ad8ce20b063cf007

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.