ETH Price: $1,994.25 (-3.55%)

Contract

0x66ef58CA2A388e779E4b2FdC19C8aC49104605Ca
 

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

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-103057792020-06-21 0:09:252105 days ago1592698165  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Moloch

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-06-21
*/

pragma solidity 0.5.17;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

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

contract Moloch is ReentrancyGuard {
    using SafeMath for uint256;

    /***************
    GLOBAL CONSTANTS
    ***************/
    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 proposalDeposit; // default = 10 ETH (~$1,000 worth of ETH at contract deployment)
    uint256 public dilutionBound; // default = 3 - maximum multiplier a YES voter will be obligated to pay in case of mass ragequit
    uint256 public processingReward; // default = 0.1 - amount of ETH to give to whoever processes a proposal
    uint256 public summoningTime; // needed to determine the current period
    
    address public depositToken; // deposit token contract reference; default = wETH

    // HARD-CODED LIMITS
    // These numbers are quite arbitrary; they are small enough to avoid overflows when doing calculations
    // with periods or shares, yet big enough to not limit reasonable use cases.
    uint256 constant MAX_VOTING_PERIOD_LENGTH = 10**18; // maximum length of voting period
    uint256 constant MAX_GRACE_PERIOD_LENGTH = 10**18; // maximum length of grace period
    uint256 constant MAX_DILUTION_BOUND = 10**18; // maximum dilution bound
    uint256 constant MAX_NUMBER_OF_SHARES_AND_LOOT = 10**18; // maximum number of shares that can be minted
    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

    // ***************
    // EVENTS
    // ***************
    event SummonComplete(address[] indexed summoners, address[] tokens, uint256 summoningTime, uint256 periodDuration, uint256 votingPeriodLength, uint256 gracePeriodLength, uint256 proposalDeposit, uint256 dilutionBound, uint256 processingReward);
    event SubmitProposal(address indexed applicant, uint256 sharesRequested, uint256 lootRequested, uint256 tributeOffered, address tributeToken, uint256 paymentRequested, address paymentToken, string details, bool[6] flags, uint256 proposalId, address indexed delegateKey, address indexed memberAddress);
    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 ProcessWhitelistProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event ProcessGuildKickProposal(uint256 indexed proposalIndex, uint256 indexed proposalId, bool didPass);
    event Ragequit(address indexed memberAddress, uint256 sharesToBurn, uint256 lootToBurn);
    event TokensCollected(address indexed token, uint256 amountToCollect);
    event CancelProposal(uint256 indexed proposalId, address applicantAddress);
    event UpdateDelegateKey(address indexed memberAddress, address newDelegateKey);
    event Withdraw(address indexed memberAddress, address token, uint256 amount);

    // *******************
    // INTERNAL ACCOUNTING
    // *******************
    uint256 public proposalCount = 0; // total proposals submitted
    uint256 public totalShares = 0; // total shares across all members
    uint256 public totalLoot = 0; // total loot across all members
    uint256 public totalGuildBankTokens = 0; // total tokens with non-zero balance in guild bank

    address public constant GUILD = address(0xdead);
    address public constant ESCROW = address(0xbeef);
    address public constant TOTAL = address(0xbabe);
    mapping (address => mapping(address => uint256)) public userTokenBalances; // userTokenBalances[userAddress][tokenAddress]

    enum Vote {
        Null, // default value, counted as abstention
        Yes,
        No
    }

    struct Member {
        address delegateKey; // the key responsible for submitting proposals and voting - defaults to member address unless updated
        uint256 shares; // the # of voting shares assigned to this member
        uint256 loot; // the loot amount available to this member (combined with shares on ragequit)
        bool exists; // always true once a member has been created
        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 and sponsoring proposals
    }

    struct Proposal {
        address applicant; // the applicant who wishes to become a member - this key will be used for withdrawals (doubles as guild kick target for gkick 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)
        uint256 sharesRequested; // the # of shares the applicant is requesting
        uint256 lootRequested; // the amount of loot the applicant is requesting
        uint256 tributeOffered; // amount of tokens offered as tribute
        address tributeToken; // tribute token contract reference
        uint256 paymentRequested; // amount of tokens requested as payment
        address paymentToken; // payment token contract reference
        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
        bool[6] flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick]
        string details; // proposal details - could be IPFS hash, plaintext, or JSON
        uint256 maxTotalSharesAndLootAtYesVote; // the maximum # of total shares encountered at a yes vote on this proposal
        mapping(address => Vote) votesByMember; // the votes on this proposal by each member
    }

    mapping(address => bool) public tokenWhitelist;
    address[] public approvedTokens;

    mapping(address => bool) public proposedToWhitelist;
    mapping(address => bool) public proposedToKick;

    mapping(address => Member) public members;
    mapping(address => address) public memberAddressByDelegateKey;

    mapping(uint256 => Proposal) public proposals;

    uint256[] public proposalQueue;

    modifier onlyMember {
        require(members[msg.sender].shares > 0 || members[msg.sender].loot > 0, "not a member");
        _;
    }

    modifier onlyShareholder {
        require(members[msg.sender].shares > 0, "not a shareholder");
        _;
    }

    modifier onlyDelegate {
        require(members[memberAddressByDelegateKey[msg.sender]].shares > 0, "not a delegate");
        _;
    }

    constructor(
        address[] memory _summoners,
        address[] memory _approvedTokens,
        uint256 _periodDuration,
        uint256 _votingPeriodLength,
        uint256 _gracePeriodLength,
        uint256 _proposalDeposit,
        uint256 _dilutionBound,
        uint256 _processingReward
    ) public {
        require(_periodDuration > 0, "_periodDuration cannot be 0");
        require(_votingPeriodLength > 0, "_votingPeriodLength cannot be 0");
        require(_votingPeriodLength <= MAX_VOTING_PERIOD_LENGTH, "_votingPeriodLength exceeds limit");
        require(_gracePeriodLength <= MAX_GRACE_PERIOD_LENGTH, "_gracePeriodLength exceeds limit");
        require(_dilutionBound > 0, "_dilutionBound cannot be 0");
        require(_dilutionBound <= MAX_DILUTION_BOUND, "_dilutionBound exceeds limit");
        require(_approvedTokens.length > 0, "need at least one approved token");
        require(_approvedTokens.length <= MAX_TOKEN_WHITELIST_COUNT, "too many tokens");
        require(_proposalDeposit >= _processingReward, "_proposalDeposit cannot be smaller than _processingReward");
        
        depositToken = _approvedTokens[0];
        // NOTE: move event up here, avoid stack too deep if too many approved tokens
        emit SummonComplete(_summoners, _approvedTokens, now, _periodDuration, _votingPeriodLength, _gracePeriodLength, _proposalDeposit, _dilutionBound, _processingReward);
        
        for (uint256 i = 0; i < _summoners.length; i++) {
            require(_summoners[i] != address(0), "summoner cannot be 0");
            members[_summoners[i]] = Member(_summoners[i], 1, 0, true, 0, 0);
            memberAddressByDelegateKey[_summoners[i]] = _summoners[i];
        }

        for (uint256 i = 0; i < _approvedTokens.length; i++) {
            require(_approvedTokens[i] != address(0), "_approvedToken cannot be 0");
            require(!tokenWhitelist[_approvedTokens[i]], "duplicate approved token");
            tokenWhitelist[_approvedTokens[i]] = true;
            approvedTokens.push(_approvedTokens[i]);
        }
        
        periodDuration = _periodDuration;
        votingPeriodLength = _votingPeriodLength;
        gracePeriodLength = _gracePeriodLength;
        proposalDeposit = _proposalDeposit;
        dilutionBound = _dilutionBound;
        processingReward = _processingReward;
        summoningTime = now;
        totalShares = _summoners.length;
    }

    /*****************
    PROPOSAL FUNCTIONS
    *****************/
    function submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        string memory details
    ) public nonReentrant returns (uint256 proposalId) {
        require(sharesRequested.add(lootRequested) <= MAX_NUMBER_OF_SHARES_AND_LOOT, "too many shares requested");
        require(tokenWhitelist[tributeToken], "tributeToken is not whitelisted");
        require(tokenWhitelist[paymentToken], "payment is not whitelisted");
        require(applicant != address(0), "applicant cannot be 0");
        require(applicant != GUILD && applicant != ESCROW && applicant != TOTAL, "applicant address cannot be reserved");
        require(members[applicant].jailed == 0, "proposal applicant must not be jailed");

        if (tributeOffered > 0 && userTokenBalances[GUILD][tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, 'cannot submit more tribute proposals for new tokens - guildbank is full');
        }

        // collect tribute from proposer and store it in the Moloch until the proposal is processed
        require(IERC20(tributeToken).transferFrom(msg.sender, address(this), tributeOffered), "tribute token transfer failed");
        unsafeAddToBalance(ESCROW, tributeToken, tributeOffered);

        bool[6] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick]

        _submitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags);
        return proposalCount - 1; // return proposalId - contracts calling submit might want it
    }

    function submitWhitelistProposal(address tokenToWhitelist, string memory details) public nonReentrant returns (uint256 proposalId) {
        require(tokenToWhitelist != address(0), "must provide token address");
        require(!tokenWhitelist[tokenToWhitelist], "cannot already have whitelisted the token");
        require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "cannot submit more whitelist proposals");

        bool[6] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick]
        flags[4] = true; // whitelist

        _submitProposal(address(0), 0, 0, 0, tokenToWhitelist, 0, address(0), details, flags);
        return proposalCount - 1;
    }

    function submitGuildKickProposal(address memberToKick, string memory details) public nonReentrant returns (uint256 proposalId) {
        Member memory member = members[memberToKick];

        require(member.shares > 0 || member.loot > 0, "member must have at least one share or one loot");
        require(members[memberToKick].jailed == 0, "member must not already be jailed");

        bool[6] memory flags; // [sponsored, processed, didPass, cancelled, whitelist, guildkick]
        flags[5] = true; // guild kick

        _submitProposal(memberToKick, 0, 0, 0, address(0), 0, address(0), details, flags);
        return proposalCount - 1;
    }

    function _submitProposal(
        address applicant,
        uint256 sharesRequested,
        uint256 lootRequested,
        uint256 tributeOffered,
        address tributeToken,
        uint256 paymentRequested,
        address paymentToken,
        string memory details,
        bool[6] memory flags
    ) internal {
        Proposal memory proposal = Proposal({
            applicant : applicant,
            proposer : msg.sender,
            sponsor : address(0),
            sharesRequested : sharesRequested,
            lootRequested : lootRequested,
            tributeOffered : tributeOffered,
            tributeToken : tributeToken,
            paymentRequested : paymentRequested,
            paymentToken : paymentToken,
            startingPeriod : 0,
            yesVotes : 0,
            noVotes : 0,
            flags : flags,
            details : details,
            maxTotalSharesAndLootAtYesVote : 0
        });

        proposals[proposalCount] = proposal;
        address memberAddress = memberAddressByDelegateKey[msg.sender];
        // NOTE: argument order matters, avoid stack too deep
        emit SubmitProposal(applicant, sharesRequested, lootRequested, tributeOffered, tributeToken, paymentRequested, paymentToken, details, flags, proposalCount, msg.sender, memberAddress);
        proposalCount += 1;
    }

    function sponsorProposal(uint256 proposalId) public nonReentrant onlyDelegate {
        // collect proposal deposit from sponsor and store it in the Moloch until the proposal is processed
        require(IERC20(depositToken).transferFrom(msg.sender, address(this), proposalDeposit), "proposal deposit token transfer failed");
        unsafeAddToBalance(ESCROW, depositToken, proposalDeposit);

        Proposal storage proposal = proposals[proposalId];

        require(proposal.proposer != address(0), 'proposal must have been proposed');
        require(!proposal.flags[0], "proposal has already been sponsored");
        require(!proposal.flags[3], "proposal has been cancelled");
        require(members[proposal.applicant].jailed == 0, "proposal applicant must not be jailed");

        if (proposal.tributeOffered > 0 && userTokenBalances[GUILD][proposal.tributeToken] == 0) {
            require(totalGuildBankTokens < MAX_TOKEN_GUILDBANK_COUNT, 'cannot sponsor more tribute proposals for new tokens - guildbank is full');
        }

        // whitelist proposal
        if (proposal.flags[4]) {
            require(!tokenWhitelist[address(proposal.tributeToken)], "cannot already have whitelisted the token");
            require(!proposedToWhitelist[address(proposal.tributeToken)], 'already proposed to whitelist');
            require(approvedTokens.length < MAX_TOKEN_WHITELIST_COUNT, "cannot sponsor more whitelist proposals");
            proposedToWhitelist[address(proposal.tributeToken)] = true;

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

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

        proposal.startingPeriod = startingPeriod;

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

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

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

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

        require(proposalIndex < proposalQueue.length, "proposal does not exist");
        Proposal storage proposal = proposals[proposalQueue[proposalIndex]];

        require(uintVote < 3, "must be less than 3");
        Vote vote = Vote(uintVote);

        require(getCurrentPeriod() >= proposal.startingPeriod, "voting period has not started");
        require(!hasVotingPeriodExpired(proposal.startingPeriod), "proposal voting period has expired");
        require(proposal.votesByMember[memberAddress] == Vote.Null, "member has already voted");
        require(vote == Vote.Yes || vote == Vote.No, "vote must be either Yes or No");

        proposal.votesByMember[memberAddress] = vote;

        if (vote == Vote.Yes) {
            proposal.yesVotes = proposal.yesVotes.add(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 (totalShares.add(totalLoot) > proposal.maxTotalSharesAndLootAtYesVote) {
                proposal.maxTotalSharesAndLootAtYesVote = totalShares.add(totalLoot);
            }

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

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

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

        require(!proposal.flags[4] && !proposal.flags[5], "must be a standard proposal");

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

        bool didPass = _didPass(proposalIndex);

        // Make the proposal fail if the new total number of shares and loot exceeds the limit
        if (totalShares.add(totalLoot).add(proposal.sharesRequested).add(proposal.lootRequested) > MAX_NUMBER_OF_SHARES_AND_LOOT) {
            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] = true; // didPass

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

            // the applicant is a new member, create a new record for them
            } else {
                // if the applicant address is already taken by a member's delegateKey, reset it to their member address
                if (members[memberAddressByDelegateKey[proposal.applicant]].exists) {
                    address memberToOverride = memberAddressByDelegateKey[proposal.applicant];
                    memberAddressByDelegateKey[memberToOverride] = memberToOverride;
                    members[memberToOverride].delegateKey = memberToOverride;
                }

                // use applicant address as delegateKey by default
                members[proposal.applicant] = Member(proposal.applicant, proposal.sharesRequested, proposal.lootRequested, true, 0, 0);
                memberAddressByDelegateKey[proposal.applicant] = proposal.applicant;
            }

            // mint new shares & loot
            totalShares = totalShares.add(proposal.sharesRequested);
            totalLoot = totalLoot.add(proposal.lootRequested);

            // if the proposal tribute is the first tokens 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 processWhitelistProposal(uint256 proposalIndex) public nonReentrant {
        _validateProposalForProcessing(proposalIndex);

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

        require(proposal.flags[4], "must be a whitelist proposal");

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

        bool didPass = _didPass(proposalIndex);

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

        if (didPass) {
            proposal.flags[2] = true; // didPass

            tokenWhitelist[address(proposal.tributeToken)] = true;
            approvedTokens.push(proposal.tributeToken);
        }

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

        _returnDeposit(proposal.sponsor);

        emit ProcessWhitelistProposal(proposalIndex, proposalId, didPass);
    }

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

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

        require(proposal.flags[5], "must be a guild kick proposal");

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

        bool didPass = _didPass(proposalIndex);

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

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

        proposedToKick[proposal.applicant] = false;

        _returnDeposit(proposal.sponsor);

        emit ProcessGuildKickProposal(proposalIndex, proposalId, didPass);
    }

    function _didPass(uint256 proposalIndex) internal view returns (bool didPass) {
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];

        didPass = proposal.yesVotes > proposal.noVotes;

        // Make the proposal fail if the dilutionBound is exceeded
        if ((totalShares.add(totalLoot)).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 does not exist");
        Proposal memory proposal = proposals[proposalQueue[proposalIndex]];

        require(getCurrentPeriod() >= proposal.startingPeriod.add(votingPeriodLength).add(gracePeriodLength), "proposal is not ready to be processed");
        require(proposal.flags[1] == false, "proposal has already been processed");
        require(proposalIndex == 0 || proposals[proposalQueue[proposalIndex.sub(1)]].flags[1], "previous proposal must be processed");
    }

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

    function ragequit(uint256 sharesToBurn, uint256 lootToBurn) public nonReentrant onlyMember {
        _ragequit(msg.sender, sharesToBurn, lootToBurn);
    }

    function _ragequit(address memberAddress, uint256 sharesToBurn, uint256 lootToBurn) internal {
        uint256 initialTotalSharesAndLoot = totalShares.add(totalLoot);

        Member storage member = members[memberAddress];

        require(member.shares >= sharesToBurn, "insufficient shares");
        require(member.loot >= lootToBurn, "insufficient loot");

        require(canRagequit(member.highestIndexYesVote), "cannot ragequit until highest index proposal member voted YES on is processed");

        uint256 sharesAndLootToBurn = sharesToBurn.add(lootToBurn);

        // burn shares and loot
        member.shares = member.shares.sub(sharesToBurn);
        member.loot = member.loot.sub(lootToBurn);
        totalShares = totalShares.sub(sharesToBurn);
        totalLoot = totalLoot.sub(lootToBurn);

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

        emit Ragequit(msg.sender, sharesToBurn, lootToBurn);
    }

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

        require(member.jailed != 0, "member must be in jail");
        require(member.loot > 0, "member must have some loot"); // note - should be impossible for jailed member to have shares
        require(canRagequit(member.highestIndexYesVote), "cannot ragequit until highest index proposal member voted YES on is processed");

        _ragequit(memberToKick, 0, member.loot);
    }

    function withdrawBalance(address token, uint256 amount) public nonReentrant {
        _withdrawBalance(token, amount);
    }

    function withdrawBalances(address[] memory tokens, uint256[] memory amounts, bool max) public nonReentrant {
        require(tokens.length == amounts.length, "tokens and amounts arrays must be matching lengths");

        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, "insufficient balance");
        unsafeSubtractFromBalance(msg.sender, token, amount);
        require(IERC20(token).transfer(msg.sender, amount), "transfer failed");
        emit Withdraw(msg.sender, token, amount);
    }

    function collectTokens(address token) public onlyDelegate nonReentrant {
        uint256 amountToCollect = IERC20(token).balanceOf(address(this)).sub(userTokenBalances[TOTAL][token]);
        // only collect if 1) there are tokens to collect 2) token is whitelisted 3) token has non-zero balance
        require(amountToCollect > 0, 'no tokens to collect');
        require(tokenWhitelist[token], 'token to collect must be whitelisted');
        require(userTokenBalances[GUILD][token] > 0, 'token to collect must have non-zero guild bank balance');
        
        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) public nonReentrant {
        Proposal storage proposal = proposals[proposalId];
        require(!proposal.flags[0], "proposal has already been sponsored");
        require(!proposal.flags[3], "proposal has already been cancelled");
        require(msg.sender == proposal.proposer, "solely the proposer can cancel");

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

    function updateDelegateKey(address newDelegateKey) public nonReentrant onlyShareholder {
        require(newDelegateKey != address(0), "newDelegateKey cannot be 0");

        // skip checks if member is setting the delegate key to their member address
        if (newDelegateKey != msg.sender) {
            require(!members[newDelegateKey].exists, "cannot overwrite existing members");
            require(!members[memberAddressByDelegateKey[newDelegateKey]].exists, "cannot overwrite existing delegate 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 does not exist");
        return proposals[proposalQueue[highestIndexYesVote]].flags[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 getProposalQueueLength() public view returns (uint256) {
        return proposalQueue.length;
    }

    function getProposalFlags(uint256 proposalId) public view returns (bool[6] memory) {
        return proposals[proposalId].flags;
    }

    function getUserTokenBalance(address user, address token) public view returns (uint256) {
        return userTokenBalances[user][token];
    }

    function getMemberProposalVote(address memberAddress, uint256 proposalIndex) public view returns (Vote) {
        require(members[memberAddress].exists, "member does not exist");
        require(proposalIndex < proposalQueue.length, "proposal does not exist");
        return proposals[proposalQueue[proposalIndex]].votesByMember[memberAddress];
    }

    function getTokenCount() public view returns (uint256) {
        return approvedTokens.length;
    }

    /***************
    HELPER FUNCTIONS
    ***************/
    function unsafeAddToBalance(address user, address token, uint256 amount) internal {
        userTokenBalances[user][token] += amount;
        userTokenBalances[TOTAL][token] += amount;
    }

    function unsafeSubtractFromBalance(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 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;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"_summoners","type":"address[]"},{"internalType":"address[]","name":"_approvedTokens","type":"address[]"},{"internalType":"uint256","name":"_periodDuration","type":"uint256"},{"internalType":"uint256","name":"_votingPeriodLength","type":"uint256"},{"internalType":"uint256","name":"_gracePeriodLength","type":"uint256"},{"internalType":"uint256","name":"_proposalDeposit","type":"uint256"},{"internalType":"uint256","name":"_dilutionBound","type":"uint256"},{"internalType":"uint256","name":"_processingReward","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessGuildKickProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"didPass","type":"bool"}],"name":"ProcessWhitelistProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"Ragequit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegateKey","type":"address"},{"indexed":true,"internalType":"address","name":"memberAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"SponsorProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"applicant","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lootRequested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tributeOffered","type":"uint256"},{"indexed":false,"internalType":"address","name":"tributeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"paymentRequested","type":"uint256"},{"indexed":false,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"string","name":"details","type":"string"},{"indexed":false,"internalType":"bool[6]","name":"flags","type":"bool[6]"},{"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":"summoners","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"summoningTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"periodDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"votingPeriodLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gracePeriodLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dilutionBound","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"processingReward","type":"uint256"}],"name":"SummonComplete","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":"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"},{"constant":true,"inputs":[],"name":"ESCROW","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GUILD","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOTAL","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"}],"name":"canRagequit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"collectTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"depositToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dilutionBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"memberAddress","type":"address"},{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"getMemberProposalVote","outputs":[{"internalType":"enum Moloch.Vote","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalFlags","outputs":[{"internalType":"bool[6]","name":"","type":"bool[6]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getProposalQueueLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getUserTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gracePeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"startingPeriod","type":"uint256"}],"name":"hasVotingPeriodExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"memberAddressByDelegateKey","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"members","outputs":[{"internalType":"address","name":"delegateKey","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"loot","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"highestIndexYesVote","type":"uint256"},{"internalType":"uint256","name":"jailed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processGuildKickProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"processWhitelistProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"processingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"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":"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":"uint256","name":"startingPeriod","type":"uint256"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"string","name":"details","type":"string"},{"internalType":"uint256","name":"maxTotalSharesAndLootAtYesVote","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToKick","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposedToWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"memberToKick","type":"address"}],"name":"ragekick","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"sharesToBurn","type":"uint256"},{"internalType":"uint256","name":"lootToBurn","type":"uint256"}],"name":"ragequit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"sponsorProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"memberToKick","type":"address"},{"internalType":"string","name":"details","type":"string"}],"name":"submitGuildKickProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":"string","name":"details","type":"string"}],"name":"submitProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"uint8","name":"uintVote","type":"uint8"}],"name":"submitVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenToWhitelist","type":"address"},{"internalType":"string","name":"details","type":"string"}],"name":"submitWhitelistProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"summoningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalGuildBankTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newDelegateKey","type":"address"}],"name":"updateDelegateKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userTokenBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"votingPeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool","name":"max","type":"bool"}],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260006009556000600a556000600b556000600c553480156200002557600080fd5b5060405162005ad338038062005ad383398181016040526101008110156200004c57600080fd5b81019080805160405193929190846401000000008211156200006d57600080fd5b9083019060208201858111156200008357600080fd5b8251866020820283011164010000000082111715620000a157600080fd5b82525081516020918201928201910280838360005b83811015620000d0578181015183820152602001620000b6565b5050505090500160405260200180516040519392919084640100000000821115620000fa57600080fd5b9083019060208201858111156200011057600080fd5b82518660208202830111640100000000821117156200012e57600080fd5b82525081516020918201928201910280838360005b838110156200015d57818101518382015260200162000143565b505050509190910160409081526020830151908301516060840151608085015160a086015160c0909601516001600055939750919550939092509085620001eb576040805162461bcd60e51b815260206004820152601b60248201527f5f706572696f644475726174696f6e2063616e6e6f7420626520300000000000604482015290519081900360640190fd5b6000851162000241576040805162461bcd60e51b815260206004820152601f60248201527f5f766f74696e67506572696f644c656e6774682063616e6e6f74206265203000604482015290519081900360640190fd5b670de0b6b3a76400008511156200028a5760405162461bcd60e51b815260040180806020018281038252602181526020018062005a796021913960400191505060405180910390fd5b670de0b6b3a7640000841115620002e8576040805162461bcd60e51b815260206004820181905260248201527f5f6772616365506572696f644c656e6774682065786365656473206c696d6974604482015290519081900360640190fd5b600082116200033e576040805162461bcd60e51b815260206004820152601a60248201527f5f64696c7574696f6e426f756e642063616e6e6f742062652030000000000000604482015290519081900360640190fd5b670de0b6b3a76400008211156200039c576040805162461bcd60e51b815260206004820152601c60248201527f5f64696c7574696f6e426f756e642065786365656473206c696d697400000000604482015290519081900360640190fd5b6000875111620003f3576040805162461bcd60e51b815260206004820181905260248201527f6e656564206174206c65617374206f6e6520617070726f76656420746f6b656e604482015290519081900360640190fd5b610190875111156200043e576040805162461bcd60e51b815260206004820152600f60248201526e746f6f206d616e7920746f6b656e7360881b604482015290519081900360640190fd5b808310156200047f5760405162461bcd60e51b815260040180806020018281038252603981526020018062005a9a6039913960400191505060405180910390fd5b866000815181106200048d57fe5b6020026020010151600860006101000a8154816001600160a01b0302191690836001600160a01b031602179055508760405180828051906020019060200280838360005b83811015620004eb578181015183820152602001620004d1565b5050505090500191505060405180910390207f2a8214e48a490ec27a213653fe2c4d1efbcdc572f82d1d3d3d040665024e50aa8842898989898989604051808060200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182810382528a818151815260200191508051906020019060200280838360005b838110156200059257818101518382015260200162000578565b50505050905001995050505050505050505060405180910390a260005b8851811015620007815760006001600160a01b0316898281518110620005d157fe5b60200260200101516001600160a01b0316141562000636576040805162461bcd60e51b815260206004820152601460248201527f73756d6d6f6e65722063616e6e6f742062652030000000000000000000000000604482015290519081900360640190fd5b6040518060c001604052808a83815181106200064e57fe5b60200260200101516001600160a01b031681526020016001815260200160008152602001600115158152602001600081526020016000815250601260008b84815181106200069857fe5b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020845181546001600160a01b031916941693909317835583015160018301558201516002820155606082015160038201805460ff19169115159190911790556080820151600482015560a09091015160059091015588518990829081106200072357fe5b6020026020010151601360008b84815181106200073c57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b03191692909116919091179055600101620005af565b5060005b87518110156200093e5760006001600160a01b0316888281518110620007a757fe5b60200260200101516001600160a01b031614156200080c576040805162461bcd60e51b815260206004820152601a60248201527f5f617070726f766564546f6b656e2063616e6e6f742062652030000000000000604482015290519081900360640190fd5b600e60008983815181106200081d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161562000897576040805162461bcd60e51b815260206004820152601860248201527f6475706c696361746520617070726f76656420746f6b656e0000000000000000604482015290519081900360640190fd5b6001600e60008a8481518110620008aa57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600f888281518110620008f857fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b03909316929092179091550162000785565b50600195909555600293909355600391909155600455600555600655504260075551600a5561510680620009736000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c8063753d756311610167578063b2643aab116100ce578063e178034511610087578063e178034514610ae7578063e1a0e3fa14610b0d578063e63bc62d14610b2a578063e681c4aa14610b47578063f5d54c7714610b4f578063feb7ea1d14610b5757610295565b8063b2643aab14610a37578063b470aade14610a8c578063c89039c514610a94578063da35c66414610a9c578063dfdd369e14610aa4578063e0a8f6f514610aca57610295565b80639425a476116101205780639425a476146109aa5780639746d940146109c757806399653fbe146109e45780639d1722cb14610a0a578063a3dc380014610a12578063afe5475f14610a2f57610295565b8063753d75631461095c57806378a8956714610982578063797daf701461098a5780637d5b6c72146109925780638340bbce1461099a5780638b15a605146109a257610295565b80633793ab3c1161020b57806345f2d105116101c457806345f2d105146107ec578063590f940b1461081a57806359999b41146108f8578063635e99aa1461091e57806363858f2d1461092657806373f8fd4b1461092e57610295565b80633793ab3c146106255780633a98ef39146106425780633b214a741461064a5780633fc24bba14610667578063402c1794146106a15780634482394b146106c757610295565b80630cf20cc91161025d5780630cf20cc9146104b9578063115b2d18146104e757806315eb349e1461059b5780631dafede0146105be5780632582bf2a146105f757806327efc0861461061d57610295565b8063013cf08b1461029a57806303e32fa1146103e4578063044a0ca8146103fe578063086146d21461044e57806308ae4b0c14610456575b600080fd5b6102b7600480360360208110156102b057600080fd5b5035610c0b565b604051808f6001600160a01b03166001600160a01b031681526020018e6001600160a01b03166001600160a01b031681526020018d6001600160a01b03166001600160a01b031681526020018c81526020018b81526020018a8152602001896001600160a01b03166001600160a01b03168152602001888152602001876001600160a01b03166001600160a01b0316815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561039c578181015183820152602001610384565b50505050905090810190601f1680156103c95780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b6103ec610d6e565b60408051918252519081900360200190f35b61042a6004803603604081101561041457600080fd5b506001600160a01b038135169060200135610d74565b6040518082600281111561043a57fe5b60ff16815260200191505060405180910390f35b6103ec610e7c565b61047c6004803603602081101561046c57600080fd5b50356001600160a01b0316610eab565b604080516001600160a01b0390971687526020870195909552858501939093529015156060850152608084015260a0830152519081900360c00190f35b6104e5600480360360408110156104cf57600080fd5b506001600160a01b038135169060200135610eee565b005b6103ec600480360360408110156104fd57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561052757600080fd5b82018360208201111561053957600080fd5b803590602001918460018302840111600160201b8311171561055a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f4c945050505050565b6104e5600480360360408110156105b157600080fd5b50803590602001356110e3565b6105db600480360360208110156105d457600080fd5b50356111a9565b604080516001600160a01b039092168252519081900360200190f35b6104e56004803603602081101561060d57600080fd5b50356001600160a01b03166111d0565b6105db611430565b6104e56004803603602081101561063b57600080fd5b5035611436565b6103ec611651565b6103ec6004803603602081101561066057600080fd5b5035611657565b61068d6004803603602081101561067d57600080fd5b50356001600160a01b0316611675565b604080519115158252519081900360200190f35b6105db600480360360208110156106b757600080fd5b50356001600160a01b031661168a565b6104e5600480360360608110156106dd57600080fd5b810190602081018135600160201b8111156106f757600080fd5b82018360208201111561070957600080fd5b803590602001918460208302840111600160201b8311171561072a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077957600080fd5b82018360208201111561078b57600080fd5b803590602001918460208302840111600160201b831117156107ac57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050505035151590506116a5565b6103ec6004803603604081101561080257600080fd5b506001600160a01b03813581169160200135166117d7565b6103ec600480360361010081101561083157600080fd5b6001600160a01b038235811692602081013592604082013592606083013592608081013582169260a08201359260c0830135169190810190610100810160e0820135600160201b81111561088457600080fd5b82018360208201111561089657600080fd5b803590602001918460018302840111600160201b831117156108b757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117f4945050505050565b6104e56004803603602081101561090e57600080fd5b50356001600160a01b0316611c35565b6103ec611ef7565b6103ec611efd565b6103ec6004803603604081101561094457600080fd5b506001600160a01b0381358116916020013516611f03565b61068d6004803603602081101561097257600080fd5b50356001600160a01b0316611f2e565b6103ec611f43565b6103ec611f49565b6103ec611f4f565b6103ec611f55565b6103ec611f5b565b61068d600480360360208110156109c057600080fd5b5035611f61565b6104e5600480360360208110156109dd57600080fd5b5035611f88565b6104e5600480360360408110156109fa57600080fd5b508035906020013560ff1661265c565b6103ec612b1e565b61068d60048036036020811015610a2857600080fd5b5035612b24565b6103ec612bcd565b610a5460048036036020811015610a4d57600080fd5b5035612bd3565b604051808260c080838360005b83811015610a79578181015183820152602001610a61565b5050505090500191505060405180910390f35b6103ec612c3d565b6105db612c43565b6103ec612c52565b6104e560048036036020811015610aba57600080fd5b50356001600160a01b0316612c58565b6104e560048036036020811015610ae057600080fd5b5035612dba565b61068d60048036036020811015610afd57600080fd5b50356001600160a01b0316612f82565b6104e560048036036020811015610b2357600080fd5b5035612f97565b6104e560048036036020811015610b4057600080fd5b503561319e565b6105db61373b565b6105db613741565b6103ec60048036036040811015610b6d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b9757600080fd5b820183602082011115610ba957600080fd5b803590602001918460018302840111600160201b83111715610bca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613747945050505050565b60146020528060005260406000206000915090508060000160009054906101000a90046001600160a01b0316908060010160009054906101000a90046001600160a01b0316908060020160009054906101000a90046001600160a01b0316908060030154908060040154908060050154908060060160009054906101000a90046001600160a01b0316908060070154908060080160009054906101000a90046001600160a01b03169080600901549080600a01549080600b01549080600d018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050509080600e015490508e565b60065481565b6001600160a01b03821660009081526012602052604081206003015460ff16610ddc576040805162461bcd60e51b81526020600482015260156024820152741b595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6015548210610e2c576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6014600060158481548110610e3d57fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6000610ea5600154610e99600754426138be90919063ffffffff16565b9063ffffffff61390716565b90505b90565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b03909416949293919260ff9091169186565b60026000541415610f34576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055610f438282613949565b50506001600055565b600060026000541415610f94576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055610fa1614a6c565b506001600160a01b03808416600090815260126020908152604091829020825160c081018452815490941684526001810154918401829052600281015492840192909252600382015460ff16151560608401526004820154608084015260059091015460a083015215158061101a575060008160400151115b6110555760405162461bcd60e51b815260040180806020018281038252602f815260200180614e6c602f913960400191505060405180910390fd5b6001600160a01b038416600090815260126020526040902060050154156110ad5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ddd6021913960400191505060405180910390fd5b6110b5614aad565b600160a08201526110ce85600080808080808b89613ac8565b50506009546001600055600019019392505050565b60026000541415611129576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081553381526012602052604090206001015415158061115e57503360009081526012602052604090206002015415155b61119e576040805162461bcd60e51b815260206004820152600c60248201526b3737ba10309036b2b6b132b960a11b604482015290519081900360640190fd5b610f43338383613e82565b600f81815481106111b657fe5b6000918252602090912001546001600160a01b0316905081565b60026000541415611216576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600090815533815260126020526040902060010154611272576040805162461bcd60e51b81526020600482015260116024820152703737ba10309039b430b932b437b63232b960791b604482015290519081900360640190fd5b6001600160a01b0381166112cd576040805162461bcd60e51b815260206004820152601a60248201527f6e657744656c65676174654b65792063616e6e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b03811633146113a2576001600160a01b03811660009081526012602052604090206003015460ff16156113385760405162461bcd60e51b8152600401808060200182810382526021815260200180614f8c6021913960400191505060405180910390fd5b6001600160a01b03808216600090815260136020908152604080832054909316825260129052206003015460ff16156113a25760405162461bcd60e51b8152600401808060200182810382526027815260200180614cb96027913960400191505060405180910390fd5b33600081815260126020908152604080832080546001600160a01b0390811685526013845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506001600055565b61babe81565b6002600054141561147c576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260005561148a8161417b565b60006015828154811061149957fe5b60009182526020808320919091015480835260149091526040909120600c81015491925090600160201b900460ff16611519576040805162461bcd60e51b815260206004820152601c60248201527f6d75737420626520612077686974656c6973742070726f706f73616c00000000604482015290519081900360640190fd5b600c8101805461ff0019166101001790556000611535846144e4565b600f5490915061019011611547575060005b80156115d857600c8201805462ff00001916620100001790556006820180546001600160a01b039081166000908152600e60205260408120805460ff191660019081179091559254600f805494850181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8029092018054929091166001600160a01b03199092169190911790555b60068201546001600160a01b039081166000908152601060205260409020805460ff19169055600283015461160d9116614723565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a3505060016000555050565b600a5481565b6015818154811061166457fe5b600091825260209091200154905081565b60116020526000908152604090205460ff1681565b6013602052600090815260409020546001600160a01b031681565b600260005414156116eb576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260005581518351146117305760405162461bcd60e51b8152600401808060200182810382526032815260200180614e9b6032913960400191505060405180910390fd5b60005b83518110156117cc57600083828151811061174a57fe5b6020026020010151905082156117a657336000908152600d60205260408120865190919087908590811061177a57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205490505b6117c38583815181106117b557fe5b602002602001015182613949565b50600101611733565b505060016000555050565b600d60209081526000928352604080842090915290825290205481565b60006002600054141561183c576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055670de0b6b3a764000061185a898963ffffffff61477816565b11156118ad576040805162461bcd60e51b815260206004820152601960248201527f746f6f206d616e79207368617265732072657175657374656400000000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff1661191a576040805162461bcd60e51b815260206004820152601f60248201527f74726962757465546f6b656e206973206e6f742077686974656c697374656400604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611987576040805162461bcd60e51b815260206004820152601a60248201527f7061796d656e74206973206e6f742077686974656c6973746564000000000000604482015290519081900360640190fd5b6001600160a01b0389166119da576040805162461bcd60e51b815260206004820152601560248201527406170706c6963616e742063616e6e6f74206265203605c1b604482015290519081900360640190fd5b6001600160a01b03891661dead14801590611a0057506001600160a01b03891661beef14155b8015611a1757506001600160a01b03891661babe14155b611a525760405162461bcd60e51b8152600401808060200182810382526024815260200180614d726024913960400191505060405180910390fd5b6001600160a01b03891660009081526012602052604090206005015415611aaa5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f236025913960400191505060405180910390fd5b600086118015611add57506001600160a01b0385166000908152600080516020614ecd8339815191526020526040902054155b15611b235760c8600c5410611b235760405162461bcd60e51b8152600401808060200182810382526047815260200180614d966047913960600191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b038716916323b872dd9160648083019260209291908290030181600087803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b5051611bf5576040805162461bcd60e51b815260206004820152601d60248201527f7472696275746520746f6b656e207472616e73666572206661696c6564000000604482015290519081900360640190fd5b611c0261beef86886147d2565b611c0a614aad565b611c1b8a8a8a8a8a8a8a8a89613ac8565b505060095460001901600160005598975050505050505050565b336000908152601360209081526040808320546001600160a01b031683526012909152902060010154611ca0576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b60026000541415611ce6576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081556001600160a01b0382168082527fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c602090815260408084205481516370a0823160e01b81523060048201529151611d9c94919391926370a08231926024808301939192829003018186803b158015611d6457600080fd5b505afa158015611d78573d6000803e3d6000fd5b505050506040513d6020811015611d8e57600080fd5b50519063ffffffff6138be16565b905060008111611dea576040805162461bcd60e51b81526020600482015260146024820152731b9bc81d1bdad95b9cc81d1bc818dbdb1b1958dd60621b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16611e415760405162461bcd60e51b8152600401808060200182810382526024815260200180614e216024913960400191505060405180910390fd5b6001600160a01b0382166000908152600080516020614ecd8339815191526020526040902054611ea25760405162461bcd60e51b8152600401808060200182810382526036815260200180614eed6036913960400191505060405180910390fd5b611eaf61dead83836147d2565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b600b5481565b60035481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b600e6020526000908152604090205460ff1681565b600f5490565b60155490565b60075481565b60025481565b60045481565b6000611f786002548361477890919063ffffffff16565b611f80610e7c565b101592915050565b60026000541415611fce576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155338152601360209081526040808320546001600160a01b03168352601290915290206001015461203d576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b60085460048054604080516323b872dd60e01b815233938101939093523060248401526044830191909152516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561209d57600080fd5b505af11580156120b1573d6000803e3d6000fd5b505050506040513d60208110156120c757600080fd5b50516121045760405162461bcd60e51b815260040180806020018281038252602681526020018061501b6026913960400191505060405180910390fd5b6008546004546121239161beef916001600160a01b03909116906147d2565b600081815260146020526040902060018101546001600160a01b0316612190576040805162461bcd60e51b815260206004820181905260248201527f70726f706f73616c206d7573742068617665206265656e2070726f706f736564604482015290519081900360640190fd5b600c81015460ff16156121d45760405162461bcd60e51b8152600401808060200182810382526023815260200180614f486023913960400191505060405180910390fd5b600c8101546301000000900460ff1615612235576040805162461bcd60e51b815260206004820152601b60248201527f70726f706f73616c20686173206265656e2063616e63656c6c65640000000000604482015290519081900360640190fd5b80546001600160a01b03166000908152601260205260409020600501541561228e5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f236025913960400191505060405180910390fd5b600081600501541180156122c9575060068101546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054155b1561230f5760c8600c541061230f5760405162461bcd60e51b8152600401808060200182810382526048815260200180614fd36048913960600191505060405180910390fd5b600c810154600160201b900460ff161561245f5760068101546001600160a01b03166000908152600e602052604090205460ff161561237f5760405162461bcd60e51b81526004018080602001828103825260298152602001806150866029913960400191505060405180910390fd5b60068101546001600160a01b031660009081526010602052604090205460ff16156123f1576040805162461bcd60e51b815260206004820152601d60248201527f616c72656164792070726f706f73656420746f2077686974656c697374000000604482015290519081900360640190fd5b600f54610190116124335760405162461bcd60e51b8152600401808060200182810382526027815260200180614e456027913960400191505060405180910390fd5b60068101546001600160a01b03166000908152601060205260409020805460ff19166001179055612509565b600c81015465010000000000900460ff16156125095780546001600160a01b031660009081526011602052604090205460ff16156124e4576040805162461bcd60e51b815260206004820152601860248201527f616c72656164792070726f706f73656420746f206b69636b0000000000000000604482015290519081900360640190fd5b80546001600160a01b03166000908152601160205260409020805460ff191660011790555b600061257e600161257261251b610e7c565b6015541561256a576015805460149160009161253e90600163ffffffff6138be16565b8154811061254857fe5b906000526020600020015481526020019081526020016000206009015461256d565b60005b614830565b9063ffffffff61477816565b60098301819055336000818152601360205260408120546002860180546001600160a01b0319166001600160a01b039092169182179055600c8601805460ff19166001908117909155601580548083018255938190527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4759093018890559154939450928392917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd91889161263291906138be565b604080519283526020830191909152818101879052519081900360600190a3505060016000555050565b600260005414156126a2576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155338152601360209081526040808320546001600160a01b031683526012909152902060010154612711576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b336000908152601360209081526040808320546001600160a01b031680845260129092529091206015548410612788576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6000601460006015878154811061279b57fe5b90600052602060002001548152602001908152602001600020905060038460ff1610612804576040805162461bcd60e51b81526020600482015260136024820152726d757374206265206c657373207468616e203360681b604482015290519081900360640190fd5b60008460ff16600281111561281557fe5b90508160090154612824610e7c565b1015612877576040805162461bcd60e51b815260206004820152601d60248201527f766f74696e6720706572696f6420686173206e6f742073746172746564000000604482015290519081900360640190fd5b6128848260090154611f61565b156128c05760405162461bcd60e51b81526004018080602001828103825260228152602001806150416022913960400191505060405180910390fd5b6001600160a01b0384166000908152600f8301602052604081205460ff1660028111156128e957fe5b1461293b576040805162461bcd60e51b815260206004820152601860248201527f6d656d6265722068617320616c726561647920766f7465640000000000000000604482015290519081900360640190fd5b600181600281111561294957fe5b14806129605750600281600281111561295e57fe5b145b6129b1576040805162461bcd60e51b815260206004820152601d60248201527f766f7465206d7573742062652065697468657220596573206f72204e6f000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600f830160205260409020805482919060ff191660018360028111156129e257fe5b021790555060018160028111156129f557fe5b1415612a6d576001830154600a830154612a149163ffffffff61477816565b600a8301556004830154861115612a2d57600483018690555b600e820154600b54600a54612a479163ffffffff61477816565b1115612a6857600b54600a54612a629163ffffffff61477816565b600e8301555b612aa0565b6002816002811115612a7b57fe5b1415612aa0576001830154600b830154612a9a9163ffffffff61477816565b600b8301555b836001600160a01b0316336001600160a01b0316877f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a2060158a81548110612ae357fe5b906000526020600020015489604051808381526020018260ff1660ff1681526020019250505060405180910390a45050600160005550505050565b600c5481565b6015546000908210612b77576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6014600060158481548110612b8857fe5b90600052602060002001548152602001908152602001600020600c01600160068110612bb057fe5b602081049091015460ff601f9092166101000a9004169050919050565b60055481565b612bdb614aad565b600082815260146020526040808220815160c081019283905292600c909101916006918390855b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411612c02575094979650505050505050565b60015481565b6008546001600160a01b031681565b60095481565b60026000541415612c9e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03821681526012602052604090206005810154612d09576040805162461bcd60e51b81526020600482015260166024820152751b595b58995c881b5d5cdd081899481a5b881a985a5b60521b604482015290519081900360640190fd5b6000816002015411612d62576040805162461bcd60e51b815260206004820152601a60248201527f6d656d626572206d757374206861766520736f6d65206c6f6f74000000000000604482015290519081900360640190fd5b612d6f8160040154612b24565b612daa5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d00604d913960600191505060405180910390fd5b610f438260008360020154613e82565b60026000541415612e00576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155818152601460205260409020600c81015460ff1615612e575760405162461bcd60e51b8152600401808060200182810382526023815260200180614f486023913960400191505060405180910390fd5b600c8101546301000000900460ff1615612ea25760405162461bcd60e51b81526004018080602001828103825260238152602001806150636023913960400191505060405180910390fd5b60018101546001600160a01b03163314612f03576040805162461bcd60e51b815260206004820152601e60248201527f736f6c656c79207468652070726f706f7365722063616e2063616e63656c0000604482015290519081900360640190fd5b600c8101805463ff00000019166301000000179055600181015460068201546005830154612f439261beef926001600160a01b0391821692911690614847565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506001600055565b60106020526000908152604090205460ff1681565b60026000541415612fdd576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055612feb8161417b565b600060158281548110612ffa57fe5b60009182526020808320919091015480835260149091526040909120600c8101549192509065010000000000900460ff1661307c576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652061206775696c64206b69636b2070726f706f73616c000000604482015290519081900360640190fd5b600c8101805461ff0019166101001790556000613098846144e4565b9050801561312857600c8201805462ff000019166201000017905581546001600160a01b0316600090815260126020526040902060058101859055600181015460028201546130e691614778565b60028201556001810154600a546131029163ffffffff6138be16565b600a556001810154600b5461311c9163ffffffff61477816565b600b5560006001909101555b81546001600160a01b039081166000908152601160205260409020805460ff19169055600283015461315a9116614723565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b600260005414156131e4576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000556131f28161417b565b60006015828154811061320157fe5b60009182526020808320919091015480835260149091526040909120600c81015491925090600160201b900460ff1615801561324b5750600c81015465010000000000900460ff16155b61329c576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742062652061207374616e646172642070726f706f73616c0000000000604482015290519081900360640190fd5b600c8101805461ff00191661010017905560006132b8846144e4565b9050670de0b6b3a76400006132ea83600401546125728560030154612572600b54600a5461477890919063ffffffff16565b11156132f4575060005b60088201546001600160a01b03166000908152600080516020614ecd83398151915260205260409020546007830154111561332d575060005b60008260050154118015613368575060068201546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054155b8015613377575060c8600c5410155b15613380575060005b80156136b557600c8201805462ff000019166201000017905581546001600160a01b031660009081526012602052604090206003015460ff161561345757600382015482546001600160a01b03166000908152601260205260409020600101546133ef9163ffffffff61477816565b82546001600160a01b039081166000908152601260205260408082206001019390935560048501548554909216815291909120600201546134359163ffffffff61477816565b82546001600160a01b031660009081526012602052604090206002015561359a565b81546001600160a01b03908116600090815260136020908152604080832054909316825260129052206003015460ff16156134db5781546001600160a01b0390811660009081526013602090815260408083205490931680835283832080546001600160a01b03199081168317909155601290925292909120805490911690911790555b6040805160c08101825283546001600160a01b0390811680835260038087015460208086019182526004808a0154878901908152600160608901818152600060808b0181815260a08c01828152998252601287528c82209b518c54908c166001600160a01b0319918216178d559751938c0193909355925160028b015551958901805496151560ff1990971696909617909555935190870155925160059095019490945586549092168083526013909152929020805490911690911790555b6003820154600a546135b19163ffffffff61477816565b600a556004820154600b546135cb9163ffffffff61477816565b600b5560068201546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054158015613609575060008260050154115b1561361857600c805460010190555b6006820154600583015461363d9161beef9161dead916001600160a01b031690614847565b8154600883015460078401546136659261dead926001600160a01b0391821692911690614847565b60088201546001600160a01b03166000908152600080516020614ecd83398151915260205260409020541580156136a0575060008260070154115b156136b057600c80546000190190555b6136e0565b6001820154600683015460058401546136e09261beef926001600160a01b0391821692911690614847565b60028201546136f7906001600160a01b0316614723565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61beef81565b61dead81565b60006002600054141561378f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000556001600160a01b0383166137ef576040805162461bcd60e51b815260206004820152601a60248201527f6d7573742070726f7669646520746f6b656e2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16156138475760405162461bcd60e51b81526004018080602001828103825260298152602001806150866029913960400191505060405180910390fd5b600f54610190116138895760405162461bcd60e51b8152600401808060200182810382526026815260200180614fad6026913960400191505060405180910390fd5b613891614aad565b600160808201526138aa60008080808881808a89613ac8565b505060095460001901600160005592915050565b600061390083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614863565b9392505050565b600061390083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148fa565b336000908152600d602090815260408083206001600160a01b03861684529091529020548111156139b8576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6139c333838361495f565b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b158015613a1257600080fd5b505af1158015613a26573d6000803e3d6000fd5b505050506040513d6020811015613a3c57600080fd5b5051613a81576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b613ad0614acb565b604051806101e001604052808b6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b031681526020018a8152602001898152602001888152602001876001600160a01b03168152602001868152602001856001600160a01b03168152602001600081526020016000815260200160008152602001838152602001848152602001600081525090508060146000600954815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01906006613cc1929190614b74565b506101a08201518051613cde91600d840191602090910190614c06565b506101c082015181600e0155905050600060136000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b0316336001600160a01b03168c6001600160a01b03167fa763e0f5e4f4e33a3397b4ba22677c9b6fd2075ed6504596333006ff2f3e38748d8d8d8d8d8d8d8d600954604051808a8152602001898152602001888152602001876001600160a01b03166001600160a01b03168152602001868152602001856001600160a01b03166001600160a01b031681526020018060200184600660200280838360005b83811015613de8578181015183820152602001613dd0565b50505050905001838152602001828103825285818151815260200191508051906020019080838360005b83811015613e2a578181015183820152602001613e12565b50505050905090810190601f168015613e575780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a45050600980546001019055505050505050505050565b6000613e9b600b54600a5461477890919063ffffffff16565b6001600160a01b0385166000908152601260205260409020600181015491925090841115613f06576040805162461bcd60e51b8152602060048201526013602482015272696e73756666696369656e742073686172657360681b604482015290519081900360640190fd5b8281600201541015613f53576040805162461bcd60e51b81526020600482015260116024820152701a5b9cdd59999a58da595b9d081b1bdbdd607a1b604482015290519081900360640190fd5b613f608160040154612b24565b613f9b5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d00604d913960600191505060405180910390fd5b6000613fad858563ffffffff61477816565b6001830154909150613fc5908663ffffffff6138be16565b60018301556002820154613fdf908563ffffffff6138be16565b6002830155600a54613ff7908663ffffffff6138be16565b600a55600b5461400d908563ffffffff6138be16565b600b5560005b600f548110156141385761dead6000908152600d602052600f805461407b91600080516020614ecd833981519152918491908690811061404f57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205484876149bf565b9050801561412f5761dead6000908152600d602052600f80548392600080516020614ecd833981519152929091869081106140b257fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b168252600d909252908120600f8054849391908690811061410357fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614013565b506040805186815260208101869052815133927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a2505050505050565b60155481106141cb576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6141d3614acb565b60146000601584815481106141e457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b039081168252600183015481169582019590955260028201548516818501526003820154606082015260048201546080820152600582015460a0820152600680830154861660c080840191909152600784015460e084015260088401549096166101008301526009830154610120830152600a830154610140830152600b83015461016083015284519586019485905290949193610180860193600c86019291908390855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116142ba57505050928452505050600d8201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561437d5780601f106143525761010080835404028352916020019161437d565b820191906000526020600020905b81548152906001019060200180831161436057829003601f168201915b50505050508152602001600e8201548152505090506143b260035461257260025484610120015161477890919063ffffffff16565b6143ba610e7c565b10156143f75760405162461bcd60e51b8152600401808060200182810382526025815260200180614d4d6025913960400191505060405180910390fd5b610180810151602001511561443d5760405162461bcd60e51b81526004018080602001828103825260238152602001806150af6023913960400191505060405180910390fd5b8115806144a5575060146000601561445c85600163ffffffff6138be16565b8154811061446657fe5b90600052602060002001548152602001908152602001600020600c0160016006811061448e57fe5b602081049091015460ff601f9092166101000a9004165b6144e05760405162461bcd60e51b8152600401808060200182810382526023815260200180614dfe6023913960400191505060405180910390fd5b5050565b60006144ee614acb565b60146000601585815481106144ff57fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b039081168252600183015481169582019590955260028201548516818501526003820154606082015260048201546080820152600582015460a0820152600680830154861660c080840191909152600784015460e084015260088401549096166101008301526009830154610120830152600a830154610140830152600b83015461016083015284519586019485905290949193610180860193600c86019291908390855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116145d557505050928452505050600d8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156146985780601f1061466d57610100808354040283529160200191614698565b820191906000526020600020905b81548152906001019060200180831161467b57829003601f168201915b50505050508152602001600e820154815250509050806101600151816101400151119150806101c001516146eb6005546146df600b54600a5461477890919063ffffffff16565b9063ffffffff614a1316565b10156146f657600091505b80516001600160a01b03166000908152601260205260409020600501541561471d57600091505b50919050565b6008546006546147429161beef9133916001600160a01b031690614847565b6008546006546004546147759261beef9285926001600160a01b03909216916147709163ffffffff6138be16565b614847565b50565b600082820183811015613900576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b039283166000908152600d602090815260408083209490951682529283528381208054830190557fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c90925291902080549091019055565b6000818310156148405781613900565b5090919050565b61485284838361495f565b61485d8383836147d2565b50505050565b600081848411156148f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148b757818101518382015260200161489f565b50505050905090810190601f1680156148e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836149495760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148b757818101518382015260200161489f565b50600083858161495557fe5b0495945050505050565b6001600160a01b039283166000908152600d60209081526040808320949095168252928352838120805483900390557fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c9092529190208054919091039055565b6000816149cb57600080fd5b836149d857506000613900565b838302838582816149e557fe5b0414156149fe578281816149f557fe5b04915050613900565b83838681614a0857fe5b040295945050505050565b600082614a2257506000610e76565b82820282848281614a2f57fe5b04146139005760405162461bcd60e51b8152600401808060200182810382526021815260200180614f6b6021913960400191505060405180910390fd5b6040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160001515815260200160008152602001600081525090565b6040518060c001604052806006906020820280388339509192915050565b604051806101e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001614b60614aad565b815260200160608152602001600081525090565b600183019183908215614bf65791602002820160005b83821115614bc757835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302614b8a565b8015614bf45782816101000a81549060ff0219169055600101602081600001049283019260010302614bc7565b505b50614c02929150614c80565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c4757805160ff1916838001178555614c74565b82800160010185558215614c74579182015b82811115614c74578251825591602001919060010190614c59565b50614c02929150614c9e565b610ea891905b80821115614c0257805460ff19168155600101614c86565b610ea891905b80821115614c025760008155600101614ca456fe63616e6e6f74206f7665727772697465206578697374696e672064656c6567617465206b6579735265656e7472616e637947756172643a207265656e7472616e742063616c6c0063616e6e6f7420726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f74656420594553206f6e2069732070726f63657373656470726f706f73616c206973206e6f7420726561647920746f2062652070726f6365737365646170706c6963616e7420616464726573732063616e6e6f7420626520726573657276656463616e6e6f74207375626d6974206d6f726520747269627574652070726f706f73616c7320666f72206e657720746f6b656e73202d206775696c6462616e6b2069732066756c6c6d656d626572206d757374206e6f7420616c7265616479206265206a61696c656470726576696f75732070726f706f73616c206d7573742062652070726f636573736564746f6b656e20746f20636f6c6c656374206d7573742062652077686974656c697374656463616e6e6f742073706f6e736f72206d6f72652077686974656c6973742070726f706f73616c736d656d626572206d7573742068617665206174206c65617374206f6e65207368617265206f72206f6e65206c6f6f74746f6b656e7320616e6420616d6f756e747320617272617973206d757374206265206d61746368696e67206c656e67746873dc7fafdc41998a74ecacb8f8bd877011aba1f1d03a3a0d37a2e7879a393b1d6a746f6b656e20746f20636f6c6c656374206d7573742068617665206e6f6e2d7a65726f206775696c642062616e6b2062616c616e636570726f706f73616c206170706c6963616e74206d757374206e6f74206265206a61696c656470726f706f73616c2068617320616c7265616479206265656e2073706f6e736f726564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616e6e6f74206f7665727772697465206578697374696e67206d656d6265727363616e6e6f74207375626d6974206d6f72652077686974656c6973742070726f706f73616c7363616e6e6f742073706f6e736f72206d6f726520747269627574652070726f706f73616c7320666f72206e657720746f6b656e73202d206775696c6462616e6b2069732066756c6c70726f706f73616c206465706f73697420746f6b656e207472616e73666572206661696c656470726f706f73616c20766f74696e6720706572696f6420686173206578706972656470726f706f73616c2068617320616c7265616479206265656e2063616e63656c6c656463616e6e6f7420616c726561647920686176652077686974656c69737465642074686520746f6b656e70726f706f73616c2068617320616c7265616479206265656e2070726f636573736564a265627a7a72315820eba0b3393f41c9b9cb3244afe1f8c1d338844a4dcaa31cdc4cb50b947eba16cc64736f6c634300051100325f766f74696e67506572696f644c656e6774682065786365656473206c696d69745f70726f706f73616c4465706f7369742063616e6e6f7420626520736d616c6c6572207468616e205f70726f63657373696e6752657761726400000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000001c0aa8ccd568d90d61659f060d1bfb1e6f855a20000000000000000000000000c89b6f0146642688bb254bf93c28fccf1e182c810000000000000000000000005608169973d639649196a84ee4085a708bcbf3970000000000000000000000007587caefc8096f5f40acb83a09df031a018c66ec00000000000000000000000019bc62ff7cd9ffd6bdced9802ff718f09f7259f10000000000000000000000003edeb7ccf325d0aec03cffb89768da2d6f0c26f10000000000000000000000000f50d31b3eaefd65236dd3736b863cffa4c63c4e000000000000000000000000fa9b5f7fdc8ab34aaf3099889475d47febf830d7000000000000000000000000fbe18f066f9583dac19c88444bc2005c99881e56000000000000000000000000320cf69bf1d9b3f942d09dce2fc7159aa1ff80d7000000000000000000000000d3f03984a90fd15e909b2e9467e98cadea181da30000000000000000000000000000000000000000000000000000000000000009000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268880000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c1000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c8063753d756311610167578063b2643aab116100ce578063e178034511610087578063e178034514610ae7578063e1a0e3fa14610b0d578063e63bc62d14610b2a578063e681c4aa14610b47578063f5d54c7714610b4f578063feb7ea1d14610b5757610295565b8063b2643aab14610a37578063b470aade14610a8c578063c89039c514610a94578063da35c66414610a9c578063dfdd369e14610aa4578063e0a8f6f514610aca57610295565b80639425a476116101205780639425a476146109aa5780639746d940146109c757806399653fbe146109e45780639d1722cb14610a0a578063a3dc380014610a12578063afe5475f14610a2f57610295565b8063753d75631461095c57806378a8956714610982578063797daf701461098a5780637d5b6c72146109925780638340bbce1461099a5780638b15a605146109a257610295565b80633793ab3c1161020b57806345f2d105116101c457806345f2d105146107ec578063590f940b1461081a57806359999b41146108f8578063635e99aa1461091e57806363858f2d1461092657806373f8fd4b1461092e57610295565b80633793ab3c146106255780633a98ef39146106425780633b214a741461064a5780633fc24bba14610667578063402c1794146106a15780634482394b146106c757610295565b80630cf20cc91161025d5780630cf20cc9146104b9578063115b2d18146104e757806315eb349e1461059b5780631dafede0146105be5780632582bf2a146105f757806327efc0861461061d57610295565b8063013cf08b1461029a57806303e32fa1146103e4578063044a0ca8146103fe578063086146d21461044e57806308ae4b0c14610456575b600080fd5b6102b7600480360360208110156102b057600080fd5b5035610c0b565b604051808f6001600160a01b03166001600160a01b031681526020018e6001600160a01b03166001600160a01b031681526020018d6001600160a01b03166001600160a01b031681526020018c81526020018b81526020018a8152602001896001600160a01b03166001600160a01b03168152602001888152602001876001600160a01b03166001600160a01b0316815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561039c578181015183820152602001610384565b50505050905090810190601f1680156103c95780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390f35b6103ec610d6e565b60408051918252519081900360200190f35b61042a6004803603604081101561041457600080fd5b506001600160a01b038135169060200135610d74565b6040518082600281111561043a57fe5b60ff16815260200191505060405180910390f35b6103ec610e7c565b61047c6004803603602081101561046c57600080fd5b50356001600160a01b0316610eab565b604080516001600160a01b0390971687526020870195909552858501939093529015156060850152608084015260a0830152519081900360c00190f35b6104e5600480360360408110156104cf57600080fd5b506001600160a01b038135169060200135610eee565b005b6103ec600480360360408110156104fd57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561052757600080fd5b82018360208201111561053957600080fd5b803590602001918460018302840111600160201b8311171561055a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f4c945050505050565b6104e5600480360360408110156105b157600080fd5b50803590602001356110e3565b6105db600480360360208110156105d457600080fd5b50356111a9565b604080516001600160a01b039092168252519081900360200190f35b6104e56004803603602081101561060d57600080fd5b50356001600160a01b03166111d0565b6105db611430565b6104e56004803603602081101561063b57600080fd5b5035611436565b6103ec611651565b6103ec6004803603602081101561066057600080fd5b5035611657565b61068d6004803603602081101561067d57600080fd5b50356001600160a01b0316611675565b604080519115158252519081900360200190f35b6105db600480360360208110156106b757600080fd5b50356001600160a01b031661168a565b6104e5600480360360608110156106dd57600080fd5b810190602081018135600160201b8111156106f757600080fd5b82018360208201111561070957600080fd5b803590602001918460208302840111600160201b8311171561072a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077957600080fd5b82018360208201111561078b57600080fd5b803590602001918460208302840111600160201b831117156107ac57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050505035151590506116a5565b6103ec6004803603604081101561080257600080fd5b506001600160a01b03813581169160200135166117d7565b6103ec600480360361010081101561083157600080fd5b6001600160a01b038235811692602081013592604082013592606083013592608081013582169260a08201359260c0830135169190810190610100810160e0820135600160201b81111561088457600080fd5b82018360208201111561089657600080fd5b803590602001918460018302840111600160201b831117156108b757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117f4945050505050565b6104e56004803603602081101561090e57600080fd5b50356001600160a01b0316611c35565b6103ec611ef7565b6103ec611efd565b6103ec6004803603604081101561094457600080fd5b506001600160a01b0381358116916020013516611f03565b61068d6004803603602081101561097257600080fd5b50356001600160a01b0316611f2e565b6103ec611f43565b6103ec611f49565b6103ec611f4f565b6103ec611f55565b6103ec611f5b565b61068d600480360360208110156109c057600080fd5b5035611f61565b6104e5600480360360208110156109dd57600080fd5b5035611f88565b6104e5600480360360408110156109fa57600080fd5b508035906020013560ff1661265c565b6103ec612b1e565b61068d60048036036020811015610a2857600080fd5b5035612b24565b6103ec612bcd565b610a5460048036036020811015610a4d57600080fd5b5035612bd3565b604051808260c080838360005b83811015610a79578181015183820152602001610a61565b5050505090500191505060405180910390f35b6103ec612c3d565b6105db612c43565b6103ec612c52565b6104e560048036036020811015610aba57600080fd5b50356001600160a01b0316612c58565b6104e560048036036020811015610ae057600080fd5b5035612dba565b61068d60048036036020811015610afd57600080fd5b50356001600160a01b0316612f82565b6104e560048036036020811015610b2357600080fd5b5035612f97565b6104e560048036036020811015610b4057600080fd5b503561319e565b6105db61373b565b6105db613741565b6103ec60048036036040811015610b6d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b9757600080fd5b820183602082011115610ba957600080fd5b803590602001918460018302840111600160201b83111715610bca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613747945050505050565b60146020528060005260406000206000915090508060000160009054906101000a90046001600160a01b0316908060010160009054906101000a90046001600160a01b0316908060020160009054906101000a90046001600160a01b0316908060030154908060040154908060050154908060060160009054906101000a90046001600160a01b0316908060070154908060080160009054906101000a90046001600160a01b03169080600901549080600a01549080600b01549080600d018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d5e5780601f10610d3357610100808354040283529160200191610d5e565b820191906000526020600020905b815481529060010190602001808311610d4157829003601f168201915b50505050509080600e015490508e565b60065481565b6001600160a01b03821660009081526012602052604081206003015460ff16610ddc576040805162461bcd60e51b81526020600482015260156024820152741b595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6015548210610e2c576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6014600060158481548110610e3d57fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b0387168252600f0190925290205460ff1690505b92915050565b6000610ea5600154610e99600754426138be90919063ffffffff16565b9063ffffffff61390716565b90505b90565b6012602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b03909416949293919260ff9091169186565b60026000541415610f34576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055610f438282613949565b50506001600055565b600060026000541415610f94576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055610fa1614a6c565b506001600160a01b03808416600090815260126020908152604091829020825160c081018452815490941684526001810154918401829052600281015492840192909252600382015460ff16151560608401526004820154608084015260059091015460a083015215158061101a575060008160400151115b6110555760405162461bcd60e51b815260040180806020018281038252602f815260200180614e6c602f913960400191505060405180910390fd5b6001600160a01b038416600090815260126020526040902060050154156110ad5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ddd6021913960400191505060405180910390fd5b6110b5614aad565b600160a08201526110ce85600080808080808b89613ac8565b50506009546001600055600019019392505050565b60026000541415611129576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081553381526012602052604090206001015415158061115e57503360009081526012602052604090206002015415155b61119e576040805162461bcd60e51b815260206004820152600c60248201526b3737ba10309036b2b6b132b960a11b604482015290519081900360640190fd5b610f43338383613e82565b600f81815481106111b657fe5b6000918252602090912001546001600160a01b0316905081565b60026000541415611216576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600090815533815260126020526040902060010154611272576040805162461bcd60e51b81526020600482015260116024820152703737ba10309039b430b932b437b63232b960791b604482015290519081900360640190fd5b6001600160a01b0381166112cd576040805162461bcd60e51b815260206004820152601a60248201527f6e657744656c65676174654b65792063616e6e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b03811633146113a2576001600160a01b03811660009081526012602052604090206003015460ff16156113385760405162461bcd60e51b8152600401808060200182810382526021815260200180614f8c6021913960400191505060405180910390fd5b6001600160a01b03808216600090815260136020908152604080832054909316825260129052206003015460ff16156113a25760405162461bcd60e51b8152600401808060200182810382526027815260200180614cb96027913960400191505060405180910390fd5b33600081815260126020908152604080832080546001600160a01b0390811685526013845282852080546001600160a01b031990811690915590871680865294839020805482168717905581541684178155815193845290519093927fde7b64a369e10562cc2e71f0f1f944eaf144b75fead6ecb51fac9c4dd693488592908290030190a250506001600055565b61babe81565b6002600054141561147c576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260005561148a8161417b565b60006015828154811061149957fe5b60009182526020808320919091015480835260149091526040909120600c81015491925090600160201b900460ff16611519576040805162461bcd60e51b815260206004820152601c60248201527f6d75737420626520612077686974656c6973742070726f706f73616c00000000604482015290519081900360640190fd5b600c8101805461ff0019166101001790556000611535846144e4565b600f5490915061019011611547575060005b80156115d857600c8201805462ff00001916620100001790556006820180546001600160a01b039081166000908152600e60205260408120805460ff191660019081179091559254600f805494850181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8029092018054929091166001600160a01b03199092169190911790555b60068201546001600160a01b039081166000908152601060205260409020805460ff19169055600283015461160d9116614723565b6040805182151581529051849186917f2094fc13d2ecb0acd6861e82bd006c7e5ab6f312ec0c6cdfe3d1a01ee54d885a9181900360200190a3505060016000555050565b600a5481565b6015818154811061166457fe5b600091825260209091200154905081565b60116020526000908152604090205460ff1681565b6013602052600090815260409020546001600160a01b031681565b600260005414156116eb576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260005581518351146117305760405162461bcd60e51b8152600401808060200182810382526032815260200180614e9b6032913960400191505060405180910390fd5b60005b83518110156117cc57600083828151811061174a57fe5b6020026020010151905082156117a657336000908152600d60205260408120865190919087908590811061177a57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205490505b6117c38583815181106117b557fe5b602002602001015182613949565b50600101611733565b505060016000555050565b600d60209081526000928352604080842090915290825290205481565b60006002600054141561183c576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055670de0b6b3a764000061185a898963ffffffff61477816565b11156118ad576040805162461bcd60e51b815260206004820152601960248201527f746f6f206d616e79207368617265732072657175657374656400000000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff1661191a576040805162461bcd60e51b815260206004820152601f60248201527f74726962757465546f6b656e206973206e6f742077686974656c697374656400604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611987576040805162461bcd60e51b815260206004820152601a60248201527f7061796d656e74206973206e6f742077686974656c6973746564000000000000604482015290519081900360640190fd5b6001600160a01b0389166119da576040805162461bcd60e51b815260206004820152601560248201527406170706c6963616e742063616e6e6f74206265203605c1b604482015290519081900360640190fd5b6001600160a01b03891661dead14801590611a0057506001600160a01b03891661beef14155b8015611a1757506001600160a01b03891661babe14155b611a525760405162461bcd60e51b8152600401808060200182810382526024815260200180614d726024913960400191505060405180910390fd5b6001600160a01b03891660009081526012602052604090206005015415611aaa5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f236025913960400191505060405180910390fd5b600086118015611add57506001600160a01b0385166000908152600080516020614ecd8339815191526020526040902054155b15611b235760c8600c5410611b235760405162461bcd60e51b8152600401808060200182810382526047815260200180614d966047913960600191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b038716916323b872dd9160648083019260209291908290030181600087803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b5051611bf5576040805162461bcd60e51b815260206004820152601d60248201527f7472696275746520746f6b656e207472616e73666572206661696c6564000000604482015290519081900360640190fd5b611c0261beef86886147d2565b611c0a614aad565b611c1b8a8a8a8a8a8a8a8a89613ac8565b505060095460001901600160005598975050505050505050565b336000908152601360209081526040808320546001600160a01b031683526012909152902060010154611ca0576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b60026000541415611ce6576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081556001600160a01b0382168082527fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c602090815260408084205481516370a0823160e01b81523060048201529151611d9c94919391926370a08231926024808301939192829003018186803b158015611d6457600080fd5b505afa158015611d78573d6000803e3d6000fd5b505050506040513d6020811015611d8e57600080fd5b50519063ffffffff6138be16565b905060008111611dea576040805162461bcd60e51b81526020600482015260146024820152731b9bc81d1bdad95b9cc81d1bc818dbdb1b1958dd60621b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16611e415760405162461bcd60e51b8152600401808060200182810382526024815260200180614e216024913960400191505060405180910390fd5b6001600160a01b0382166000908152600080516020614ecd8339815191526020526040902054611ea25760405162461bcd60e51b8152600401808060200182810382526036815260200180614eed6036913960400191505060405180910390fd5b611eaf61dead83836147d2565b6040805182815290516001600160a01b038416917f9381e53ffdc9733a6783a6f8665be3f89c231bb81a6771996ed553b4e75c0fe3919081900360200190a250506001600055565b600b5481565b60035481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b600e6020526000908152604090205460ff1681565b600f5490565b60155490565b60075481565b60025481565b60045481565b6000611f786002548361477890919063ffffffff16565b611f80610e7c565b101592915050565b60026000541415611fce576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155338152601360209081526040808320546001600160a01b03168352601290915290206001015461203d576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b60085460048054604080516323b872dd60e01b815233938101939093523060248401526044830191909152516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561209d57600080fd5b505af11580156120b1573d6000803e3d6000fd5b505050506040513d60208110156120c757600080fd5b50516121045760405162461bcd60e51b815260040180806020018281038252602681526020018061501b6026913960400191505060405180910390fd5b6008546004546121239161beef916001600160a01b03909116906147d2565b600081815260146020526040902060018101546001600160a01b0316612190576040805162461bcd60e51b815260206004820181905260248201527f70726f706f73616c206d7573742068617665206265656e2070726f706f736564604482015290519081900360640190fd5b600c81015460ff16156121d45760405162461bcd60e51b8152600401808060200182810382526023815260200180614f486023913960400191505060405180910390fd5b600c8101546301000000900460ff1615612235576040805162461bcd60e51b815260206004820152601b60248201527f70726f706f73616c20686173206265656e2063616e63656c6c65640000000000604482015290519081900360640190fd5b80546001600160a01b03166000908152601260205260409020600501541561228e5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f236025913960400191505060405180910390fd5b600081600501541180156122c9575060068101546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054155b1561230f5760c8600c541061230f5760405162461bcd60e51b8152600401808060200182810382526048815260200180614fd36048913960600191505060405180910390fd5b600c810154600160201b900460ff161561245f5760068101546001600160a01b03166000908152600e602052604090205460ff161561237f5760405162461bcd60e51b81526004018080602001828103825260298152602001806150866029913960400191505060405180910390fd5b60068101546001600160a01b031660009081526010602052604090205460ff16156123f1576040805162461bcd60e51b815260206004820152601d60248201527f616c72656164792070726f706f73656420746f2077686974656c697374000000604482015290519081900360640190fd5b600f54610190116124335760405162461bcd60e51b8152600401808060200182810382526027815260200180614e456027913960400191505060405180910390fd5b60068101546001600160a01b03166000908152601060205260409020805460ff19166001179055612509565b600c81015465010000000000900460ff16156125095780546001600160a01b031660009081526011602052604090205460ff16156124e4576040805162461bcd60e51b815260206004820152601860248201527f616c72656164792070726f706f73656420746f206b69636b0000000000000000604482015290519081900360640190fd5b80546001600160a01b03166000908152601160205260409020805460ff191660011790555b600061257e600161257261251b610e7c565b6015541561256a576015805460149160009161253e90600163ffffffff6138be16565b8154811061254857fe5b906000526020600020015481526020019081526020016000206009015461256d565b60005b614830565b9063ffffffff61477816565b60098301819055336000818152601360205260408120546002860180546001600160a01b0319166001600160a01b039092169182179055600c8601805460ff19166001908117909155601580548083018255938190527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4759093018890559154939450928392917f2a383a979381335e3eb401ac01dd8083e024ff0256bf5338456ffc0063390bbd91889161263291906138be565b604080519283526020830191909152818101879052519081900360600190a3505060016000555050565b600260005414156126a2576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155338152601360209081526040808320546001600160a01b031683526012909152902060010154612711576040805162461bcd60e51b815260206004820152600e60248201526d6e6f7420612064656c656761746560901b604482015290519081900360640190fd5b336000908152601360209081526040808320546001600160a01b031680845260129092529091206015548410612788576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6000601460006015878154811061279b57fe5b90600052602060002001548152602001908152602001600020905060038460ff1610612804576040805162461bcd60e51b81526020600482015260136024820152726d757374206265206c657373207468616e203360681b604482015290519081900360640190fd5b60008460ff16600281111561281557fe5b90508160090154612824610e7c565b1015612877576040805162461bcd60e51b815260206004820152601d60248201527f766f74696e6720706572696f6420686173206e6f742073746172746564000000604482015290519081900360640190fd5b6128848260090154611f61565b156128c05760405162461bcd60e51b81526004018080602001828103825260228152602001806150416022913960400191505060405180910390fd5b6001600160a01b0384166000908152600f8301602052604081205460ff1660028111156128e957fe5b1461293b576040805162461bcd60e51b815260206004820152601860248201527f6d656d6265722068617320616c726561647920766f7465640000000000000000604482015290519081900360640190fd5b600181600281111561294957fe5b14806129605750600281600281111561295e57fe5b145b6129b1576040805162461bcd60e51b815260206004820152601d60248201527f766f7465206d7573742062652065697468657220596573206f72204e6f000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600f830160205260409020805482919060ff191660018360028111156129e257fe5b021790555060018160028111156129f557fe5b1415612a6d576001830154600a830154612a149163ffffffff61477816565b600a8301556004830154861115612a2d57600483018690555b600e820154600b54600a54612a479163ffffffff61477816565b1115612a6857600b54600a54612a629163ffffffff61477816565b600e8301555b612aa0565b6002816002811115612a7b57fe5b1415612aa0576001830154600b830154612a9a9163ffffffff61477816565b600b8301555b836001600160a01b0316336001600160a01b0316877f804f03797630bf8b8a46b9371608abbf7d78a20df720e477bab641957ca68a2060158a81548110612ae357fe5b906000526020600020015489604051808381526020018260ff1660ff1681526020019250505060405180910390a45050600160005550505050565b600c5481565b6015546000908210612b77576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6014600060158481548110612b8857fe5b90600052602060002001548152602001908152602001600020600c01600160068110612bb057fe5b602081049091015460ff601f9092166101000a9004169050919050565b60055481565b612bdb614aad565b600082815260146020526040808220815160c081019283905292600c909101916006918390855b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411612c02575094979650505050505050565b60015481565b6008546001600160a01b031681565b60095481565b60026000541415612c9e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b600260009081556001600160a01b03821681526012602052604090206005810154612d09576040805162461bcd60e51b81526020600482015260166024820152751b595b58995c881b5d5cdd081899481a5b881a985a5b60521b604482015290519081900360640190fd5b6000816002015411612d62576040805162461bcd60e51b815260206004820152601a60248201527f6d656d626572206d757374206861766520736f6d65206c6f6f74000000000000604482015290519081900360640190fd5b612d6f8160040154612b24565b612daa5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d00604d913960600191505060405180910390fd5b610f438260008360020154613e82565b60026000541415612e00576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000908155818152601460205260409020600c81015460ff1615612e575760405162461bcd60e51b8152600401808060200182810382526023815260200180614f486023913960400191505060405180910390fd5b600c8101546301000000900460ff1615612ea25760405162461bcd60e51b81526004018080602001828103825260238152602001806150636023913960400191505060405180910390fd5b60018101546001600160a01b03163314612f03576040805162461bcd60e51b815260206004820152601e60248201527f736f6c656c79207468652070726f706f7365722063616e2063616e63656c0000604482015290519081900360640190fd5b600c8101805463ff00000019166301000000179055600181015460068201546005830154612f439261beef926001600160a01b0391821692911690614847565b60408051338152905183917fc215fed6680bb02d323dc3f8b8f85241572607538426059c9232601bd293c3be919081900360200190a250506001600055565b60106020526000908152604090205460ff1681565b60026000541415612fdd576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b6002600055612feb8161417b565b600060158281548110612ffa57fe5b60009182526020808320919091015480835260149091526040909120600c8101549192509065010000000000900460ff1661307c576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652061206775696c64206b69636b2070726f706f73616c000000604482015290519081900360640190fd5b600c8101805461ff0019166101001790556000613098846144e4565b9050801561312857600c8201805462ff000019166201000017905581546001600160a01b0316600090815260126020526040902060058101859055600181015460028201546130e691614778565b60028201556001810154600a546131029163ffffffff6138be16565b600a556001810154600b5461311c9163ffffffff61477816565b600b5560006001909101555b81546001600160a01b039081166000908152601160205260409020805460ff19169055600283015461315a9116614723565b6040805182151581529051849186917f0e347d00d3e9e6cdff9e6c09092c9ff1bd448f9b3dfb7091b30939ec5e7a3c739181900360200190a3505060016000555050565b600260005414156131e4576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000556131f28161417b565b60006015828154811061320157fe5b60009182526020808320919091015480835260149091526040909120600c81015491925090600160201b900460ff1615801561324b5750600c81015465010000000000900460ff16155b61329c576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742062652061207374616e646172642070726f706f73616c0000000000604482015290519081900360640190fd5b600c8101805461ff00191661010017905560006132b8846144e4565b9050670de0b6b3a76400006132ea83600401546125728560030154612572600b54600a5461477890919063ffffffff16565b11156132f4575060005b60088201546001600160a01b03166000908152600080516020614ecd83398151915260205260409020546007830154111561332d575060005b60008260050154118015613368575060068201546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054155b8015613377575060c8600c5410155b15613380575060005b80156136b557600c8201805462ff000019166201000017905581546001600160a01b031660009081526012602052604090206003015460ff161561345757600382015482546001600160a01b03166000908152601260205260409020600101546133ef9163ffffffff61477816565b82546001600160a01b039081166000908152601260205260408082206001019390935560048501548554909216815291909120600201546134359163ffffffff61477816565b82546001600160a01b031660009081526012602052604090206002015561359a565b81546001600160a01b03908116600090815260136020908152604080832054909316825260129052206003015460ff16156134db5781546001600160a01b0390811660009081526013602090815260408083205490931680835283832080546001600160a01b03199081168317909155601290925292909120805490911690911790555b6040805160c08101825283546001600160a01b0390811680835260038087015460208086019182526004808a0154878901908152600160608901818152600060808b0181815260a08c01828152998252601287528c82209b518c54908c166001600160a01b0319918216178d559751938c0193909355925160028b015551958901805496151560ff1990971696909617909555935190870155925160059095019490945586549092168083526013909152929020805490911690911790555b6003820154600a546135b19163ffffffff61477816565b600a556004820154600b546135cb9163ffffffff61477816565b600b5560068201546001600160a01b03166000908152600080516020614ecd8339815191526020526040902054158015613609575060008260050154115b1561361857600c805460010190555b6006820154600583015461363d9161beef9161dead916001600160a01b031690614847565b8154600883015460078401546136659261dead926001600160a01b0391821692911690614847565b60088201546001600160a01b03166000908152600080516020614ecd83398151915260205260409020541580156136a0575060008260070154115b156136b057600c80546000190190555b6136e0565b6001820154600683015460058401546136e09261beef926001600160a01b0391821692911690614847565b60028201546136f7906001600160a01b0316614723565b6040805182151581529051849186917f86f74240ecee9e4230d26ff92e17fee978460d9c0f78f5c88b2864c9e7a494279181900360200190a3505060016000555050565b61beef81565b61dead81565b60006002600054141561378f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614ce0833981519152604482015290519081900360640190fd5b60026000556001600160a01b0383166137ef576040805162461bcd60e51b815260206004820152601a60248201527f6d7573742070726f7669646520746f6b656e2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16156138475760405162461bcd60e51b81526004018080602001828103825260298152602001806150866029913960400191505060405180910390fd5b600f54610190116138895760405162461bcd60e51b8152600401808060200182810382526026815260200180614fad6026913960400191505060405180910390fd5b613891614aad565b600160808201526138aa60008080808881808a89613ac8565b505060095460001901600160005592915050565b600061390083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614863565b9392505050565b600061390083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148fa565b336000908152600d602090815260408083206001600160a01b03861684529091529020548111156139b8576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6139c333838361495f565b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b158015613a1257600080fd5b505af1158015613a26573d6000803e3d6000fd5b505050506040513d6020811015613a3c57600080fd5b5051613a81576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604080516001600160a01b038416815260208101839052815133927f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb928290030190a25050565b613ad0614acb565b604051806101e001604052808b6001600160a01b03168152602001336001600160a01b0316815260200160006001600160a01b031681526020018a8152602001898152602001888152602001876001600160a01b03168152602001868152602001856001600160a01b03168152602001600081526020016000815260200160008152602001838152602001848152602001600081525090508060146000600954815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c01906006613cc1929190614b74565b506101a08201518051613cde91600d840191602090910190614c06565b506101c082015181600e0155905050600060136000336001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b0316336001600160a01b03168c6001600160a01b03167fa763e0f5e4f4e33a3397b4ba22677c9b6fd2075ed6504596333006ff2f3e38748d8d8d8d8d8d8d8d600954604051808a8152602001898152602001888152602001876001600160a01b03166001600160a01b03168152602001868152602001856001600160a01b03166001600160a01b031681526020018060200184600660200280838360005b83811015613de8578181015183820152602001613dd0565b50505050905001838152602001828103825285818151815260200191508051906020019080838360005b83811015613e2a578181015183820152602001613e12565b50505050905090810190601f168015613e575780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a45050600980546001019055505050505050505050565b6000613e9b600b54600a5461477890919063ffffffff16565b6001600160a01b0385166000908152601260205260409020600181015491925090841115613f06576040805162461bcd60e51b8152602060048201526013602482015272696e73756666696369656e742073686172657360681b604482015290519081900360640190fd5b8281600201541015613f53576040805162461bcd60e51b81526020600482015260116024820152701a5b9cdd59999a58da595b9d081b1bdbdd607a1b604482015290519081900360640190fd5b613f608160040154612b24565b613f9b5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d00604d913960600191505060405180910390fd5b6000613fad858563ffffffff61477816565b6001830154909150613fc5908663ffffffff6138be16565b60018301556002820154613fdf908563ffffffff6138be16565b6002830155600a54613ff7908663ffffffff6138be16565b600a55600b5461400d908563ffffffff6138be16565b600b5560005b600f548110156141385761dead6000908152600d602052600f805461407b91600080516020614ecd833981519152918491908690811061404f57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205484876149bf565b9050801561412f5761dead6000908152600d602052600f80548392600080516020614ecd833981519152929091869081106140b257fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220805495909503909455918b168252600d909252908120600f8054849391908690811061410357fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805490910190555b50600101614013565b506040805186815260208101869052815133927fcad1a1c68982832d9abc314de8a1e5d5e8c81b0588961e360766736d10c3be1a928290030190a2505050505050565b60155481106141cb576040805162461bcd60e51b81526020600482015260176024820152761c1c9bdc1bdcd85b08191bd95cc81b9bdd08195e1a5cdd604a1b604482015290519081900360640190fd5b6141d3614acb565b60146000601584815481106141e457fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b039081168252600183015481169582019590955260028201548516818501526003820154606082015260048201546080820152600582015460a0820152600680830154861660c080840191909152600784015460e084015260088401549096166101008301526009830154610120830152600a830154610140830152600b83015461016083015284519586019485905290949193610180860193600c86019291908390855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116142ba57505050928452505050600d8201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561437d5780601f106143525761010080835404028352916020019161437d565b820191906000526020600020905b81548152906001019060200180831161436057829003601f168201915b50505050508152602001600e8201548152505090506143b260035461257260025484610120015161477890919063ffffffff16565b6143ba610e7c565b10156143f75760405162461bcd60e51b8152600401808060200182810382526025815260200180614d4d6025913960400191505060405180910390fd5b610180810151602001511561443d5760405162461bcd60e51b81526004018080602001828103825260238152602001806150af6023913960400191505060405180910390fd5b8115806144a5575060146000601561445c85600163ffffffff6138be16565b8154811061446657fe5b90600052602060002001548152602001908152602001600020600c0160016006811061448e57fe5b602081049091015460ff601f9092166101000a9004165b6144e05760405162461bcd60e51b8152600401808060200182810382526023815260200180614dfe6023913960400191505060405180910390fd5b5050565b60006144ee614acb565b60146000601585815481106144ff57fe5b6000918252602080832091909101548352828101939093526040918201812082516101e08101845281546001600160a01b039081168252600183015481169582019590955260028201548516818501526003820154606082015260048201546080820152600582015460a0820152600680830154861660c080840191909152600784015460e084015260088401549096166101008301526009830154610120830152600a830154610140830152600b83015461016083015284519586019485905290949193610180860193600c86019291908390855b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116145d557505050928452505050600d8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156146985780601f1061466d57610100808354040283529160200191614698565b820191906000526020600020905b81548152906001019060200180831161467b57829003601f168201915b50505050508152602001600e820154815250509050806101600151816101400151119150806101c001516146eb6005546146df600b54600a5461477890919063ffffffff16565b9063ffffffff614a1316565b10156146f657600091505b80516001600160a01b03166000908152601260205260409020600501541561471d57600091505b50919050565b6008546006546147429161beef9133916001600160a01b031690614847565b6008546006546004546147759261beef9285926001600160a01b03909216916147709163ffffffff6138be16565b614847565b50565b600082820183811015613900576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b039283166000908152600d602090815260408083209490951682529283528381208054830190557fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c90925291902080549091019055565b6000818310156148405781613900565b5090919050565b61485284838361495f565b61485d8383836147d2565b50505050565b600081848411156148f25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148b757818101518382015260200161489f565b50505050905090810190601f1680156148e45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836149495760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148b757818101518382015260200161489f565b50600083858161495557fe5b0495945050505050565b6001600160a01b039283166000908152600d60209081526040808320949095168252928352838120805483900390557fa30f7a7832bd8a7a8daa3a3f5b7a6f7cec6a2fbb1a121fa5b76520e44736771c9092529190208054919091039055565b6000816149cb57600080fd5b836149d857506000613900565b838302838582816149e557fe5b0414156149fe578281816149f557fe5b04915050613900565b83838681614a0857fe5b040295945050505050565b600082614a2257506000610e76565b82820282848281614a2f57fe5b04146139005760405162461bcd60e51b8152600401808060200182810382526021815260200180614f6b6021913960400191505060405180910390fd5b6040518060c0016040528060006001600160a01b03168152602001600081526020016000815260200160001515815260200160008152602001600081525090565b6040518060c001604052806006906020820280388339509192915050565b604051806101e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001614b60614aad565b815260200160608152602001600081525090565b600183019183908215614bf65791602002820160005b83821115614bc757835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302614b8a565b8015614bf45782816101000a81549060ff0219169055600101602081600001049283019260010302614bc7565b505b50614c02929150614c80565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c4757805160ff1916838001178555614c74565b82800160010185558215614c74579182015b82811115614c74578251825591602001919060010190614c59565b50614c02929150614c9e565b610ea891905b80821115614c0257805460ff19168155600101614c86565b610ea891905b80821115614c025760008155600101614ca456fe63616e6e6f74206f7665727772697465206578697374696e672064656c6567617465206b6579735265656e7472616e637947756172643a207265656e7472616e742063616c6c0063616e6e6f7420726167657175697420756e74696c206869676865737420696e6465782070726f706f73616c206d656d62657220766f74656420594553206f6e2069732070726f63657373656470726f706f73616c206973206e6f7420726561647920746f2062652070726f6365737365646170706c6963616e7420616464726573732063616e6e6f7420626520726573657276656463616e6e6f74207375626d6974206d6f726520747269627574652070726f706f73616c7320666f72206e657720746f6b656e73202d206775696c6462616e6b2069732066756c6c6d656d626572206d757374206e6f7420616c7265616479206265206a61696c656470726576696f75732070726f706f73616c206d7573742062652070726f636573736564746f6b656e20746f20636f6c6c656374206d7573742062652077686974656c697374656463616e6e6f742073706f6e736f72206d6f72652077686974656c6973742070726f706f73616c736d656d626572206d7573742068617665206174206c65617374206f6e65207368617265206f72206f6e65206c6f6f74746f6b656e7320616e6420616d6f756e747320617272617973206d757374206265206d61746368696e67206c656e67746873dc7fafdc41998a74ecacb8f8bd877011aba1f1d03a3a0d37a2e7879a393b1d6a746f6b656e20746f20636f6c6c656374206d7573742068617665206e6f6e2d7a65726f206775696c642062616e6b2062616c616e636570726f706f73616c206170706c6963616e74206d757374206e6f74206265206a61696c656470726f706f73616c2068617320616c7265616479206265656e2073706f6e736f726564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616e6e6f74206f7665727772697465206578697374696e67206d656d6265727363616e6e6f74207375626d6974206d6f72652077686974656c6973742070726f706f73616c7363616e6e6f742073706f6e736f72206d6f726520747269627574652070726f706f73616c7320666f72206e657720746f6b656e73202d206775696c6462616e6b2069732066756c6c70726f706f73616c206465706f73697420746f6b656e207472616e73666572206661696c656470726f706f73616c20766f74696e6720706572696f6420686173206578706972656470726f706f73616c2068617320616c7265616479206265656e2063616e63656c6c656463616e6e6f7420616c726561647920686176652077686974656c69737465642074686520746f6b656e70726f706f73616c2068617320616c7265616479206265656e2070726f636573736564a265627a7a72315820eba0b3393f41c9b9cb3244afe1f8c1d338844a4dcaa31cdc4cb50b947eba16cc64736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000001c0aa8ccd568d90d61659f060d1bfb1e6f855a20000000000000000000000000c89b6f0146642688bb254bf93c28fccf1e182c810000000000000000000000005608169973d639649196a84ee4085a708bcbf3970000000000000000000000007587caefc8096f5f40acb83a09df031a018c66ec00000000000000000000000019bc62ff7cd9ffd6bdced9802ff718f09f7259f10000000000000000000000003edeb7ccf325d0aec03cffb89768da2d6f0c26f10000000000000000000000000f50d31b3eaefd65236dd3736b863cffa4c63c4e000000000000000000000000fa9b5f7fdc8ab34aaf3099889475d47febf830d7000000000000000000000000fbe18f066f9583dac19c88444bc2005c99881e56000000000000000000000000320cf69bf1d9b3f942d09dce2fc7159aa1ff80d7000000000000000000000000d3f03984a90fd15e909b2e9467e98cadea181da30000000000000000000000000000000000000000000000000000000000000009000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268880000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e364300000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c1000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407

-----Decoded View---------------
Arg [0] : _summoners (address[]): 0x1C0Aa8cCD568d90d61659F060D1bFb1e6f855A20,0xC89b6f0146642688bb254bF93C28fcCF1E182C81,0x5608169973d639649196A84EE4085a708bcBf397,0x7587cAefc8096f5F40ACB83A09Df031a018C66ec,0x19bC62FF7CD9FFD6BdCed9802fF718f09F7259f1,0x3eDEb7Ccf325d0aEc03Cffb89768dA2d6f0C26F1,0x0f50D31B3eaefd65236dd3736B863CfFa4c63C4E,0xfA9b5f7fDc8AB34AAf3099889475d47febF830D7,0xfbe18f066F9583dAc19C88444BC2005c99881E56,0x320CF69bF1d9b3F942d09Dce2fC7159AA1Ff80D7,0xD3F03984a90fd15E909B2E9467E98cADeA181da3
Arg [1] : _approvedTokens (address[]): 0xc00e94Cb662C3520282E6f5717214004A7f26888,0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5,0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643,0x39AA39c021dfbaE8faC545936693aC917d5E7563,0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9,0xC11b1268C1A384e55C48c2391d8d480264A3A7F4,0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E,0x158079Ee67Fce2f58472A96584A73C7Ab9AC95c1,0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407
Arg [2] : _periodDuration (uint256): 17280
Arg [3] : _votingPeriodLength (uint256): 35
Arg [4] : _gracePeriodLength (uint256): 35
Arg [5] : _proposalDeposit (uint256): 0
Arg [6] : _dilutionBound (uint256): 3
Arg [7] : _processingReward (uint256): 0

-----Encoded View---------------
30 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [2] : 0000000000000000000000000000000000000000000000000000000000004380
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 0000000000000000000000001c0aa8ccd568d90d61659f060d1bfb1e6f855a20
Arg [10] : 000000000000000000000000c89b6f0146642688bb254bf93c28fccf1e182c81
Arg [11] : 0000000000000000000000005608169973d639649196a84ee4085a708bcbf397
Arg [12] : 0000000000000000000000007587caefc8096f5f40acb83a09df031a018c66ec
Arg [13] : 00000000000000000000000019bc62ff7cd9ffd6bdced9802ff718f09f7259f1
Arg [14] : 0000000000000000000000003edeb7ccf325d0aec03cffb89768da2d6f0c26f1
Arg [15] : 0000000000000000000000000f50d31b3eaefd65236dd3736b863cffa4c63c4e
Arg [16] : 000000000000000000000000fa9b5f7fdc8ab34aaf3099889475d47febf830d7
Arg [17] : 000000000000000000000000fbe18f066f9583dac19c88444bc2005c99881e56
Arg [18] : 000000000000000000000000320cf69bf1d9b3f942d09dce2fc7159aa1ff80d7
Arg [19] : 000000000000000000000000d3f03984a90fd15e909b2e9467e98cadea181da3
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [21] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [22] : 0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed5
Arg [23] : 0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643
Arg [24] : 00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563
Arg [25] : 000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9
Arg [26] : 000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f4
Arg [27] : 0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e
Arg [28] : 000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c1
Arg [29] : 000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407


Deployed Bytecode Sourcemap

10637:35138:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10637:35138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17240:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17240:45:0;;:::i;:::-;;;;;-1:-1:-1;;;;;17240:45:0;-1:-1:-1;;;;;17240:45:0;;;;;;-1:-1:-1;;;;;17240:45:0;-1:-1:-1;;;;;17240:45:0;;;;;;-1:-1:-1;;;;;17240:45:0;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17240:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11259:31;;;:::i;:::-;;;;;;;;;;;;;;;;44155:355;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44155:355:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43607:126;;;:::i;17122:41::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17122:41:0;-1:-1:-1;;;;;17122:41:0;;:::i;:::-;;;;-1:-1:-1;;;;;17122:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39596:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39596:126:0;;;;;;;;:::i;:::-;;22804:659;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;22804:659:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22804:659:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22804:659:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22804:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22804:659:0;;-1:-1:-1;22804:659:0;;-1:-1:-1;;;;;22804:659:0:i;37208:157::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37208:157:0;;;;;;;:::i;16969:31::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16969:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;16969:31:0;;;;;;;;;;;;;;42062:836;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42062:836:0;-1:-1:-1;;;;;42062:836:0;;:::i;14508:47::-;;;:::i;33387:954::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33387:954:0;;:::i;14159:30::-;;;:::i;17294:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17294:30:0;;:::i;17067:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17067:46:0;-1:-1:-1;;;;;17067:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17170:61;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17170:61:0;-1:-1:-1;;;;;17170:61:0;;:::i;39730:543::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39730:543:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39730:543:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39730:543:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39730:543:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39730:543:0;;;;;;;;-1:-1:-1;39730:543:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;39730:543:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39730:543:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39730:543:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39730:543:0;;-1:-1:-1;;;;39730:543:0;;;;-1:-1:-1;39730:543:0;:::i;14562:73::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14562:73:0;;;;;;;;;;:::i;20296:1791::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;20296:1791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;20296:1791:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20296:1791:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;20296:1791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;20296:1791:0;;-1:-1:-1;20296:1791:0;;-1:-1:-1;;;;;20296:1791:0:i;40652:686::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40652:686:0;-1:-1:-1;;;;;40652:686:0;;:::i;14231:28::-;;;:::i;10951:32::-;;;:::i;44003:144::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44003:144:0;;;;;;;;;;:::i;16916:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16916:46:0;-1:-1:-1;;;;;16916:46:0;;:::i;44518:102::-;;;:::i;43741:110::-;;;:::i;11370:28::-;;;:::i;10878:33::-;;;:::i;11023:30::-;;;:::i;43245:169::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43245:169:0;;:::i;24854:2455::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24854:2455:0;;:::i;27372:1979::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27372:1979:0;;;;;;;;;:::i;14299:39::-;;;:::i;42991:246::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42991:246:0;;:::i;11126:28::-;;;:::i;43859:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43859:136:0;;:::i;:::-;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43859:136:0;;;;;;;;;;;;;;;;10780:29;;;:::i;11453:27::-;;;:::i;14091:32::-;;;:::i;39077:511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39077:511:0;-1:-1:-1;;;;;39077:511:0;;:::i;41461:593::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41461:593:0;;:::i;17009:51::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17009:51:0;-1:-1:-1;;;;;17009:51:0;;:::i;34349:1079::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34349:1079:0;;:::i;29359:4020::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29359:4020:0;;:::i;14453:48::-;;;:::i;14399:47::-;;;:::i;22095:701::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;22095:701:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22095:701:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22095:701:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22095:701:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22095:701:0;;-1:-1:-1;22095:701:0;;-1:-1:-1;;;;;22095:701:0:i;17240:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17240:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11259:31::-;;;;:::o;44155:355::-;-1:-1:-1;;;;;44278:22:0;;44253:4;44278:22;;;:7;:22;;;;;:29;;;;;44270:63;;;;;-1:-1:-1;;;44270:63:0;;;;;;;;;;;;-1:-1:-1;;;44270:63:0;;;;;;;;;;;;;;;44368:13;:20;44352:36;;44344:72;;;;;-1:-1:-1;;;44344:72:0;;;;;;;;;;;;-1:-1:-1;;;44344:72:0;;;;;;;;;;;;;;;44434:9;:39;44444:13;44458;44444:28;;;;;;;;;;;;;;;;;;;;44434:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;44434:68:0;;;;:53;;:68;;;;;;;;;-1:-1:-1;44155:355:0;;;;;:::o;43607:126::-;43656:7;43683:42;43710:14;;43683:22;43691:13;;43683:3;:7;;:22;;;;:::i;:::-;:26;:42;:26;:42;:::i;:::-;43676:49;;43607:126;;:::o;17122:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17122:41:0;;;;;;;;;;;;;;:::o;39596:126::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;39683:31;39700:5;39707:6;39683:16;:31::i;:::-;-1:-1:-1;;9638:1:0;10600:7;:22;39596:126::o;22804:659::-;22911:18;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;22942:20;;:::i;:::-;-1:-1:-1;;;;;;22965:21:0;;;;;;;:7;:21;;;;;;;;;22942:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23007:17;;;:36;;;23042:1;23028:6;:11;;;:15;23007:36;22999:96;;;;-1:-1:-1;;;22999:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23114:21:0;;;;;;:7;:21;;;;;:28;;;:33;23106:79;;;;-1:-1:-1;;;23106:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23198:20;;:::i;:::-;23308:4;23297:8;;;:15;23339:81;23355:12;23297:15;;;;;;23405:7;23297:5;23339:15;:81::i;:::-;-1:-1:-1;;23438:13:0;;23454:1;10600:7;:22;-1:-1:-1;;23438:17:0;;22804:659;-1:-1:-1;;;22804:659:0:o;37208:157::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;17380:10;17372:19;;:7;:19;;;;;:26;;;:30;;;:62;;-1:-1:-1;17414:10:0;17433:1;17406:19;;;:7;:19;;;;;:24;;;:28;;17372:62;17364:87;;;;;-1:-1:-1;;;17364:87:0;;;;;;;;;;;;-1:-1:-1;;;17364:87:0;;;;;;;;;;;;;;;37310:47;37320:10;37332:12;37346:10;37310:9;:47::i;16969:31::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16969:31:0;;-1:-1:-1;16969:31:0;:::o;42062:836::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;17531:10;17523:19;;:7;:19;;;;;:26;;;17515:60;;;;;-1:-1:-1;;;17515:60:0;;;;;;;;;;;;-1:-1:-1;;;17515:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42168:28:0;;42160:67;;;;;-1:-1:-1;;;42160:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42330:28:0;;42348:10;42330:28;42326:264;;-1:-1:-1;;;;;42384:23:0;;;;;;:7;:23;;;;;:30;;;;;42383:31;42375:77;;;;-1:-1:-1;;;42375:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42484:42:0;;;42476:51;42484:42;;;:26;:42;;;;;;;;;;;;42476:51;;:7;:51;;;:58;;;;;42475:59;42467:111;;;;-1:-1:-1;;;42467:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42634:10;42602:21;42626:19;;;:7;:19;;;;;;;;42683:18;;-1:-1:-1;;;;;42683:18:0;;;42656:46;;:26;:46;;;;;:59;;-1:-1:-1;;;;;;42656:59:0;;;;;;42726:42;;;;;;;;;;:55;;;;;;;;42792:35;;;;;;;42845:45;;;;;;;42626:19;;42634:10;42845:45;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;42062:836::o;14508:47::-;14548:6;14508:47;:::o;33387:954::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;33475:45;33506:13;33475:30;:45::i;:::-;33533:18;33554:13;33568;33554:28;;;;;;;;;;;;;;;;;;;;;33621:21;;;:9;:21;;;;;;;33663:14;;;:17;33554:28;;-1:-1:-1;33621:21:0;-1:-1:-1;;;33663:17:0;;;;33655:58;;;;;-1:-1:-1;;;33655:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33726:14;;;:24;;-1:-1:-1;;33726:24:0;;;;;:17;33791:23;33800:13;33791:8;:23::i;:::-;33831:14;:21;33776:38;;-1:-1:-1;12170:3:0;-1:-1:-1;33827:98:0;;-1:-1:-1;33908:5:0;33827:98;33941:7;33937:202;;;33965:14;;;:24;;-1:-1:-1;;33965:24:0;;;;;34040:21;;;;;-1:-1:-1;;;;;34040:21:0;;;33965:17;34017:46;;;:14;33965:17;34017:46;;;;:53;;-1:-1:-1;;34017:53:0;33985:4;34017:53;;;;;;34105:21;;34085:14;27:10:-1;;23:18;;;45:23;;34085:42:0;;;;;;;;;34105:21;;;;-1:-1:-1;;;;;;34085:42:0;;;;;;;;;33937:202;34179:21;;;;-1:-1:-1;;;;;34179:21:0;;;34205:5;34151:51;;;:19;:51;;;;;:59;;-1:-1:-1;;34151:59:0;;;34238:16;;;;34223:32;;34238:16;34223:14;:32::i;:::-;34273:60;;;;;;;;;;34313:10;;34298:13;;34273:60;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;33387:954:0:o;14159:30::-;;;;:::o;17294:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17294:30:0;:::o;17067:46::-;;;;;;;;;;;;;;;:::o;17170:61::-;;;;;;;;;;;;-1:-1:-1;;;;;17170:61:0;;:::o;39730:543::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;39873:14;;39856:13;;:31;39848:94;;;;-1:-1:-1;;;39848:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39960:9;39955:311;39977:6;:13;39973:1;:17;39955:311;;;40012:22;40037:7;40045:1;40037:10;;;;;;;;;;;;;;40012:35;;40066:3;40062:133;;;40157:10;40139:29;;;;:17;:29;;;;;40169:9;;40139:29;;;40169:6;;40176:1;;40169:9;;;;;;;;;;;;-1:-1:-1;;;;;40139:40:0;-1:-1:-1;;;;;40139:40:0;;;;;;;;;;;;;40122:57;;40062:133;40211:43;40228:6;40235:1;40228:9;;;;;;;;;;;;;;40239:14;40211:16;:43::i;:::-;-1:-1:-1;39992:3:0;;39955:311;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;39730:543:0:o;14562:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;20296:1791::-;20612:18;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;12065:6;20651:34;:15;20671:13;20651:34;:19;:34;:::i;:::-;:67;;20643:105;;;;;-1:-1:-1;;;20643:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20767:28:0;;;;;;:14;:28;;;;;;;;20759:72;;;;;-1:-1:-1;;;20759:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20850:28:0;;;;;;:14;:28;;;;;;;;20842:67;;;;;-1:-1:-1;;;20842:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20928:23:0;;20920:57;;;;;-1:-1:-1;;;20920:57:0;;;;;;;;;;;;-1:-1:-1;;;20920:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20996:18:0;;14439:6;20996:18;;;;:41;;-1:-1:-1;;;;;;21018:19:0;;14494:6;21018:19;;20996:41;:63;;;;-1:-1:-1;;;;;;21041:18:0;;14548:6;21041:18;;20996:63;20988:112;;;;-1:-1:-1;;;20988:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21119:18:0;;;;;;:7;:18;;;;;:25;;;:30;21111:80;;;;-1:-1:-1;;;21111:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21225:1;21208:14;:18;:65;;;;-1:-1:-1;;;;;;21230:38:0;;:24;:38;;;-1:-1:-1;;;;;;;;;;;21230:24:0;:38;:24;:38;;;:43;21208:65;21204:230;;;12265:3;21298:20;;:48;21290:132;;;;-1:-1:-1;;;21290:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21555:76;;;-1:-1:-1;;;21555:76:0;;21589:10;21555:76;;;;21609:4;21555:76;;;;;;;;;;;;-1:-1:-1;;;;;21555:33:0;;;;;:76;;;;;;;;;;;;;;-1:-1:-1;21555:33:0;:76;;;5:2:-1;;;;30:1;27;20:12;5:2;21555:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21555:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21555:76:0;21547:118;;;;;-1:-1:-1;;;21547:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21676:56;14494:6;21703:12;21717:14;21676:18;:56::i;:::-;21745:20;;:::i;:::-;21846:136;21862:9;21873:15;21890:13;21905:14;21921:12;21935:16;21953:12;21967:7;21976:5;21846:15;:136::i;:::-;-1:-1:-1;;22000:13:0;;-1:-1:-1;;22000:17:0;9638:1;10600:7;:22;20296:1791;;-1:-1:-1;;;;;;;;20296:1791:0:o;40652:686::-;17679:10;17701:1;17652:38;;;:26;:38;;;;;;;;;-1:-1:-1;;;;;17652:38:0;17644:47;;:7;:47;;;;;17652:38;17644:54;;17636:85;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;;;;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;-1:-1:-1;;;;;40803:31:0;;;;;:24;;:31;;;:24;:31;;;;40760:38;;-1:-1:-1;;;40760:38:0;;40792:4;40760:38;;;;;;:75;;40803:31;;;;40760:23;;:38;;;;;40803:24;;40760:38;;;;;40803:31;40760:38;;;5:2:-1;;;;30:1;27;20:12;5:2;40760:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40760:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40760:38:0;;:75;:42;:75;:::i;:::-;40734:101;;40985:1;40967:15;:19;40959:52;;;;;-1:-1:-1;;;40959:52:0;;;;;;;;;;;;-1:-1:-1;;;40959:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41030:21:0;;;;;;:14;:21;;;;;;;;41022:70;;;;-1:-1:-1;;;41022:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41111:31:0;;41145:1;41111:31;;;-1:-1:-1;;;;;;;;;;;41111:24:0;:31;:24;:31;;;41103:102;;;;-1:-1:-1;;;41103:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41226:49;14439:6;41252:5;41259:15;41226:18;:49::i;:::-;41291:39;;;;;;;;-1:-1:-1;;;;;41291:39:0;;;;;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;40652:686::o;14231:28::-;;;;:::o;10951:32::-;;;;:::o;44003:144::-;-1:-1:-1;;;;;44109:23:0;;;44082:7;44109:23;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;;44003:144::o;16916:46::-;;;;;;;;;;;;;;;:::o;44518:102::-;44591:14;:21;44518:102;:::o;43741:110::-;43823:13;:20;43741:110;:::o;11370:28::-;;;;:::o;10878:33::-;;;;:::o;11023:30::-;;;;:::o;43245:169::-;43322:4;43368:38;43387:18;;43368:14;:18;;:38;;;;:::i;:::-;43346:18;:16;:18::i;:::-;:60;;;43245:169;-1:-1:-1;;43245:169:0:o;24854:2455::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;17679:10;17652:38;;:26;:38;;;;;;;;;-1:-1:-1;;;;;17652:38:0;17644:47;;:7;:47;;;;;17652:38;17644:54;;17636:85;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;;;;25067:12;;25121:15;;;25060:77;;;-1:-1:-1;;;25060:77:0;;25094:10;25060:77;;;;;;;25114:4;25060:77;;;;;;;;;;;;-1:-1:-1;;;;;25067:12:0;;;;25060:33;;:77;;;;;;;;;;;;;;;25067:12;;25060:77;;;5:2:-1;;;;30:1;27;20:12;5:2;25060:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25060:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25060:77:0;25052:128;;;;-1:-1:-1;;;25052:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25218:12;;25232:15;;25191:57;;14494:6;;-1:-1:-1;;;;;25218:12:0;;;;25191:18;:57::i;:::-;25261:25;25289:21;;;:9;:21;;;;;25331:17;;;;-1:-1:-1;;;;;25331:17:0;25323:76;;;;;-1:-1:-1;;;25323:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25419:14;;;:17;;;25418:18;25410:66;;;;-1:-1:-1;;;25410:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25496:14;;;:17;;;;;;25495:18;25487:58;;;;;-1:-1:-1;;;25487:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25572:18;;-1:-1:-1;;;;;25572:18:0;25564:27;;;;:7;:27;;;;;:34;;;:39;25556:89;;;;-1:-1:-1;;;25556:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25688:1;25662:8;:23;;;:27;:83;;;;-1:-1:-1;25718:21:0;;;;-1:-1:-1;;;;;25718:21:0;25693:24;:47;;;-1:-1:-1;;;;;;;;;;;25693:24:0;:47;:24;:47;;;:52;25662:83;25658:249;;;12265:3;25770:20;;:48;25762:133;;;;-1:-1:-1;;;25762:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25954:14;;;:17;-1:-1:-1;;;25954:17:0;;;;25950:667;;;26020:21;;;;-1:-1:-1;;;;;26020:21:0;25997:46;;;;:14;:46;;;;;;;;25996:47;25988:101;;;;-1:-1:-1;;;25988:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26141:21;;;;-1:-1:-1;;;;;26141:21:0;26113:51;;;;:19;:51;;;;;;;;26112:52;26104:94;;;;;-1:-1:-1;;;26104:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26221:14;:21;12170:3;-1:-1:-1;26213:101:0;;;;-1:-1:-1;;;26213:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26357:21;;;;-1:-1:-1;;;;;26357:21:0;26329:51;;;;:19;:51;;;;;:58;;-1:-1:-1;;26329:58:0;26383:4;26329:58;;;25950:667;;;26443:14;;;:17;;;;;;26439:178;;;26501:18;;-1:-1:-1;;;;;26501:18:0;26486:34;;;;:14;:34;;;;;;;;26485:35;26477:72;;;;;-1:-1:-1;;;26477:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26579:18;;-1:-1:-1;;;;;26579:18:0;26564:34;;;;:14;:34;;;;;:41;;-1:-1:-1;;26564:41:0;26601:4;26564:41;;;26439:178;26677:22;26702:169;26869:1;26702:162;26720:18;:16;:18::i;:::-;26753:13;:20;:25;:100;;26795:13;26809:20;;26785:9;;:53;;26809:27;;26834:1;26809:27;:24;:27;:::i;:::-;26795:42;;;;;;;;;;;;;;;;26785:53;;;;;;;;;;;:68;;;26753:100;;;26781:1;26753:100;26702:3;:162::i;:::-;:166;:169;:166;:169;:::i;:::-;26884:23;;;:40;;;26988:10;26937:21;26961:38;;;:26;:38;;;;;;27010:16;;;:32;;-1:-1:-1;;;;;;27010:32:0;-1:-1:-1;;;;;26961:38:0;;;27010:32;;;;;27055:14;;;:24;;-1:-1:-1;;27055:24:0;-1:-1:-1;27055:24:0;;;;;;27146:13;27:10:-1;;23:18;;;45:23;;27146:30:0;;;;;;;;;;;27257:20;;26884:40;;-1:-1:-1;26961:38:0;;;26988:10;27202:99;;27146:30;;27257:27;;:20;:24;:27::i;:::-;27202:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;24854:2455:0:o;27372:1979::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;17679:10;17652:38;;:26;:38;;;;;;;;;-1:-1:-1;;;;;17652:38:0;17644:47;;:7;:47;;;;;17652:38;17644:54;;17636:85;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;-1:-1:-1;;;17636:85:0;;;;;;;;;;;;;;;27526:10;27475:21;27499:38;;;:26;:38;;;;;;;;;-1:-1:-1;;;;;27499:38:0;27572:22;;;:7;:22;;;;;;27631:13;:20;27615:36;;27607:72;;;;;-1:-1:-1;;;27607:72:0;;;;;;;;;;;;-1:-1:-1;;;27607:72:0;;;;;;;;;;;;;;;27690:25;27718:9;:39;27728:13;27742;27728:28;;;;;;;;;;;;;;;;27718:39;;;;;;;;;;;27690:67;;27789:1;27778:8;:12;;;27770:44;;;;;-1:-1:-1;;;27770:44:0;;;;;;;;;;;;-1:-1:-1;;;27770:44:0;;;;;;;;;;;;;;;27825:9;27842:8;27837:14;;;;;;;;;;27825:26;;27894:8;:23;;;27872:18;:16;:18::i;:::-;:45;;27864:87;;;;;-1:-1:-1;;;27864:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27971:47;27994:8;:23;;;27971:22;:47::i;:::-;27970:48;27962:95;;;;-1:-1:-1;;;27962:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28076:37:0;;28117:9;28076:37;;;:22;;;:37;;;;;;;;:50;;;;;;;;;28068:87;;;;;-1:-1:-1;;;28068:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28182:8;28174:4;:16;;;;;;;;;:35;;;-1:-1:-1;28202:7:0;28194:4;:15;;;;;;;;;28174:35;28166:77;;;;;-1:-1:-1;;;28166:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28256:37:0;;;;;;:22;;;:37;;;;;:44;;28296:4;;28256:37;-1:-1:-1;;28256:44:0;;28296:4;28256:44;;;;;;;;;;;;-1:-1:-1;28325:8:0;28317:4;:16;;;;;;;;;28313:754;;;28392:13;;;;28370:17;;;;:36;;;:21;:36;:::i;:::-;28350:17;;;:56;28538:26;;;;28522:42;;28518:125;;;28585:26;;;:42;;;28518:125;28802:39;;;;28789:9;;28773:11;;:26;;;:15;:26;:::i;:::-;:68;28769:177;;;28920:9;;28904:11;;:26;;;:15;:26;:::i;:::-;28862:39;;;:68;28769:177;28313:754;;;28977:7;28969:4;:15;;;;;;;;;28965:102;;;29041:13;;;;29020:16;;;;:35;;;:20;:35;:::i;:::-;29001:16;;;:54;28965:102;29319:13;-1:-1:-1;;;;;29251:92:0;29307:10;-1:-1:-1;;;;;29251:92:0;29292:13;29251:92;29262:13;29276;29262:28;;;;;;;;;;;;;;;;29334:8;29251:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;;;27372:1979:0:o;14299:39::-;;;;:::o;42991:246::-;43109:13;:20;43062:4;;43087:42;;43079:78;;;;;-1:-1:-1;;;43079:78:0;;;;;;;;;;;;-1:-1:-1;;;43079:78:0;;;;;;;;;;;;;;;43175:9;:45;43185:13;43199:19;43185:34;;;;;;;;;;;;;;;;43175:45;;;;;;;;;;;:51;;43227:1;43175:54;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42991:246:0;;;:::o;11126:28::-;;;;:::o;43859:136::-;43926:14;;:::i;:::-;43960:21;;;;:9;:21;;;;;;43953:34;;;;;;;;;;43960:27;;;;;43953:34;;43960:27;;43953:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43953:34:0;;43859:136;-1:-1:-1;;;;;;;43859:136:0:o;10780:29::-;;;;:::o;11453:27::-;;;-1:-1:-1;;;;;11453:27:0;;:::o;14091:32::-;;;;:::o;39077:511::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;-1:-1:-1;;;;;39172:21:0;;;;:7;:21;;;;;39214:13;;;;39206:53;;;;;-1:-1:-1;;;39206:53:0;;;;;;;;;;;;-1:-1:-1;;;39206:53:0;;;;;;;;;;;;;;;39292:1;39278:6;:11;;;:15;39270:54;;;;;-1:-1:-1;;;39270:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39407:39;39419:6;:26;;;39407:11;:39::i;:::-;39399:129;;;;-1:-1:-1;;;39399:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39541:39;39551:12;39565:1;39568:6;:11;;;39541:9;:39::i;41461:593::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;;;41564:21;;;:9;:21;;;;;41605:14;;;:17;;;41604:18;41596:66;;;;-1:-1:-1;;;41596:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41682:14;;;:17;;;;;;41681:18;41673:66;;;;-1:-1:-1;;;41673:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41772:17;;;;-1:-1:-1;;;;;41772:17:0;41758:10;:31;41750:74;;;;;-1:-1:-1;;;41750:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41837:14;;;:24;;-1:-1:-1;;41837:24:0;;;;;41857:4;41926:17;;;41945:21;;;;41968:23;;;;41895:97;;14494:6;;-1:-1:-1;;;;;41926:17:0;;;;41945:21;;;41895:22;:97::i;:::-;42008:38;;;42035:10;42008:38;;;;42023:10;;42008:38;;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;41461:593::o;17009:51::-;;;;;;;;;;;;;;;:::o;34349:1079::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;34437:45;34468:13;34437:30;:45::i;:::-;34495:18;34516:13;34530;34516:28;;;;;;;;;;;;;;;;;;;;;34583:21;;;:9;:21;;;;;;;34625:14;;;:17;34516:28;;-1:-1:-1;34583:21:0;34625:17;;;;;34617:59;;;;;-1:-1:-1;;;34617:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34689:14;;;:24;;-1:-1:-1;;34689:24:0;;;;;:17;34754:23;34763:13;34754:8;:23::i;:::-;34739:38;;34794:7;34790:453;;;34818:14;;;:24;;-1:-1:-1;;34818:24:0;;;;;34900:18;;-1:-1:-1;;;;;34900:18:0;34818:17;34892:27;;;:7;34818:17;34892:27;;;;34934:13;;;:29;;;34838:4;35050:13;;;34833:1;35034:11;;;:30;;:15;:30::i;:::-;35020:11;;;:44;35109:13;;;;35093:11;;:30;;;:15;:30;:::i;:::-;35079:11;:44;35164:13;;;;35150:9;;:28;;;:13;:28;:::i;:::-;35138:9;:40;35209:1;35193:13;;;;:17;34790:453;35270:18;;-1:-1:-1;;;;;35270:18:0;;;35292:5;35255:34;;;:14;:34;;;;;:42;;-1:-1:-1;;35255:42:0;;;35325:16;;;;35310:32;;35325:16;35310:14;:32::i;:::-;35360:60;;;;;;;;;;35400:10;;35385:13;;35360:60;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;34349:1079:0:o;29359:4020::-;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;29438:45;29469:13;29438:30;:45::i;:::-;29496:18;29517:13;29531;29517:28;;;;;;;;;;;;;;;;;;;;;29584:21;;;:9;:21;;;;;;;29627:14;;;:17;29517:28;;-1:-1:-1;29584:21:0;-1:-1:-1;;;29627:17:0;;;;29626:18;:40;;;;-1:-1:-1;29649:14:0;;;:17;;;;;;29648:18;29626:40;29618:80;;;;;-1:-1:-1;;;29618:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29711:14;;;:24;;-1:-1:-1;;29711:24:0;;;;;:17;29776:23;29785:13;29776:8;:23::i;:::-;29761:38;;12065:6;29912:84;29973:8;:22;;;29912:56;29943:8;:24;;;29912:26;29928:9;;29912:11;;:15;;:26;;;;:::i;:84::-;:116;29908:164;;;-1:-1:-1;30055:5:0;29908:164;30257:21;;;;-1:-1:-1;;;;;30257:21:0;30232:24;:47;;;-1:-1:-1;;;;;;;;;;;30232:24:0;:47;:24;:47;;;30204:25;;;;:75;30200:123;;;-1:-1:-1;30306:5:0;30200:123;30474:1;30448:8;:23;;;:27;:83;;;;-1:-1:-1;30504:21:0;;;;-1:-1:-1;;;;;30504:21:0;30479:24;:47;;;-1:-1:-1;;;;;;;;;;;30479:24:0;:47;:24;:47;;;:52;30448:83;:136;;;;;12265:3;30535:20;;:49;;30448:136;30444:183;;;-1:-1:-1;30610:5:0;30444:183;30671:7;30667:2591;;;30695:14;;;:24;;-1:-1:-1;;30695:24:0;;;;;30849:18;;-1:-1:-1;;;;;30849:18:0;30695:17;30841:27;;;:7;30695:17;30841:27;;;;:34;;;30695:24;30841:34;30837:1172;;;30972:24;;;;30941:18;;-1:-1:-1;;;;;30941:18:0;30933:27;;;;:7;:27;;;;;30941:18;30933:34;;:64;;;:38;:64;:::i;:::-;30904:18;;-1:-1:-1;;;;;30904:18:0;;;30896:27;;;;:7;:27;;;;;;30904:18;30896:34;:101;;;;31088:22;;;;31059:18;;;;;31051:27;;;;;;:32;;;:60;;;:36;:60;:::i;:::-;31024:18;;-1:-1:-1;;;;;31024:18:0;31016:27;;;;:7;:27;;;;;:32;;:95;30837:1172;;;31391:18;;-1:-1:-1;;;;;31391:18:0;;;31356:55;31364:46;;;:26;:46;;;;;;;;;;;;31356:55;;:7;:55;;;:62;;;;;31352:349;;;31497:18;;-1:-1:-1;;;;;31497:18:0;;;31443:24;31470:46;;;:26;:46;;;;;;;;;;;;31539:44;;;;;;:63;;-1:-1:-1;;;;;;31539:63:0;;;;;;;;31625:7;:25;;;;;;;:56;;;;;;;;;;31352:349;31819:88;;;;;;;;31826:18;;-1:-1:-1;;;;;31826:18:0;;;31819:88;;;31846:24;;;;;31819:88;;;;;;;31872:22;;;;;31819:88;;;;;;31826:18;31819:88;;;;;;-1:-1:-1;31819:88:0;;;;;;;;;;;;31789:27;;;:7;:27;;;;;:118;;;;;;;-1:-1:-1;;;;;;31789:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31789:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;31975:18;;;;;31926:46;;;:26;:46;;;;;;:67;;;;;;;;;;30837:1172;32094:24;;;;32078:11;;:41;;;:15;:41;:::i;:::-;32064:11;:55;32160:22;;;;32146:9;;:37;;;:13;:37;:::i;:::-;32134:9;:49;32367:21;;;;-1:-1:-1;;;;;32367:21:0;32342:24;:47;;;-1:-1:-1;;;;;;;;;;;32342:24:0;:47;:24;:47;;;:52;:83;;;;;32424:1;32398:8;:23;;;:27;32342:83;32338:149;;;32446:20;:25;;32470:1;32446:25;;;32338:149;32541:21;;;;32564:23;;;;32503:85;;14494:6;;14439;;-1:-1:-1;;;;;32541:21:0;;32503:22;:85::i;:::-;32633:18;;32653:21;;;;32676:25;;;;32603:99;;14439:6;;-1:-1:-1;;;;;32633:18:0;;;;32653:21;;;32603:22;:99::i;:::-;32861:21;;;;-1:-1:-1;;;;;32861:21:0;32836:24;:47;;;-1:-1:-1;;;;;;;;;;;32836:24:0;:47;:24;:47;;;:52;:85;;;;;32920:1;32892:8;:25;;;:29;32836:85;32832:151;;;32942:20;:25;;-1:-1:-1;;32942:25:0;;;32832:151;30667:2591;;;33180:17;;;;33199:21;;;;33222:23;;;;33149:97;;14494:6;;-1:-1:-1;;;;;33180:17:0;;;;33199:21;;;33149:22;:97::i;:::-;33285:16;;;;33270:32;;-1:-1:-1;;;;;33285:16:0;33270:14;:32::i;:::-;33320:51;;;;;;;;;;33351:10;;33336:13;;33320:51;;;;;;;;;-1:-1:-1;;9638:1:0;10600:7;:22;-1:-1:-1;;29359:4020:0:o;14453:48::-;14494:6;14453:48;:::o;14399:47::-;14439:6;14399:47;:::o;22095:701::-;22206:18;9682:1;10288:7;;:19;;10280:63;;;;;-1:-1:-1;;;10280:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10280:63:0;;;;;;;;;;;;;;;9682:1;10421:7;:18;-1:-1:-1;;;;;22245:30:0;;22237:69;;;;;-1:-1:-1;;;22237:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22326:32:0;;;;;;:14;:32;;;;;;;;22325:33;22317:87;;;;-1:-1:-1;;;22317:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22423:14;:21;12170:3;-1:-1:-1;22415:100:0;;;;-1:-1:-1;;;22415:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22528:20;;:::i;:::-;22638:4;22627:8;;;:15;22668:85;22627:15;;;;22705:16;22627:15;;22738:7;22627:5;22668:15;:85::i;:::-;-1:-1:-1;;22771:13:0;;-1:-1:-1;;22771:17:0;9638:1;10600:7;:22;22095:701;;-1:-1:-1;;22095:701:0:o;1331:136::-;1389:7;1416:43;1420:1;1423;1416:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1409:50;1331:136;-1:-1:-1;;;1331:136:0:o;3168:132::-;3226:7;3253:39;3257:1;3260;3253:39;;;;;;;;;;;;;;;;;:3;:39::i;40285:359::-;40388:10;40370:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;40370:36:0;;;;;;;;;;:46;-1:-1:-1;40370:46:0;40362:79;;;;;-1:-1:-1;;;40362:79:0;;;;;;;;;;;;-1:-1:-1;;;40362:79:0;;;;;;;;;;;;;;;40452:52;40478:10;40490:5;40497:6;40452:25;:52::i;:::-;40523:42;;;-1:-1:-1;;;40523:42:0;;40546:10;40523:42;;;;;;;;;;;;-1:-1:-1;;;;;40523:22:0;;;;;:42;;;;;;;;;;;;;;-1:-1:-1;40523:22:0;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;40523:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40523:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40523:42:0;40515:70;;;;;-1:-1:-1;;;40515:70:0;;;;;;;;;;;;-1:-1:-1;;;40515:70:0;;;;;;;;;;;;;;;40601:35;;;-1:-1:-1;;;;;40601:35:0;;;;;;;;;;;;40610:10;;40601:35;;;;;;;;40285:359;;:::o;23471:1375::-;23810:24;;:::i;:::-;23837:595;;;;;;;;23873:9;-1:-1:-1;;;;;23837:595:0;;;;;23908:10;-1:-1:-1;;;;;23837:595:0;;;;;23951:1;-1:-1:-1;;;;;23837:595:0;;;;;23986:15;23837:595;;;;24032:13;23837:595;;;;24077:14;23837:595;;;;24121:12;-1:-1:-1;;;;;23837:595:0;;;;;24167:16;23837:595;;;;24213:12;-1:-1:-1;;;;;23837:595:0;;;;;24257:1;23837:595;;;;24284:1;23837:595;;;;24310:1;23837:595;;;;24334:5;23837:595;;;;24364:7;23837:595;;;;24419:1;23837:595;;;23810:622;;24472:8;24445:9;:24;24455:13;;24445:24;;;;;;;;;;;:35;;;;;;;;;;;;;-1:-1:-1;;;;;24445:35:0;;;;;-1:-1:-1;;;;;24445:35:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24445:35:0;;;;;-1:-1:-1;;;;;24445:35:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24445:35:0;;;;;-1:-1:-1;;;;;24445:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24445:35:0;;;;;-1:-1:-1;;;;;24445:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24445:35:0;;;;;-1:-1:-1;;;;;24445:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24445:35:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24491:21;24515:26;:38;24542:10;-1:-1:-1;;;;;24515:38:0;-1:-1:-1;;;;;24515:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24515:38:0;24491:62;;24795:13;-1:-1:-1;;;;;24632:177:0;24783:10;-1:-1:-1;;;;;24632:177:0;24647:9;-1:-1:-1;;;;;24632:177:0;;24658:15;24675:13;24690:14;24706:12;24720:16;24738:12;24752:7;24761:5;24768:13;;24632:177;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24632:177:0;-1:-1:-1;;;;;24632:177:0;;;;;;;;;;;-1:-1:-1;;;;;24632:177:0;-1:-1:-1;;;;;24632:177:0;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24632:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24632:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24820:13:0;:18;;24837:1;24820:18;;;-1:-1:-1;;;;;;;;;23471:1375:0:o;37373:1696::-;37477:33;37513:26;37529:9;;37513:11;;:15;;:26;;;;:::i;:::-;-1:-1:-1;;;;;37576:22:0;;37552:21;37576:22;;;:7;:22;;;;;37619:13;;;;37477:62;;-1:-1:-1;37576:22:0;37619:29;-1:-1:-1;37619:29:0;37611:61;;;;;-1:-1:-1;;;37611:61:0;;;;;;;;;;;;-1:-1:-1;;;37611:61:0;;;;;;;;;;;;;;;37706:10;37691:6;:11;;;:25;;37683:55;;;;;-1:-1:-1;;;37683:55:0;;;;;;;;;;;;-1:-1:-1;;;37683:55:0;;;;;;;;;;;;;;;37759:39;37771:6;:26;;;37759:11;:39::i;:::-;37751:129;;;;-1:-1:-1;;;37751:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37893:27;37923:28;:12;37940:10;37923:28;:16;:28;:::i;:::-;38013:13;;;;37893:58;;-1:-1:-1;38013:31:0;;38031:12;38013:31;:17;:31;:::i;:::-;37997:13;;;:47;38069:11;;;;:27;;38085:10;38069:27;:15;:27;:::i;:::-;38055:11;;;:41;38121:11;;:29;;38137:12;38121:29;:15;:29;:::i;:::-;38107:11;:43;38173:9;;:25;;38187:10;38173:25;:13;:25;:::i;:::-;38161:9;:37;38216:9;38211:787;38235:14;:21;38231:25;;38211:787;;;14439:6;38278:24;38315;;;:17;:24;;38340:14;:17;;38305:102;;-1:-1:-1;;;;;;;;;;;38315:24:0;38278;;38340:14;38355:1;;38340:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38340:17:0;38315:43;;;;;;;;;;;;;38360:19;38381:25;38305:9;:102::i;:::-;38278:129;-1:-1:-1;38426:20:0;;38422:565;;14439:6;38818:24;;;;:17;:24;;38843:14;:17;;38865:16;;-1:-1:-1;;;;;;;;;;;38818:24:0;;;38858:1;;38843:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38843:17:0;;;38818:43;;;;;;;;;;;;;;;:63;;;;;;;;;38900:32;;;;;:17;:32;;;;;;38933:14;:17;;38955:16;;38843:17;38933:14;38948:1;;38933:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38933:17:0;38900:51;;;;;;;;;;;;:71;;;;;;;38422:565;-1:-1:-1;38258:3:0;;38211:787;;;-1:-1:-1;39015:46:0;;;;;;;;;;;;;;39024:10;;39015:46;;;;;;;;37373:1696;;;;;;:::o;36325:621::-;36437:13;:20;36421:36;;36413:72;;;;;-1:-1:-1;;;36413:72:0;;;;;;;;;;;;-1:-1:-1;;;36413:72:0;;;;;;;;;;;;;;;36496:24;;:::i;:::-;36523:9;:39;36533:13;36547;36533:28;;;;;;;;;;;;;;;;;;;;;36523:39;;;;;;;;;;;;;;;36496:66;;;;;;;;;-1:-1:-1;;;;;36496:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36523:39;;36496:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36496:66:0;;;-1:-1:-1;;;36496:66:0;;;;;;;;;;;;;;;;-1:-1:-1;;36496:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36605:70;36657:17;;36605:47;36633:18;;36605:8;:23;;;:27;;:47;;;;:::i;:70::-;36583:18;:16;:18::i;:::-;:92;;36575:142;;;;-1:-1:-1;;;36575:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36736:14;;;;:17;;;:26;36728:74;;;;-1:-1:-1;;;36728:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36821:18;;;:77;;-1:-1:-1;36843:9:0;:46;36853:13;36867:20;:13;36885:1;36867:20;:17;:20;:::i;:::-;36853:35;;;;;;;;;;;;;;;;36843:46;;;;;;;;;;;:52;;36896:1;36843:55;;;;;;;;;;;;;;;;;;;;;;;;36821:77;36813:125;;;;-1:-1:-1;;;36813:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36325:621;;:::o;35436:881::-;35500:12;35525:24;;:::i;:::-;35552:9;:39;35562:13;35576;35562:28;;;;;;;;;;;;;;;;;;;;;35552:39;;;;;;;;;;;;;;;35525:66;;;;;;;;;-1:-1:-1;;;;;35525:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35552:39;;35525:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35525:66:0;;;-1:-1:-1;;;35525:66:0;;;;;;;;;;;;;;;;-1:-1:-1;;35525:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35634:8;:16;;;35614:8;:17;;;:36;35604:46;;35785:8;:39;;;35735:47;35768:13;;35736:26;35752:9;;35736:11;;:15;;:26;;;;:::i;:::-;35735:32;:47;:32;:47;:::i;:::-;:89;35731:137;;;35851:5;35841:15;;35731:137;36208:18;;-1:-1:-1;;;;;36200:27:0;;;;;:7;:27;;;;;:34;;;:39;36196:87;;36266:5;36256:15;;36196:87;-1:-1:-1;35436:881:0;;;:::o;36954:246::-;37058:12;;37072:16;;37015:74;;14494:6;;37046:10;;-1:-1:-1;;;;;37058:12:0;;37015:22;:74::i;:::-;37140:12;;37174:16;;37154:15;;37100:92;;14494:6;;37131:7;;-1:-1:-1;;;;;37140:12:0;;;;37154:37;;;:19;:37;:::i;:::-;37100:22;:92::i;:::-;36954:246;:::o;867:181::-;925:7;957:5;;;981:6;;;;973:46;;;;;-1:-1:-1;;;973:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44694:193;-1:-1:-1;;;;;44787:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;44838:24;:31;;;;;;:41;;;;;;;44694:193::o;43492:107::-;43550:7;43582:1;43577;:6;;:14;;43590:1;43577:14;;;-1:-1:-1;43586:1:0;;43492:107;-1:-1:-1;43492:107:0:o;45103:211::-;45212:46;45238:4;45244:5;45251:6;45212:25;:46::i;:::-;45269:37;45288:2;45292:5;45299:6;45269:18;:37::i;:::-;45103:211;;;;:::o;1770:192::-;1856:7;1892:12;1884:6;;;;1876:29;;;;-1:-1:-1;;;1876:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1876:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1928:5:0;;;1770:192::o;3796:278::-;3882:7;3917:12;3910:5;3902:28;;;;-1:-1:-1;;;3902:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3902:28:0;;3941:9;3957:1;3953;:5;;;;;;;3796:278;-1:-1:-1;;;;;3796:278:0:o;44895:200::-;-1:-1:-1;;;;;44995:23:0;;;;;;;:17;:23;;;;;;;;:30;;;;;;;;;;;;:40;;;;;;;45046:24;:31;;;;;;:41;;;;;;;;44895:200::o;45322:450::-;45425:7;45453:23;45445:32;;;;;;45494:12;45490:31;;-1:-1:-1;45517:1:0;45510:8;;45490:31;45548:16;;;45558:6;45548:7;:16;:7;45581:14;;;;;:24;45577:129;;;45676:18;45669:4;:25;;;;;;45662:32;;;;;45577:129;45758:6;45736:18;45726:7;:28;;;;;;45725:39;;45322:450;-1:-1:-1;;;;;45322:450:0:o;2221:471::-;2279:7;2524:6;2520:47;;-1:-1:-1;2554:1:0;2547:8;;2520:47;2591:5;;;2595:1;2591;:5;:1;2615:5;;;;;:10;2607:56;;;;-1:-1:-1;;;2607:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10637:35138;;;;;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;10637:35138:0;;;-1:-1:-1;;10637:35138:0:o;:::-;;;;;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;;;;;;-1:-1:-1;;;;;10637:35138:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10637:35138:0;;;-1:-1:-1;10637:35138:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10637:35138:0;;;-1:-1:-1;10637:35138:0;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;10637:35138:0;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://eba0b3393f41c9b9cb3244afe1f8c1d338844a4dcaa31cdc4cb50b947eba16cc

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.