ETH Price: $1,589.89 (-0.23%)
Gas: 7 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
Execute170616852023-04-16 20:04:23160 days 20 hrs ago1681675463IN
0xa55E0d...ECeEF45B
0 ETH0.0032258127.73633627
Queue170534622023-04-15 16:04:11162 days 24 mins ago1681574651IN
0xa55E0d...ECeEF45B
0 ETH0.0045796235.21161005
Cast Vote170384232023-04-13 12:01:23164 days 4 hrs ago1681387283IN
0xa55E0d...ECeEF45B
0 ETH0.0037277428.80082209
Propose170235202023-04-11 7:57:11166 days 8 hrs ago1681199831IN
0xa55E0d...ECeEF45B
0 ETH0.0130292524.21587121
Execute168286602023-03-14 20:47:11193 days 19 hrs ago1678826831IN
0xa55E0d...ECeEF45B
0 ETH0.0075184425.60044614
Queue168216232023-03-13 21:04:47194 days 19 hrs ago1678741487IN
0xa55E0d...ECeEF45B
0 ETH0.0112076527.34161524
Cast Vote168128812023-03-12 15:37:23196 days 51 mins ago1678635443IN
0xa55E0d...ECeEF45B
0 ETH0.0023197420.65081871
Cast Vote168123652023-03-12 13:53:11196 days 2 hrs ago1678629191IN
0xa55E0d...ECeEF45B
0 ETH0.002380218.6782004
Propose167915262023-03-09 15:25:59199 days 1 hr ago1678375559IN
0xa55E0d...ECeEF45B
0 ETH0.042832.44860504
Execute161257632022-12-06 12:30:23292 days 3 hrs ago1670329823IN
0xa55E0d...ECeEF45B
0 ETH0.0036717212
Queue161175312022-12-05 8:52:35293 days 7 hrs ago1670230355IN
0xa55E0d...ECeEF45B
0 ETH0.0047265911
Cast Vote161147802022-12-04 23:39:47293 days 16 hrs ago1670197187IN
0xa55E0d...ECeEF45B
0 ETH0.0015283813
Cast Vote161138352022-12-04 20:30:11293 days 19 hrs ago1670185811IN
0xa55E0d...ECeEF45B
0 ETH0.0013479812
Cast Vote161125462022-12-04 16:10:11294 days 18 mins ago1670170211IN
0xa55E0d...ECeEF45B
0 ETH0.0006984712.91609431
Cast Vote161089082022-12-04 3:57:47294 days 12 hrs ago1670126267IN
0xa55E0d...ECeEF45B
0 ETH0.0012356511
Cast Vote161088992022-12-04 3:55:59294 days 12 hrs ago1670126159IN
0xa55E0d...ECeEF45B
0 ETH0.0012356511
Cast Vote161088922022-12-04 3:54:35294 days 12 hrs ago1670126075IN
0xa55E0d...ECeEF45B
0 ETH0.0014603113
Cast Vote161078202022-12-04 0:18:47294 days 16 hrs ago1670113127IN
0xa55E0d...ECeEF45B
0 ETH0.0013479812
Cast Vote161066682022-12-03 20:27:59294 days 20 hrs ago1670099279IN
0xa55E0d...ECeEF45B
0 ETH0.0013479812
Cast Vote161064882022-12-03 19:51:59294 days 20 hrs ago1670097119IN
0xa55E0d...ECeEF45B
0 ETH0.0013479812
Cast Vote161061652022-12-03 18:46:23294 days 21 hrs ago1670093183IN
0xa55E0d...ECeEF45B
0 ETH0.0012356511
Cast Vote161051162022-12-03 15:15:11295 days 1 hr ago1670080511IN
0xa55E0d...ECeEF45B
0 ETH0.0013479812
Cast Vote161046542022-12-03 13:42:11295 days 2 hrs ago1670074931IN
0xa55E0d...ECeEF45B
0 ETH0.0012253510.90837419
Cast Vote161046332022-12-03 13:37:59295 days 2 hrs ago1670074679IN
0xa55E0d...ECeEF45B
0 ETH0.0014603113
Cast Vote161041362022-12-03 11:57:59295 days 4 hrs ago1670068679IN
0xa55E0d...ECeEF45B
0 ETH0.0013239812
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 5 : Governance.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

import "./interfaces/IComitium.sol";
import "./Queue.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";

contract Governance is Queue {
    using SafeMath for uint256;

    enum ProposalState {
        WarmUp,
        Active,
        Canceled,
        Failed,
        Accepted,
        Queued,
        Grace,
        Expired,
        Executed,
        Abrogated
    }

    struct Receipt {
        // Whether or not a vote has been cast
        bool hasVoted;
        // support
        bool support;
        // The number of votes the voter had, which were cast
        uint256 votes;
    }

    struct AbrogationProposal {
        address creator;
        uint256 createTime;
        string description;

        uint256 forVotes;
        uint256 againstVotes;

        mapping(address => Receipt) receipts;
    }

    struct ProposalParameters {
        uint256 warmUpDuration;
        uint256 activeDuration;
        uint256 queueDuration;
        uint256 gracePeriodDuration;
        uint256 acceptanceThreshold;
        uint256 minQuorum;
    }

    struct Proposal {
        // proposal identifiers
        // unique id
        uint256 id;
        // Creator of the proposal
        address proposer;
        // proposal description
        string description;
        string title;

        // proposal technical details
        // ordered list of target addresses to be made
        address[] targets;
        // The ordered list of values (i.e. msg.value) to be passed to the calls to be made
        uint256[] values;
        // The ordered list of function signatures to be called
        string[] signatures;
        // The ordered list of calldata to be passed to each call
        bytes[] calldatas;

        // proposal creation time - 1
        uint256 createTime;

        // votes status
        // The timestamp that the proposal will be available for execution, set once the vote succeeds
        uint256 eta;
        // Current number of votes in favor of this proposal
        uint256 forVotes;
        // Current number of votes in opposition to this proposal
        uint256 againstVotes;

        bool canceled;
        bool executed;

        // Receipts of ballots for the entire set of voters
        mapping(address => Receipt) receipts;

        ProposalParameters parameters;
    }

    uint256 public lastProposalId;
    mapping(uint256 => Proposal) public proposals;
    mapping(uint256 => AbrogationProposal) public abrogationProposals;
    mapping(address => uint256) public latestProposalIds;
    IComitium comitium;
    bool isInitialized;
    bool public isActive;

    event ProposalCreated(uint256 indexed proposalId);
    event Vote(uint256 indexed proposalId, address indexed user, bool support, uint256 power);
    event VoteCanceled(uint256 indexed proposalId, address indexed user);
    event ProposalQueued(uint256 indexed proposalId, address caller, uint256 eta);
    event ProposalExecuted(uint256 indexed proposalId, address caller);
    event ProposalCanceled(uint256 indexed proposalId, address caller);
    event AbrogationProposalStarted(uint256 indexed proposalId, address caller);
    event AbrogationProposalExecuted(uint256 indexed proposalId, address caller);
    event AbrogationProposalVote(uint256 indexed proposalId, address indexed user, bool support, uint256 power);
    event AbrogationProposalVoteCancelled(uint256 indexed proposalId, address indexed user);

    receive() external payable {}

    // executed only once
    function initialize(address _comitium) public {
        require(isInitialized == false, "Contract already initialized.");
        require(_comitium != address(0), "comitium must not be 0x0");

        comitium = IComitium(_comitium);
        isInitialized = true;
    }

    function activate() public {
        require(!isActive, "DAO already active");
        require(comitium.fdtStaked() >= ACTIVATION_THRESHOLD, "Threshold not met yet");

        isActive = true;
    }

    function propose(
        address[] memory targets,
        uint256[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description,
        string memory title
    )
    public returns (uint256)
    {
        if (!isActive) {
            require(comitium.fdtStaked() >= ACTIVATION_THRESHOLD, "DAO not yet active");
            isActive = true;
        }

        require(
            comitium.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(),
            "Creation threshold not met"
        );
        require(
            targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length,
            "Proposal function information parity mismatch"
        );
        require(targets.length != 0, "Must provide actions");
        require(targets.length <= PROPOSAL_MAX_ACTIONS, "Too many actions on a vote");
        require(bytes(title).length > 0, "title can't be empty");
        require(bytes(description).length > 0, "description can't be empty");

        // check if user has another running vote
        uint256 previousProposalId = latestProposalIds[msg.sender];
        if (previousProposalId != 0) {
            require(_isLiveState(previousProposalId) == false, "One live proposal per proposer");
        }

        uint256 newProposalId = lastProposalId + 1;
        Proposal storage newProposal = proposals[newProposalId];
        newProposal.id = newProposalId;
        newProposal.proposer = msg.sender;
        newProposal.description = description;
        newProposal.title = title;
        newProposal.targets = targets;
        newProposal.values = values;
        newProposal.signatures = signatures;
        newProposal.calldatas = calldatas;
        newProposal.createTime = block.timestamp - 1;
        newProposal.parameters.warmUpDuration = warmUpDuration;
        newProposal.parameters.activeDuration = activeDuration;
        newProposal.parameters.queueDuration = queueDuration;
        newProposal.parameters.gracePeriodDuration = gracePeriodDuration;
        newProposal.parameters.acceptanceThreshold = acceptanceThreshold;
        newProposal.parameters.minQuorum = minQuorum;

        lastProposalId = newProposalId;
        latestProposalIds[msg.sender] = newProposalId;

        emit ProposalCreated(newProposalId);

        return newProposalId;
    }

    function queue(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Accepted, "Proposal can only be queued if it is succeeded");

        Proposal storage proposal = proposals[proposalId];
        uint256 eta = proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration + proposal.parameters.queueDuration;
        proposal.eta = eta;

        uint256 proposalTargetsLength = proposal.targets.length;
        for (uint256 i = 0; i < proposalTargetsLength; i++) {
            address target = proposal.targets[i];
            uint256 value = proposal.values[i];
            string memory signature = proposal.signatures[i];
            bytes memory data = proposal.calldatas[i];

            require(
                !queuedTransactions[_getTxHash(target, value, signature, data, eta)],
                "proposal action already queued at eta"
            );

            queueTransaction(target, value, signature, data, eta);
        }

        emit ProposalQueued(proposalId, msg.sender, eta);
    }

    function execute(uint256 proposalId) public payable {
        require(state(proposalId) == ProposalState.Grace, "Cannot be executed");

        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;

        uint256 proposalTargetsLength = proposal.targets.length;
        for (uint256 i = 0; i < proposalTargetsLength; i++) {
            executeTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalExecuted(proposalId, msg.sender);
    }

    function cancelProposal(uint256 proposalId) public {
        require(_isCancellableState(proposalId), "Proposal in state that does not allow cancellation");
        require(_canCancelProposal(proposalId), "Cancellation requirements not met");

        Proposal storage proposal = proposals[proposalId];
        proposal.canceled = true;

        uint256 proposalTargetsLength = proposal.targets.length;
        for (uint256 i = 0; i < proposalTargetsLength; i++) {
            cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalCanceled(proposalId, msg.sender);
    }

    function castVote(uint256 proposalId, bool support) public {
        require(state(proposalId) == ProposalState.Active, "Voting is closed");

        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[msg.sender];

        // exit if user already voted
        require(receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option");

        uint256 votes = comitium.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal));
        require(votes > 0, "no voting power");

        // means it changed its vote
        if (receipt.hasVoted) {
            if (receipt.support) {
                proposal.forVotes = proposal.forVotes.sub(receipt.votes);
            } else {
                proposal.againstVotes = proposal.againstVotes.sub(receipt.votes);
            }
        }

        if (support) {
            proposal.forVotes = proposal.forVotes.add(votes);
        } else {
            proposal.againstVotes = proposal.againstVotes.add(votes);
        }

        receipt.hasVoted = true;
        receipt.votes = votes;
        receipt.support = support;

        emit Vote(proposalId, msg.sender, support, votes);
    }

    function cancelVote(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Active, "Voting is closed");

        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[msg.sender];

        uint256 votes = comitium.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal));

        require(receipt.hasVoted, "Cannot cancel if not voted yet");

        if (receipt.support) {
            proposal.forVotes = proposal.forVotes.sub(votes);
        } else {
            proposal.againstVotes = proposal.againstVotes.sub(votes);
        }

        receipt.hasVoted = false;
        receipt.votes = 0;
        receipt.support = false;

        emit VoteCanceled(proposalId, msg.sender);
    }

    // ======================================================================================================
    // Abrogation proposal methods
    // ======================================================================================================

    // the Abrogation Proposal is a mechanism for the DAO participants to veto the execution of a proposal that was already
    // accepted and it is currently queued. For the Abrogation Proposal to pass, 50% + 1 of the vFDT holders
    // must vote FOR the Abrogation Proposal
    function startAbrogationProposal(uint256 proposalId, string memory description) public {
        require(state(proposalId) == ProposalState.Queued, "Proposal must be in queue");
        require(
            comitium.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(),
            "Creation threshold not met"
        );

        AbrogationProposal storage ap = abrogationProposals[proposalId];

        require(ap.createTime == 0, "Abrogation proposal already exists");
        require(bytes(description).length > 0, "description can't be empty");

        ap.createTime = block.timestamp;
        ap.creator = msg.sender;
        ap.description = description;

        emit AbrogationProposalStarted(proposalId, msg.sender);
    }

    // abrogateProposal cancels a proposal if there's an Abrogation Proposal that passed
    function abrogateProposal(uint256 proposalId) public {
        require(state(proposalId) == ProposalState.Abrogated, "Cannot be abrogated");

        Proposal storage proposal = proposals[proposalId];

        require(proposal.canceled == false, "Cannot be abrogated");

        proposal.canceled = true;

        uint256 proposalTargetsLength = proposal.targets.length;
        for (uint256 i = 0; i < proposalTargetsLength; i++) {
            cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit AbrogationProposalExecuted(proposalId, msg.sender);
    }

    function abrogationProposal_castVote(uint256 proposalId, bool support) public {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId];
        require(
            state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0,
            "Abrogation Proposal not active"
        );

        Receipt storage receipt = abrogationProposal.receipts[msg.sender];
        require(
            receipt.hasVoted == false || receipt.hasVoted && receipt.support != support,
            "Already voted this option"
        );

        uint256 votes = comitium.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1);
        require(votes > 0, "no voting power");

        // means it changed its vote
        if (receipt.hasVoted) {
            if (receipt.support) {
                abrogationProposal.forVotes = abrogationProposal.forVotes.sub(receipt.votes);
            } else {
                abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(receipt.votes);
            }
        }

        if (support) {
            abrogationProposal.forVotes = abrogationProposal.forVotes.add(votes);
        } else {
            abrogationProposal.againstVotes = abrogationProposal.againstVotes.add(votes);
        }

        receipt.hasVoted = true;
        receipt.votes = votes;
        receipt.support = support;

        emit AbrogationProposalVote(proposalId, msg.sender, support, votes);
    }

    function abrogationProposal_cancelVote(uint256 proposalId) public {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId];
        Receipt storage receipt = abrogationProposal.receipts[msg.sender];

        require(
            state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0,
            "Abrogation Proposal not active"
        );

        uint256 votes = comitium.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1);

        require(receipt.hasVoted, "Cannot cancel if not voted yet");

        if (receipt.support) {
            abrogationProposal.forVotes = abrogationProposal.forVotes.sub(votes);
        } else {
            abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(votes);
        }

        receipt.hasVoted = false;
        receipt.votes = 0;
        receipt.support = false;

        emit AbrogationProposalVoteCancelled(proposalId, msg.sender);
    }

    // ======================================================================================================
    // views
    // ======================================================================================================

    function state(uint256 proposalId) public view returns (ProposalState) {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        Proposal storage proposal = proposals[proposalId];

        if (proposal.canceled) {
            return ProposalState.Canceled;
        }

        if (proposal.executed) {
            return ProposalState.Executed;
        }

        uint256 createTimeCache = proposal.createTime;
        uint256 warmUpDurationCache = proposal.parameters.warmUpDuration;

        if (block.timestamp <= createTimeCache + warmUpDurationCache) {
            return ProposalState.WarmUp;
        }

        if (block.timestamp <= createTimeCache + warmUpDurationCache + proposal.parameters.activeDuration) {
            return ProposalState.Active;
        }

        uint256 forVotesCache = proposal.forVotes;
        uint256 minForVotesCache = (forVotesCache + proposal.againstVotes).mul(proposal.parameters.acceptanceThreshold).div(100);

        if ((forVotesCache + proposal.againstVotes) < _getQuorum(proposal) ||
            (forVotesCache < minForVotesCache)) {
            return ProposalState.Failed;
        }

        uint256 etaCache = proposal.eta;

        if (etaCache == 0) {
            return ProposalState.Accepted;
        }

        if (block.timestamp < etaCache) {
            return ProposalState.Queued;
        }

        if (_proposalAbrogated(proposalId)) {
            return ProposalState.Abrogated;
        }

        if (block.timestamp <= etaCache + proposal.parameters.gracePeriodDuration) {
            return ProposalState.Grace;
        }

        return ProposalState.Expired;
    }

    function getReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) {
        return proposals[proposalId].receipts[voter];
    }

    function getProposalParameters(uint256 proposalId) public view returns (ProposalParameters memory) {
        return proposals[proposalId].parameters;
    }

    function getAbrogationProposalReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) {
        return abrogationProposals[proposalId].receipts[voter];
    }

    function getActions(uint256 proposalId) public view returns (
        address[] memory targets,
        uint256[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas
    ) {
        Proposal storage p = proposals[proposalId];
        return (p.targets, p.values, p.signatures, p.calldatas);
    }

    function getProposalQuorum(uint256 proposalId) public view returns (uint256) {
        require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id");

        return _getQuorum(proposals[proposalId]);
    }

    // ======================================================================================================
    // internal methods
    // ======================================================================================================

    function _canCancelProposal(uint256 proposalId) internal view returns (bool){
        Proposal storage proposal = proposals[proposalId];

        if (msg.sender == proposal.proposer ||
            comitium.votingPower(proposal.proposer) < _getCreationThreshold()
        ) {
            return true;
        }

        return false;
    }

    function _isCancellableState(uint256 proposalId) internal view returns (bool) {
        ProposalState s = state(proposalId);

        return s == ProposalState.WarmUp || s == ProposalState.Active;
    }

    function _isLiveState(uint256 proposalId) internal view returns (bool) {
        ProposalState s = state(proposalId);

        return s == ProposalState.WarmUp ||
        s == ProposalState.Active ||
        s == ProposalState.Accepted ||
        s == ProposalState.Queued ||
        s == ProposalState.Grace;
    }

    function _getCreationThreshold() internal view returns (uint256) {
        return comitium.fdtStaked().div(100);
    }

    // Returns the timestamp of the snapshot for a given proposal
    // If the current block's timestamp is equal to `proposal.createTime + warmUpDuration` then the state function
    // will return WarmUp as state which will prevent any vote to be cast which will gracefully avoid any flashloan attack
    function _getSnapshotTimestamp(Proposal storage proposal) internal view returns (uint256) {
        return proposal.createTime + proposal.parameters.warmUpDuration;
    }

    function _getQuorum(Proposal storage proposal) internal view returns (uint256) {
        return comitium.fdtStakedAtTs(_getSnapshotTimestamp(proposal)).mul(proposal.parameters.minQuorum).div(100);
    }

    function _proposalAbrogated(uint256 proposalId) internal view returns (bool) {
        Proposal storage p = proposals[proposalId];
        AbrogationProposal storage cp = abrogationProposals[proposalId];

        if (cp.createTime == 0 || block.timestamp < p.eta) {
            return false;
        }

        return cp.forVotes >= comitium.fdtStakedAtTs(cp.createTime - 1).div(2);
    }
}

File 2 of 5 : IComitium.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

interface IComitium {
    struct Stake {
        uint256 timestamp;
        uint256 amount;
        uint256 expiryTimestamp;
        address delegatedTo;
    }

    // deposit allows a user to add more FDT to his staked balance
    function deposit(uint256 amount) external;

    // withdraw allows a user to withdraw funds if the balance is not locked
    function withdraw(uint256 amount) external;

    // lock a user's currently staked balance until timestamp & add the bonus to his voting power
    function lock(uint256 timestamp) external;

    // delegate allows a user to delegate his voting power to another user
    function delegate(address to) external;

    // stopDelegate allows a user to take back the delegated voting power
    function stopDelegate() external;

    // balanceOf returns the current FDT balance of a user (bonus not included)
    function balanceOf(address user) external view returns (uint256);

    // balanceAtTs returns the amount of FDT that the user currently staked (bonus NOT included)
    function balanceAtTs(address user, uint256 timestamp) external view returns (uint256);

    // stakeAtTs returns the Stake object of the user that was valid at `timestamp`
    function stakeAtTs(address user, uint256 timestamp) external view returns (Stake memory);

    // votingPower returns the voting power (bonus included) + delegated voting power for a user at the current block
    function votingPower(address user) external view returns (uint256);

    // votingPowerAtTs returns the voting power (bonus included) + delegated voting power for a user at a point in time
    function votingPowerAtTs(address user, uint256 timestamp) external view returns (uint256);

    // fdtStaked returns the total raw amount of FDT staked at the current block
    function fdtStaked() external view returns (uint256);

    // fdtStakedAtTs returns the total raw amount of FDT users have deposited into the contract
    // it does not include any bonus
    function fdtStakedAtTs(uint256 timestamp) external view returns (uint256);

    // delegatedPower returns the total voting power that a user received from other users
    function delegatedPower(address user) external view returns (uint256);

    // delegatedPowerAtTs returns the total voting power that a user received from other users at a point in time
    function delegatedPowerAtTs(address user, uint256 timestamp) external view returns (uint256);

    // multiplierAtTs calculates the multiplier at a given timestamp based on the user's stake a the given timestamp
    // it includes the decay mechanism
    function multiplierAtTs(address user, uint256 timestamp) external view returns (uint256);

    // userLockedUntil returns the timestamp until the user's balance is locked
    function userLockedUntil(address user) external view returns (uint256);

    // userDidDelegate returns the address to which a user delegated their voting power; address(0) if not delegated
    function userDelegatedTo(address user) external view returns (address);
}

File 3 of 5 : Queue.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

import "./Parameters.sol";

abstract contract Queue is Parameters {

    mapping(bytes32 => bool) public queuedTransactions;

    function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);
        queuedTransactions[txHash] = true;

        return txHash;
    }

    function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);
        queuedTransactions[txHash] = false;
    }

    function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes memory) {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);

        require(block.timestamp >= eta, "executeTransaction: Transaction hasn't surpassed time lock.");
        require(block.timestamp <= eta + gracePeriodDuration, "executeTransaction: Transaction is stale.");

        queuedTransactions[txHash] = false;

        bytes memory callData;

        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        // solium-disable-next-line security/no-call-value
        (bool success, bytes memory returnData) = target.call{value : value}(callData);
        require(success, string(returnData));

        return returnData;
    }

    function _getTxHash(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) {
        return keccak256(abi.encode(target, value, signature, data, eta));
    }
}

File 4 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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;
    }
}

File 5 of 5 : Parameters.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

abstract contract Parameters {
    uint256 public warmUpDuration = 2 days;
    uint256 public activeDuration = 2 days;
    uint256 public queueDuration = 1 days;
    uint256 public gracePeriodDuration = 4 days;

    uint256 public acceptanceThreshold = 60;
    uint256 public minQuorum = 40;

    uint256 constant ACTIVATION_THRESHOLD = 20_000_000 * 10**18;
    uint256 constant PROPOSAL_MAX_ACTIONS = 10;

    modifier onlyDAO() {
        require(msg.sender == address(this), "Only DAO can call");
        _;
    }

    function setWarmUpDuration(uint256 period) public onlyDAO {
        warmUpDuration = period;
    }

    function setActiveDuration(uint256 period) public onlyDAO {
        require(period >= 4 hours, "period must be > 0");
        activeDuration = period;
    }

    function setQueueDuration(uint256 period) public onlyDAO {
        queueDuration = period;
    }

    function setGracePeriodDuration(uint256 period) public onlyDAO {
        require(period >= 4 hours, "period must be > 0");
        gracePeriodDuration = period;
    }

    function setAcceptanceThreshold(uint256 threshold) public onlyDAO {
        require(threshold <= 100, "Maximum is 100.");
        require(threshold > 50, "Minimum is 50.");

        acceptanceThreshold = threshold;
    }

    function setMinQuorum(uint256 quorum) public onlyDAO {
        require(quorum > 5, "quorum must be greater than 5");
        require(quorum <= 100, "Maximum is 100.");

        minQuorum = quorum;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"AbrogationProposalVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AbrogationProposalVoteCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"VoteCanceled","type":"event"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogateProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogationProposal_cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"abrogationProposal_castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"abrogationProposals","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptanceThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getAbrogationProposalReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalParameters","outputs":[{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comitium","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"parameters","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queueDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queuedTransactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setAcceptanceThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setActiveDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setGracePeriodDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setMinQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setQueueDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWarmUpDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"startAbrogationProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum Governance.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmUpDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526202a3006000556202a3006001556201518060025562054600600355603c600455602860055534801561003657600080fd5b5061486e806100466000396000f3fe6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613ce6565b6106f3565b6040516102969b9a999897969594939291906146dc565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613d41565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613bde565b610c62565b60405161029691906146d3565b34801561030f57600080fd5b506102b461031e366004613ce6565b610c74565b34801561032f57600080fd5b50610338610e77565b6040516102969190613ff7565b34801561035157600080fd5b506102b4610360366004613ce6565b610e99565b34801561037157600080fd5b506102b4610380366004613ce6565b611104565b34801561039157600080fd5b506102f66111b4565b3480156103a657600080fd5b506103ba6103b5366004613ce6565b6111ba565b6040516102969493929190613f3f565b3480156103d657600080fd5b506102b46103e5366004613ce6565b611456565b3480156103f657600080fd5b506102b4610405366004613d74565b611506565b34801561041657600080fd5b506102f66116d0565b34801561042b57600080fd5b5061043f61043a366004613ce6565b6116d6565b6040516102969190614012565b34801561045857600080fd5b5061046c610467366004613ce6565b611855565b60405161029691906146a0565b34801561048557600080fd5b506102f6610494366004613bf8565b6118b9565b3480156104a557600080fd5b506102b46104b4366004613ce6565b611d06565b3480156104c557600080fd5b506102b46104d4366004613ce6565b611d5f565b3480156104e557600080fd5b506102f6611e63565b3480156104fa57600080fd5b506102f6611e69565b34801561050f57600080fd5b5061052361051e366004613ce6565b611e6f565b604051610296959493929190613ef6565b34801561054057600080fd5b506102b461054f366004613ce6565b611f3e565b34801561056057600080fd5b506102b461056f366004613d41565b611f97565b34801561058057600080fd5b506102f6612238565b34801561059557600080fd5b506102f661223e565b3480156105aa57600080fd5b506102b46105b9366004613ce6565b612244565b3480156105ca57600080fd5b506102f66123f5565b3480156105df57600080fd5b506102b46105ee366004613bde565b6123fb565b3480156105ff57600080fd5b506102f661060e366004613ce6565b6124ea565b34801561061f57600080fd5b506102b461062e366004613ce6565b612537565b34801561063f57600080fd5b506102b461064e366004613ce6565b61263b565b34801561065f57600080fd5b506102b461066e366004613ce6565b6128f5565b34801561067f57600080fd5b5061069361068e366004613d16565b6129b7565b60405161029691906146ae565b3480156106ac57600080fd5b506106936106bb366004613d16565b612a25565b3480156106cc57600080fd5b506103386106db366004613ce6565b612a93565b6102b46106ee366004613ce6565b612aa8565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f590614185565b60405180910390fd5b600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613cfe565b10156109c95760405162461bcd60e51b81526004016108f590614261565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116d6565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614632565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a875750805460ff168015610a875750805460ff61010090910416151583151514155b610aa35760405162461bcd60e51b81526004016108f5906145fb565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610ace86612d01565b6040518363ffffffff1660e01b8152600401610aeb929190613ed0565b60206040518083038186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3b9190613cfe565b905060008111610b5d5760405162461bcd60e51b81526004016108f590614094565b815460ff1615610bac578154610100900460ff1615610b93576001820154600a840154610b8991612d10565b600a840155610bac565b6001820154600b840154610ba691612d10565b600b8401555b8315610bcb57600a830154610bc19082612d6d565b600a840155610be0565b600b830154610bda9082612d6d565b600b8401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c539088908690614002565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c8657506007548111155b610ca25760405162461bcd60e51b81526004016108f5906141bc565b60008181526009602090815260408083203384526005808201909352922090610cca846116d6565b6009811115610cd557fe5b148015610ce55750600182015415155b610d015760405162461bcd60e51b81526004016108f590614389565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d6491339160001990910190600401613ed0565b60206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db49190613cfe565b825490915060ff16610dd85760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff1615610e00576003830154610df69082612d10565b6003840155610e15565b6004830154610e0f9082612d10565b60048401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610ea4826116d6565b6009811115610eaf57fe5b14610ecc5760405162461bcd60e51b81526004016108f5906143c0565b6000818152600860205260409020600c81015460ff1615610eff5760405162461bcd60e51b81526004016108f5906143c0565b600c8101805460ff19166001179055600481015460005b818110156110c6576110be836004018281548110610f3057fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f6557fe5b9060005260206000200154856006018481548110610f7f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561100d5780601f10610fe25761010080835404028352916020019161100d565b820191906000526020600020905b815481529060010190602001808311610ff057829003601f168201915b505050505086600701858154811061102157fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b50505050508760090154612dce565b600101610f16565b50827f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110f79190613eaf565b60405180910390a2505050565b333014611158576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156111af576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561124957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161121e575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561136e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050815260200190600101906112c3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114405760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561142c5780601f106114015761010080835404028352916020019161142c565b820191906000526020600020905b81548152906001019060200180831161140f57829003601f168201915b505050505081526020019060010190611395565b5050505090509450945094509450509193509193565b3330146114aa576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611501576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b6005611511836116d6565b600981111561151c57fe5b146115395760405162461bcd60e51b81526004016108f5906141f3565b611541612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda99061159d903390600019420190600401613ed0565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190613cfe565b101561160b5760405162461bcd60e51b81526004016108f59061422a565b600082815260096020526040902060018101541561163b5760405162461bcd60e51b81526004016108f59061442e565b600082511161165c5760405162461bcd60e51b81526004016108f59061405d565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161169f90600283019060208501906136c1565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a336040516110f79190613eaf565b60015481565b60008160001080156116ea57506007548211155b6117065760405162461bcd60e51b81526004016108f5906141bc565b6000828152600860205260409020600c81015460ff161561172b576002915050611850565b600c810154610100900460ff1615611747576008915050611850565b6008810154600e82015480820142116117665760009350505050611850565b600f8301548282010142116117815760019350505050611850565b600a8301546012840154600b8501546000916117ac916064916117a691860190612ea7565b90612f00565b90506117b785612f67565b85600b0154830110806117c957508082105b156117dc57600395505050505050611850565b6009850154806117f55760049650505050505050611850565b8042101561180c5760059650505050505050611850565b61181588613013565b156118295760099650505050505050611850565b6011860154810142116118455760069650505050505050611850565b600796505050505050505b919050565b61185d61374d565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff166119eb57600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190613cfe565b10156119aa5760405162461bcd60e51b81526004016108f590614026565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6119f3612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611a4f903390600019420190600401613ed0565b60206040518083038186803b158015611a6757600080fd5b505afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190613cfe565b1015611abd5760405162461bcd60e51b81526004016108f59061422a565b85518751148015611acf575084518751145b8015611adc575083518751145b611af85760405162461bcd60e51b81526004016108f5906142f5565b8651611b165760405162461bcd60e51b81526004016108f59061458d565b600a87511115611b385760405162461bcd60e51b81526004016108f5906145c4565b6000825111611b595760405162461bcd60e51b81526004016108f590614352565b6000835111611b7a5760405162461bcd60e51b81526004016108f59061405d565b336000908152600a60205260409020548015611bb657611b99816130dd565b15611bb65760405162461bcd60e51b81526004016108f5906143f7565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611c14916002840191908901906136c1565b508451611c2a90600383019060208801906136c1565b508951611c4090600483019060208d0190613783565b508851611c5690600583019060208c01906137fd565b508751611c6c90600683019060208b0190613837565b508651611c8290600783019060208a0190613890565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d5a576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611db3576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611e08576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e5e576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611f285780601f10611efd57610100808354040283529160200191611f28565b820191906000526020600020905b815481529060010190602001808311611f0b57829003601f168201915b5050505050908060030154908060040154905085565b333014611f92576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611fa957506007548211155b611fc55760405162461bcd60e51b81526004016108f5906141bc565b60008281526009602052604090206005611fde846116d6565b6009811115611fe957fe5b148015611ff95750600181015415155b6120155760405162461bcd60e51b81526004016108f590614389565b3360009081526005820160205260409020805460ff1615806120515750805460ff1680156120515750805460ff61010090910416151583151514155b61206d5760405162461bcd60e51b81526004016108f5906145fb565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda9916120d091339160001990910190600401613ed0565b60206040518083038186803b1580156120e857600080fd5b505afa1580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190613cfe565b9050600081116121425760405162461bcd60e51b81526004016108f590614094565b815460ff1615612191578154610100900460ff1615612178576001820154600384015461216e91612d10565b6003840155612191565b6001820154600484015461218b91612d10565b60048401555b83156121b05760038301546121a69082612d6d565b60038401556121c5565b60048301546121bf9082612d6d565b60048401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c539088908690614002565b60045481565b60055481565b600161224f826116d6565b600981111561225a57fe5b146122775760405162461bcd60e51b81526004016108f590614632565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda9906122c586612d01565b6040518363ffffffff1660e01b81526004016122e2929190613ed0565b60206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190613cfe565b825490915060ff166123565760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff161561237e57600a8301546123749082612d10565b600a840155612393565b600b83015461238d9082612d10565b600b8401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156124365760405162461bcd60e51b81526004016108f5906144c2565b73ffffffffffffffffffffffffffffffffffffffff81166124695760405162461bcd60e51b81526004016108f59061448b565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b60008160001080156124fe57506007548211155b61251a5760405162461bcd60e51b81526004016108f5906141bc565b600082815260086020526040902061253190612f67565b92915050565b33301461258b576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60648111156125e1576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b60328111612636576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b6004612646826116d6565b600981111561265157fe5b1461266e5760405162461bcd60e51b81526004016108f5906140cb565b600081815260086020819052604082206010810154600f820154600e8301549383015490930190920190910160098201819055600482015491929091905b818110156128b45760008460040182815481106126c557fe5b600091825260208220015460058701805473ffffffffffffffffffffffffffffffffffffffff909216935090849081106126fb57fe5b90600052602060002001549050600086600601848154811061271957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127a75780601f1061277c576101008083540402835291602001916127a7565b820191906000526020600020905b81548152906001019060200180831161278a57829003601f168201915b5050505050905060008760070185815481106127bf57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561284d5780601f106128225761010080835404028352916020019161284d565b820191906000526020600020905b81548152906001019060200180831161283057829003601f168201915b5050505050905060066000612865868686868d613159565b815260208101919091526040016000205460ff16156128965760405162461bcd60e51b81526004016108f590614298565b6128a3848484848b613284565b5050600190930192506126ac915050565b50837ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c2233846040516128e7929190613ed0565b60405180910390a250505050565b6128fe816132b9565b61291a5760405162461bcd60e51b81526004016108f590614530565b612923816132e3565b61293f5760405162461bcd60e51b81526004016108f590614128565b6000818152600860205260408120600c8101805460ff19166001179055600481015490915b818110156129865761297e836004018281548110610f3057fe5b600101612964565b50827f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110f79190613eaf565b6129bf6138e9565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b612a2d6138e9565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b60066020526000908152604090205460ff1681565b6006612ab3826116d6565b6009811115612abe57fe5b14612adb5760405162461bcd60e51b81526004016108f590614669565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600481015490915b81811015612cd057612cc7836004018281548110612b3957fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612b6e57fe5b9060005260206000200154856006018481548110612b8857fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612c165780601f10612beb57610100808354040283529160200191612c16565b820191906000526020600020905b815481529060010190602001808311612bf957829003601f168201915b5050505050866007018581548110612c2a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cb85780601f10612c8d57610100808354040283529160200191612cb8565b820191906000526020600020905b815481529060010190602001808311612c9b57829003601f168201915b505050505087600901546133e2565b50600101612b1f565b50827f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110f79190613eaf565b600e8101546008909101540190565b600082821115612d67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612dc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ddd8686868686613159565b6000908152600660205260409020805460ff19169055505050505050565b6000612ea26064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f909e9676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6a57600080fd5b505afa158015612e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613cfe565b905090565b600082612eb657506000612531565b82820282848281612ec357fe5b0414612dc75760405162461bcd60e51b81526004018080602001828103825260218152602001806148186021913960400191505060405180910390fd5b6000808211612f56576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612f5f57fe5b049392505050565b6013810154600b54600091612531916064916117a69173ffffffffffffffffffffffffffffffffffffffff16637654fff5612fa188612d01565b6040518263ffffffff1660e01b8152600401612fbd91906146d3565b60206040518083038186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190613cfe565b90612ea7565b6000818152600860209081526040808320600990925282206001810154158061303f5750816009015442105b1561304f57600092505050611850565b600b5460018201546040517f7654fff50000000000000000000000000000000000000000000000000000000081526130ce9260029273ffffffffffffffffffffffffffffffffffffffff90911691637654fff5916130b691600019909101906004016146d3565b60206040518083038186803b158015612e6a57600080fd5b60039091015410159392505050565b6000806130e9836116d6565b905060008160098111156130f957fe5b14806131105750600181600981111561310e57fe5b145b806131265750600481600981111561312457fe5b145b8061313c5750600581600981111561313a57fe5b145b80612dc7575060065b81600981111561315157fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156131cc5781810151838201526020016131b4565b50505050905090810190601f1680156131f95780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561322c578181015183820152602001613214565b50505050905090810190601f1680156132595780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132948787878787613159565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b6000806132c5836116d6565b905060008160098111156132d557fe5b1480612dc757506001613145565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806133ca575061331c612dfb565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f69261337892911690600401613eaf565b60206040518083038186803b15801561339057600080fd5b505afa1580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c89190613cfe565b105b156133d9576001915050611850565b50600092915050565b606060006133f38787878787613159565b9050824210156134345760405162461bcd60e51b815260040180806020018281038252603b8152602001806147b4603b913960400191505060405180910390fd5b60035483014211156134775760405162461bcd60e51b81526004018080602001828103825260298152602001806147ef6029913960400191505060405180910390fd5b6000818152600660205260409020805460ff19169055845160609061349d575083613553565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061351b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016134de565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b602083106135bc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161357f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461361e576040519150601f19603f3d011682016040523d82523d6000602084013e613623565b606091505b50915091508181906136b35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613678578181015183820152602001613660565b50505050905090810190601f1680156136a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826136f7576000855561373d565b82601f1061371057805160ff191683800117855561373d565b8280016001018555821561373d579182015b8281111561373d578251825591602001919060010190613722565b50613749929150613909565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561373d579160200282015b8281111561373d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137a3565b82805482825590600052602060002090810192821561373d579160200282018281111561373d578251825591602001919060010190613722565b828054828255906000526020600020908101928215613884579160200282015b8281111561388457825180516138749184916020909101906136c1565b5091602001919060010190613857565b5061374992915061391e565b8280548282559060005260206000209081019282156138dd579160200282015b828111156138dd57825180516138cd9184916020909101906136c1565b50916020019190600101906138b0565b5061374992915061393b565b604080516060810182526000808252602082018190529181019190915290565b5b80821115613749576000815560010161390a565b808211156137495760006139328282613958565b5060010161391e565b8082111561374957600061394f8282613958565b5060010161393b565b50805460018160011615610100020316600290046000825580601f1061397e575061399c565b601f01602090049060005260206000209081019061399c9190613909565b50565b600067ffffffffffffffff8311156139b357fe5b6139e460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601614771565b90508281528383830111156139f857600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461185057600080fd5b600082601f830112613a43578081fd5b81356020613a58613a5383614795565b614771565b8281528181019085830183850287018401881015613a74578586fd5b855b85811015613a9957613a8782613a0f565b84529284019290840190600101613a76565b5090979650505050505050565b600082601f830112613ab6578081fd5b81356020613ac6613a5383614795565b82815281810190858301855b85811015613a99578135880189603f820112613aec578788fd5b613afd8a878301356040840161399f565b8552509284019290840190600101613ad2565b600082601f830112613b20578081fd5b81356020613b30613a5383614795565b82815281810190858301855b85811015613a9957613b53898684358b0101613bbf565b84529284019290840190600101613b3c565b600082601f830112613b75578081fd5b81356020613b85613a5383614795565b8281528181019085830183850287018401881015613ba1578586fd5b855b85811015613a9957813584529284019290840190600101613ba3565b600082601f830112613bcf578081fd5b612dc78383356020850161399f565b600060208284031215613bef578081fd5b612dc782613a0f565b60008060008060008060c08789031215613c10578182fd5b863567ffffffffffffffff80821115613c27578384fd5b613c338a838b01613a33565b97506020890135915080821115613c48578384fd5b613c548a838b01613b65565b96506040890135915080821115613c69578384fd5b613c758a838b01613b10565b95506060890135915080821115613c8a578384fd5b613c968a838b01613aa6565b94506080890135915080821115613cab578384fd5b613cb78a838b01613bbf565b935060a0890135915080821115613ccc578283fd5b50613cd989828a01613bbf565b9150509295509295509295565b600060208284031215613cf7578081fd5b5035919050565b600060208284031215613d0f578081fd5b5051919050565b60008060408385031215613d28578182fd5b82359150613d3860208401613a0f565b90509250929050565b60008060408385031215613d53578182fd5b8235915060208301358015158114613d69578182fd5b809150509250929050565b60008060408385031215613d86578182fd5b82359150602083013567ffffffffffffffff811115613da3578182fd5b613daf85828601613bbf565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613dff578284038952613ded848351613e0c565b98850198935090840190600101613dd5565b5091979650505050505050565b60008151808452815b81811015613e3157602081850181015186830182015201613e15565b81811115613e425782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a06040830152613f2b60a0830186613e0c565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613f8e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101613f5c565b50505083810382850152865180825287830191830190845b81811015613fc257835183529284019291840191600101613fa6565b50508481036040860152613fd68188613db9565b925050508281036060840152613fec8185613db9565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061402057fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20706160408201527f72697479206d69736d6174636800000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f636f6d697469756d206d757374206e6f74206265203078300000000000000000604082015260600190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016125318284613e75565b8151151581526020808301511515908201526040918201519181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d1660208401528060408401526147128184018d613e0c565b90508281036060840152614726818c613e0c565b9150508860808301528760a08301528660c08301528560e0830152841515610100830152831515610120830152614761610140830184613e75565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff8111828210171561478d57fe5b604052919050565b600067ffffffffffffffff8211156147a957fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200ff2a734dd2b297fd5b5c92d54662920dbdba7f781b6d6e2f6fa1c8c4d19c91964736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613ce6565b6106f3565b6040516102969b9a999897969594939291906146dc565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613d41565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613bde565b610c62565b60405161029691906146d3565b34801561030f57600080fd5b506102b461031e366004613ce6565b610c74565b34801561032f57600080fd5b50610338610e77565b6040516102969190613ff7565b34801561035157600080fd5b506102b4610360366004613ce6565b610e99565b34801561037157600080fd5b506102b4610380366004613ce6565b611104565b34801561039157600080fd5b506102f66111b4565b3480156103a657600080fd5b506103ba6103b5366004613ce6565b6111ba565b6040516102969493929190613f3f565b3480156103d657600080fd5b506102b46103e5366004613ce6565b611456565b3480156103f657600080fd5b506102b4610405366004613d74565b611506565b34801561041657600080fd5b506102f66116d0565b34801561042b57600080fd5b5061043f61043a366004613ce6565b6116d6565b6040516102969190614012565b34801561045857600080fd5b5061046c610467366004613ce6565b611855565b60405161029691906146a0565b34801561048557600080fd5b506102f6610494366004613bf8565b6118b9565b3480156104a557600080fd5b506102b46104b4366004613ce6565b611d06565b3480156104c557600080fd5b506102b46104d4366004613ce6565b611d5f565b3480156104e557600080fd5b506102f6611e63565b3480156104fa57600080fd5b506102f6611e69565b34801561050f57600080fd5b5061052361051e366004613ce6565b611e6f565b604051610296959493929190613ef6565b34801561054057600080fd5b506102b461054f366004613ce6565b611f3e565b34801561056057600080fd5b506102b461056f366004613d41565b611f97565b34801561058057600080fd5b506102f6612238565b34801561059557600080fd5b506102f661223e565b3480156105aa57600080fd5b506102b46105b9366004613ce6565b612244565b3480156105ca57600080fd5b506102f66123f5565b3480156105df57600080fd5b506102b46105ee366004613bde565b6123fb565b3480156105ff57600080fd5b506102f661060e366004613ce6565b6124ea565b34801561061f57600080fd5b506102b461062e366004613ce6565b612537565b34801561063f57600080fd5b506102b461064e366004613ce6565b61263b565b34801561065f57600080fd5b506102b461066e366004613ce6565b6128f5565b34801561067f57600080fd5b5061069361068e366004613d16565b6129b7565b60405161029691906146ae565b3480156106ac57600080fd5b506106936106bb366004613d16565b612a25565b3480156106cc57600080fd5b506103386106db366004613ce6565b612a93565b6102b46106ee366004613ce6565b612aa8565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f590614185565b60405180910390fd5b600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613cfe565b10156109c95760405162461bcd60e51b81526004016108f590614261565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116d6565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614632565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a875750805460ff168015610a875750805460ff61010090910416151583151514155b610aa35760405162461bcd60e51b81526004016108f5906145fb565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610ace86612d01565b6040518363ffffffff1660e01b8152600401610aeb929190613ed0565b60206040518083038186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3b9190613cfe565b905060008111610b5d5760405162461bcd60e51b81526004016108f590614094565b815460ff1615610bac578154610100900460ff1615610b93576001820154600a840154610b8991612d10565b600a840155610bac565b6001820154600b840154610ba691612d10565b600b8401555b8315610bcb57600a830154610bc19082612d6d565b600a840155610be0565b600b830154610bda9082612d6d565b600b8401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c539088908690614002565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c8657506007548111155b610ca25760405162461bcd60e51b81526004016108f5906141bc565b60008181526009602090815260408083203384526005808201909352922090610cca846116d6565b6009811115610cd557fe5b148015610ce55750600182015415155b610d015760405162461bcd60e51b81526004016108f590614389565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d6491339160001990910190600401613ed0565b60206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db49190613cfe565b825490915060ff16610dd85760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff1615610e00576003830154610df69082612d10565b6003840155610e15565b6004830154610e0f9082612d10565b60048401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610ea4826116d6565b6009811115610eaf57fe5b14610ecc5760405162461bcd60e51b81526004016108f5906143c0565b6000818152600860205260409020600c81015460ff1615610eff5760405162461bcd60e51b81526004016108f5906143c0565b600c8101805460ff19166001179055600481015460005b818110156110c6576110be836004018281548110610f3057fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f6557fe5b9060005260206000200154856006018481548110610f7f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561100d5780601f10610fe25761010080835404028352916020019161100d565b820191906000526020600020905b815481529060010190602001808311610ff057829003601f168201915b505050505086600701858154811061102157fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b50505050508760090154612dce565b600101610f16565b50827f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110f79190613eaf565b60405180910390a2505050565b333014611158576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156111af576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561124957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161121e575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561136e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050815260200190600101906112c3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114405760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561142c5780601f106114015761010080835404028352916020019161142c565b820191906000526020600020905b81548152906001019060200180831161140f57829003601f168201915b505050505081526020019060010190611395565b5050505090509450945094509450509193509193565b3330146114aa576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611501576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b6005611511836116d6565b600981111561151c57fe5b146115395760405162461bcd60e51b81526004016108f5906141f3565b611541612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda99061159d903390600019420190600401613ed0565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190613cfe565b101561160b5760405162461bcd60e51b81526004016108f59061422a565b600082815260096020526040902060018101541561163b5760405162461bcd60e51b81526004016108f59061442e565b600082511161165c5760405162461bcd60e51b81526004016108f59061405d565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161169f90600283019060208501906136c1565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a336040516110f79190613eaf565b60015481565b60008160001080156116ea57506007548211155b6117065760405162461bcd60e51b81526004016108f5906141bc565b6000828152600860205260409020600c81015460ff161561172b576002915050611850565b600c810154610100900460ff1615611747576008915050611850565b6008810154600e82015480820142116117665760009350505050611850565b600f8301548282010142116117815760019350505050611850565b600a8301546012840154600b8501546000916117ac916064916117a691860190612ea7565b90612f00565b90506117b785612f67565b85600b0154830110806117c957508082105b156117dc57600395505050505050611850565b6009850154806117f55760049650505050505050611850565b8042101561180c5760059650505050505050611850565b61181588613013565b156118295760099650505050505050611850565b6011860154810142116118455760069650505050505050611850565b600796505050505050505b919050565b61185d61374d565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff166119eb57600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190613cfe565b10156119aa5760405162461bcd60e51b81526004016108f590614026565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6119f3612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611a4f903390600019420190600401613ed0565b60206040518083038186803b158015611a6757600080fd5b505afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190613cfe565b1015611abd5760405162461bcd60e51b81526004016108f59061422a565b85518751148015611acf575084518751145b8015611adc575083518751145b611af85760405162461bcd60e51b81526004016108f5906142f5565b8651611b165760405162461bcd60e51b81526004016108f59061458d565b600a87511115611b385760405162461bcd60e51b81526004016108f5906145c4565b6000825111611b595760405162461bcd60e51b81526004016108f590614352565b6000835111611b7a5760405162461bcd60e51b81526004016108f59061405d565b336000908152600a60205260409020548015611bb657611b99816130dd565b15611bb65760405162461bcd60e51b81526004016108f5906143f7565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611c14916002840191908901906136c1565b508451611c2a90600383019060208801906136c1565b508951611c4090600483019060208d0190613783565b508851611c5690600583019060208c01906137fd565b508751611c6c90600683019060208b0190613837565b508651611c8290600783019060208a0190613890565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d5a576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611db3576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611e08576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e5e576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611f285780601f10611efd57610100808354040283529160200191611f28565b820191906000526020600020905b815481529060010190602001808311611f0b57829003601f168201915b5050505050908060030154908060040154905085565b333014611f92576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611fa957506007548211155b611fc55760405162461bcd60e51b81526004016108f5906141bc565b60008281526009602052604090206005611fde846116d6565b6009811115611fe957fe5b148015611ff95750600181015415155b6120155760405162461bcd60e51b81526004016108f590614389565b3360009081526005820160205260409020805460ff1615806120515750805460ff1680156120515750805460ff61010090910416151583151514155b61206d5760405162461bcd60e51b81526004016108f5906145fb565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda9916120d091339160001990910190600401613ed0565b60206040518083038186803b1580156120e857600080fd5b505afa1580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190613cfe565b9050600081116121425760405162461bcd60e51b81526004016108f590614094565b815460ff1615612191578154610100900460ff1615612178576001820154600384015461216e91612d10565b6003840155612191565b6001820154600484015461218b91612d10565b60048401555b83156121b05760038301546121a69082612d6d565b60038401556121c5565b60048301546121bf9082612d6d565b60048401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c539088908690614002565b60045481565b60055481565b600161224f826116d6565b600981111561225a57fe5b146122775760405162461bcd60e51b81526004016108f590614632565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda9906122c586612d01565b6040518363ffffffff1660e01b81526004016122e2929190613ed0565b60206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190613cfe565b825490915060ff166123565760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff161561237e57600a8301546123749082612d10565b600a840155612393565b600b83015461238d9082612d10565b600b8401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156124365760405162461bcd60e51b81526004016108f5906144c2565b73ffffffffffffffffffffffffffffffffffffffff81166124695760405162461bcd60e51b81526004016108f59061448b565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b60008160001080156124fe57506007548211155b61251a5760405162461bcd60e51b81526004016108f5906141bc565b600082815260086020526040902061253190612f67565b92915050565b33301461258b576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60648111156125e1576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b60328111612636576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b6004612646826116d6565b600981111561265157fe5b1461266e5760405162461bcd60e51b81526004016108f5906140cb565b600081815260086020819052604082206010810154600f820154600e8301549383015490930190920190910160098201819055600482015491929091905b818110156128b45760008460040182815481106126c557fe5b600091825260208220015460058701805473ffffffffffffffffffffffffffffffffffffffff909216935090849081106126fb57fe5b90600052602060002001549050600086600601848154811061271957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127a75780601f1061277c576101008083540402835291602001916127a7565b820191906000526020600020905b81548152906001019060200180831161278a57829003601f168201915b5050505050905060008760070185815481106127bf57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561284d5780601f106128225761010080835404028352916020019161284d565b820191906000526020600020905b81548152906001019060200180831161283057829003601f168201915b5050505050905060066000612865868686868d613159565b815260208101919091526040016000205460ff16156128965760405162461bcd60e51b81526004016108f590614298565b6128a3848484848b613284565b5050600190930192506126ac915050565b50837ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c2233846040516128e7929190613ed0565b60405180910390a250505050565b6128fe816132b9565b61291a5760405162461bcd60e51b81526004016108f590614530565b612923816132e3565b61293f5760405162461bcd60e51b81526004016108f590614128565b6000818152600860205260408120600c8101805460ff19166001179055600481015490915b818110156129865761297e836004018281548110610f3057fe5b600101612964565b50827f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110f79190613eaf565b6129bf6138e9565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b612a2d6138e9565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b60066020526000908152604090205460ff1681565b6006612ab3826116d6565b6009811115612abe57fe5b14612adb5760405162461bcd60e51b81526004016108f590614669565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600481015490915b81811015612cd057612cc7836004018281548110612b3957fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612b6e57fe5b9060005260206000200154856006018481548110612b8857fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612c165780601f10612beb57610100808354040283529160200191612c16565b820191906000526020600020905b815481529060010190602001808311612bf957829003601f168201915b5050505050866007018581548110612c2a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cb85780601f10612c8d57610100808354040283529160200191612cb8565b820191906000526020600020905b815481529060010190602001808311612c9b57829003601f168201915b505050505087600901546133e2565b50600101612b1f565b50827f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110f79190613eaf565b600e8101546008909101540190565b600082821115612d67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612dc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ddd8686868686613159565b6000908152600660205260409020805460ff19169055505050505050565b6000612ea26064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f909e9676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6a57600080fd5b505afa158015612e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613cfe565b905090565b600082612eb657506000612531565b82820282848281612ec357fe5b0414612dc75760405162461bcd60e51b81526004018080602001828103825260218152602001806148186021913960400191505060405180910390fd5b6000808211612f56576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612f5f57fe5b049392505050565b6013810154600b54600091612531916064916117a69173ffffffffffffffffffffffffffffffffffffffff16637654fff5612fa188612d01565b6040518263ffffffff1660e01b8152600401612fbd91906146d3565b60206040518083038186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190613cfe565b90612ea7565b6000818152600860209081526040808320600990925282206001810154158061303f5750816009015442105b1561304f57600092505050611850565b600b5460018201546040517f7654fff50000000000000000000000000000000000000000000000000000000081526130ce9260029273ffffffffffffffffffffffffffffffffffffffff90911691637654fff5916130b691600019909101906004016146d3565b60206040518083038186803b158015612e6a57600080fd5b60039091015410159392505050565b6000806130e9836116d6565b905060008160098111156130f957fe5b14806131105750600181600981111561310e57fe5b145b806131265750600481600981111561312457fe5b145b8061313c5750600581600981111561313a57fe5b145b80612dc7575060065b81600981111561315157fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156131cc5781810151838201526020016131b4565b50505050905090810190601f1680156131f95780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561322c578181015183820152602001613214565b50505050905090810190601f1680156132595780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132948787878787613159565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b6000806132c5836116d6565b905060008160098111156132d557fe5b1480612dc757506001613145565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806133ca575061331c612dfb565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f69261337892911690600401613eaf565b60206040518083038186803b15801561339057600080fd5b505afa1580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c89190613cfe565b105b156133d9576001915050611850565b50600092915050565b606060006133f38787878787613159565b9050824210156134345760405162461bcd60e51b815260040180806020018281038252603b8152602001806147b4603b913960400191505060405180910390fd5b60035483014211156134775760405162461bcd60e51b81526004018080602001828103825260298152602001806147ef6029913960400191505060405180910390fd5b6000818152600660205260409020805460ff19169055845160609061349d575083613553565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061351b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016134de565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b602083106135bc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161357f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461361e576040519150601f19603f3d011682016040523d82523d6000602084013e613623565b606091505b50915091508181906136b35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613678578181015183820152602001613660565b50505050905090810190601f1680156136a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826136f7576000855561373d565b82601f1061371057805160ff191683800117855561373d565b8280016001018555821561373d579182015b8281111561373d578251825591602001919060010190613722565b50613749929150613909565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561373d579160200282015b8281111561373d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137a3565b82805482825590600052602060002090810192821561373d579160200282018281111561373d578251825591602001919060010190613722565b828054828255906000526020600020908101928215613884579160200282015b8281111561388457825180516138749184916020909101906136c1565b5091602001919060010190613857565b5061374992915061391e565b8280548282559060005260206000209081019282156138dd579160200282015b828111156138dd57825180516138cd9184916020909101906136c1565b50916020019190600101906138b0565b5061374992915061393b565b604080516060810182526000808252602082018190529181019190915290565b5b80821115613749576000815560010161390a565b808211156137495760006139328282613958565b5060010161391e565b8082111561374957600061394f8282613958565b5060010161393b565b50805460018160011615610100020316600290046000825580601f1061397e575061399c565b601f01602090049060005260206000209081019061399c9190613909565b50565b600067ffffffffffffffff8311156139b357fe5b6139e460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601614771565b90508281528383830111156139f857600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461185057600080fd5b600082601f830112613a43578081fd5b81356020613a58613a5383614795565b614771565b8281528181019085830183850287018401881015613a74578586fd5b855b85811015613a9957613a8782613a0f565b84529284019290840190600101613a76565b5090979650505050505050565b600082601f830112613ab6578081fd5b81356020613ac6613a5383614795565b82815281810190858301855b85811015613a99578135880189603f820112613aec578788fd5b613afd8a878301356040840161399f565b8552509284019290840190600101613ad2565b600082601f830112613b20578081fd5b81356020613b30613a5383614795565b82815281810190858301855b85811015613a9957613b53898684358b0101613bbf565b84529284019290840190600101613b3c565b600082601f830112613b75578081fd5b81356020613b85613a5383614795565b8281528181019085830183850287018401881015613ba1578586fd5b855b85811015613a9957813584529284019290840190600101613ba3565b600082601f830112613bcf578081fd5b612dc78383356020850161399f565b600060208284031215613bef578081fd5b612dc782613a0f565b60008060008060008060c08789031215613c10578182fd5b863567ffffffffffffffff80821115613c27578384fd5b613c338a838b01613a33565b97506020890135915080821115613c48578384fd5b613c548a838b01613b65565b96506040890135915080821115613c69578384fd5b613c758a838b01613b10565b95506060890135915080821115613c8a578384fd5b613c968a838b01613aa6565b94506080890135915080821115613cab578384fd5b613cb78a838b01613bbf565b935060a0890135915080821115613ccc578283fd5b50613cd989828a01613bbf565b9150509295509295509295565b600060208284031215613cf7578081fd5b5035919050565b600060208284031215613d0f578081fd5b5051919050565b60008060408385031215613d28578182fd5b82359150613d3860208401613a0f565b90509250929050565b60008060408385031215613d53578182fd5b8235915060208301358015158114613d69578182fd5b809150509250929050565b60008060408385031215613d86578182fd5b82359150602083013567ffffffffffffffff811115613da3578182fd5b613daf85828601613bbf565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613dff578284038952613ded848351613e0c565b98850198935090840190600101613dd5565b5091979650505050505050565b60008151808452815b81811015613e3157602081850181015186830182015201613e15565b81811115613e425782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a06040830152613f2b60a0830186613e0c565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613f8e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101613f5c565b50505083810382850152865180825287830191830190845b81811015613fc257835183529284019291840191600101613fa6565b50508481036040860152613fd68188613db9565b925050508281036060840152613fec8185613db9565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061402057fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20706160408201527f72697479206d69736d6174636800000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f636f6d697469756d206d757374206e6f74206265203078300000000000000000604082015260600190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016125318284613e75565b8151151581526020808301511515908201526040918201519181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d1660208401528060408401526147128184018d613e0c565b90508281036060840152614726818c613e0c565b9150508860808301528760a08301528660c08301528560e0830152841515610100830152831515610120830152614761610140830184613e75565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff8111828210171561478d57fe5b604052919050565b600067ffffffffffffffff8211156147a957fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200ff2a734dd2b297fd5b5c92d54662920dbdba7f781b6d6e2f6fa1c8c4d19c91964736f6c63430007060033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.