ETH Price: $3,279.92 (+1.08%)

Contract

0x4c808e3C011514d5016536aF11218eEc537eB6F5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GovernorBeta

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-20
*/

// File: contracts/utils/EvmUtil.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.13;

library EvmUtil {

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }

}

// File: contracts/governance/dmg/IDMGToken.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.13;

interface IDMGToken {

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint64 fromBlock;
        uint128 votes;
    }

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    // *************************
    // ***** Functions
    // *************************

    function getPriorVotes(address account, uint blockNumber) external view returns (uint128);

    function getCurrentVotes(address account) external view returns (uint128);

    function delegates(address delegator) external view returns (address);

    function burn(uint amount) external returns (bool);

    function approveBySig(
        address spender,
        uint rawAmount,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

}

// File: contracts/governance/governors/ITimelockInterface.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *
 * Copyright 2020 Compound Labs, Inc.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met:
 * 1.   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
 *      disclaimer.
 * 2.   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
 *      following disclaimer in the documentation and/or other materials provided with the distribution.
 * 3.   Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
 *      products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

pragma solidity ^0.5.13;
pragma experimental ABIEncoderV2;

interface ITimelockInterface {

    function delay() external view returns (uint);

    function GRACE_PERIOD() external view returns (uint);

    function acceptAdmin() external;

    function queuedTransactions(bytes32 hash) external view returns (bool);

    function queueTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external returns (bytes32);

    function cancelTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external;

    function executeTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external payable returns (bytes memory);
}

// File: contracts/governance/governors/GovernorAlphaData.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *
 * Copyright 2020 Compound Labs, Inc.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met:
 * 1.   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
 *      disclaimer.
 * 2.   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
 *      following disclaimer in the documentation and/or other materials provided with the distribution.
 * 3.   Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
 *      products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

pragma solidity ^0.5.13;

contract GovernorAlphaData {

    /// @notice An event emitted when a new proposal is created
    event ProposalCreated(uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startBlock, uint endBlock, string title, string description);

    /// @notice An event emitted when a vote has been cast on a proposal
    event VoteCast(address voter, uint proposalId, bool support, uint votes);

    /// @notice An event emitted when a proposal has been canceled
    event ProposalCanceled(uint id);

    /// @notice An event emitted when a proposal has been queued in the Timelock
    event ProposalQueued(uint id, uint eta);

    /// @notice An event emitted when a proposal has been executed in the Timelock
    event ProposalExecuted(uint id);

    struct Proposal {
        /// @notice Unique id for looking up a proposal
        uint id;

        /// @notice Creator of the proposal
        address proposer;

        /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
        uint eta;

        /// @notice the ordered list of target addresses for calls to be made
        address[] targets;

        /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made
        uint[] values;

        /// @notice The ordered list of function signatures to be called
        string[] signatures;

        /// @notice The ordered list of calldata to be passed to each call
        bytes[] calldatas;

        /// @notice The block at which voting begins: holders must delegate their votes prior to this block
        uint startBlock;

        /// @notice The block at which voting ends: votes must be cast prior to this block
        uint endBlock;

        /// @notice Current number of votes in favor of this proposal
        uint forVotes;

        /// @notice Current number of votes in opposition to this proposal
        uint againstVotes;

        /// @notice Flag marking whether the proposal has been canceled
        bool canceled;

        /// @notice Flag marking whether the proposal has been executed
        bool executed;

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

    /// @notice Ballot receipt record for a voter
    struct Receipt {
        /// @notice Whether or not a vote has been cast
        bool hasVoted;

        /// @notice Whether or not the voter supports the proposal
        bool support;

        /// @notice The number of votes the voter had, which were cast
        uint128 votes;
    }

    /// @notice Possible states that a proposal may be in
    enum ProposalState {
        Pending,
        Active,
        Canceled,
        Defeated,
        Succeeded,
        Queued,
        Expired,
        Executed
    }

}

// File: contracts/governance/governors/GovernorAlpha.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *
 * Copyright 2020 Compound Labs, Inc.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met:
 * 1.   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
 *      disclaimer.
 * 2.   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
 *      following disclaimer in the documentation and/or other materials provided with the distribution.
 * 3.   Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
 *      products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

pragma solidity ^0.5.13;





/**
 * This contract is mainly based on Compound's Governor Alpha contract. Attribution to Compound Labs as the original
 * creator of the contract can be seen above.
 *
 * Changes made to the original contract include slight name changes, adding a `title` field to the Proposal struct,
 * and minor data type adjustments to account for DMG using more bits for storage (128 instead of 96).
 */
contract GovernorAlpha is GovernorAlphaData {
    /// @notice The name of this contract
    string public constant name = "DMM Governor Alpha";

    /// @notice The address of the DMM Protocol Timelock
    ITimelockInterface public timelock;

    /// @notice The address of the DMG governance token
    IDMGToken public dmg;

    /// @notice The address of the Governor Guardian
    address public guardian;

    /// @notice The total number of proposals
    uint public proposalCount;

    /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
    uint public quorumVotes;

    /// @notice The minimum number of votes needed to create a proposal
    uint public proposalThreshold;

    /// @notice The duration of voting on a proposal, in blocks
    uint public votingPeriod;

    /// @notice The official record of all proposals ever proposed
    mapping(uint => Proposal) public proposals;

    /// @notice The latest proposal for each proposer
    mapping(address => uint) public latestProposalIds;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the ballot struct used by the contract
    bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,bool support)");

    constructor(
        address dmg_,
        address guardian_
    ) public {
        dmg = IDMGToken(dmg_);
        guardian = guardian_;
        quorumVotes = 500_000e18;
        proposalThreshold = 100_000e18;

        // ~3 days in blocks (assuming 15s blocks)
        votingPeriod = 17280;
    }

    function initializeTimelock(
        address timelock_
    ) public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::setTimelock: Caller must be guardian"
        );
        require(
            address(timelock) == address(0x0),
            "GovernorAlpha::setTimelock: timelock must not be initialized yet"
        );

        timelock = ITimelockInterface(timelock_);
    }

    function setQuorumVotes(
        uint quorumVotes_
    ) public {
        require(
            msg.sender == address(timelock),
            "GovernorAlpha::setQuorumVotes: invalid sender"
        );
        quorumVotes = quorumVotes_;
    }

    function setProposalThreshold(
        uint proposalThreshold_
    ) public {
        require(
            msg.sender == address(timelock),
            "GovernorAlpha::setProposalThreshold: invalid sender"
        );
        proposalThreshold = proposalThreshold_;
    }

    /**
     * @return  The maximum number of actions that can be included in a proposal
     */
    function proposalMaxOperations() public pure returns (uint) {
        // 10 actions
        return 10;
    }

    /**
     * @return  The delay (represented as number of blocks) before voting on a proposal may take place, once proposed
     */
    function votingDelay() public pure returns (uint) {
        // 1 block
        return 1;
    }

    function setVotingPeriod(
        uint votingPeriod_
    ) public {
        require(
            msg.sender == address(timelock),
            "GovernorAlpha::setVotingPeriod: invalid sender"
        );
        require(
            votingPeriod_ >= 5760,
            "GovernorAlpha::setVotingPeriod: new voting period must exceed minimum"
        );

        // The minimum number of blocks for a vote is ~1 day (assuming 15s blocks)
        votingPeriod = votingPeriod_;
    }

    function propose(
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory title,
        string memory description
    ) public returns (uint) {
        require(
            msg.sender == guardian || _getVotes(msg.sender, sub256(block.number, 1)) > proposalThreshold,
            "GovernorAlpha::propose: proposer votes below proposal threshold"
        );
        require(
            targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length,
            "GovernorAlpha::propose: proposal function information arity mismatch"
        );
        require(
            targets.length != 0,
            "GovernorAlpha::propose: must provide actions"
        );
        require(
            targets.length <= proposalMaxOperations(),
            "GovernorAlpha::propose: too many actions"
        );

        uint latestProposalId = latestProposalIds[msg.sender];
        if (latestProposalId != 0) {
            ProposalState proposersLatestProposalState = state(latestProposalId);
            require(
                proposersLatestProposalState != ProposalState.Active,
                "GovernorAlpha::propose: one live proposal per proposer, found an already active proposal"
            );
            require(
                proposersLatestProposalState != ProposalState.Pending,
                "GovernorAlpha::propose: one live proposal per proposer, found an already pending proposal"
            );
        }

        uint startBlock = add256(block.number, votingDelay());
        uint endBlock = add256(startBlock, votingPeriod);

        proposalCount++;
        Proposal memory newProposal = Proposal({
        id : proposalCount,
        proposer : msg.sender,
        eta : 0,
        targets : targets,
        values : values,
        signatures : signatures,
        calldatas : calldatas,
        startBlock : startBlock,
        endBlock : endBlock,
        forVotes : 0,
        againstVotes : 0,
        canceled : false,
        executed : false
        });

        proposals[newProposal.id] = newProposal;
        latestProposalIds[newProposal.proposer] = newProposal.id;

        emit ProposalCreated(newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, title, description);
        return newProposal.id;
    }

    function queue(
        uint proposalId
    ) public {
        require(
            state(proposalId) == ProposalState.Succeeded,
            "GovernorAlpha::queue: proposal can only be queued if it is succeeded"
        );

        Proposal storage proposal = proposals[proposalId];
        uint eta = add256(block.timestamp, timelock.delay());
        for (uint i = 0; i < proposal.targets.length; i++) {
            _queueOrRevert(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta);
        }
        proposal.eta = eta;
        emit ProposalQueued(proposalId, eta);
    }

    function _queueOrRevert(
        address target,
        uint value,
        string memory signature,
        bytes memory data,
        uint eta
    ) internal {
        require(
            !timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))),
            "GovernorAlpha::_queueOrRevert: proposal action already queued at eta"
        );

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

    function execute(
        uint proposalId
    ) public payable {
        require(
            state(proposalId) == ProposalState.Queued,
            "GovernorAlpha::execute: proposal can only be executed if it is queued"
        );

        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.executeTransaction.value(proposal.values[i])(
                proposal.targets[i],
                proposal.values[i],
                proposal.signatures[i],
                proposal.calldatas[i],
                proposal.eta
            );
        }
        emit ProposalExecuted(proposalId);
    }

    function cancel(
        uint proposalId
    ) public {
        ProposalState state = state(proposalId);
        require(
            state != ProposalState.Executed,
            "GovernorAlpha::cancel: cannot cancel executed proposal"
        );

        Proposal storage proposal = proposals[proposalId];
        require(
            msg.sender == proposal.proposer || _getVotes(proposal.proposer, sub256(block.number, 1)) < proposalThreshold,
            "GovernorAlpha::cancel: proposer above threshold"
        );

        proposal.canceled = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalCanceled(proposalId);
    }

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

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

    function state(
        uint proposalId
    ) public view returns (ProposalState) {
        require(
            proposalCount >= proposalId && proposalId > 0,
            "GovernorAlpha::state: invalid proposal id"
        );

        Proposal storage proposal = proposals[proposalId];
        if (proposal.canceled) {
            return ProposalState.Canceled;
        } else if (block.number <= proposal.startBlock) {
            return ProposalState.Pending;
        } else if (block.number <= proposal.endBlock) {
            return ProposalState.Active;
        } else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes) {
            return ProposalState.Defeated;
        } else if (proposal.eta == 0) {
            return ProposalState.Succeeded;
        } else if (proposal.executed) {
            return ProposalState.Executed;
        } else if (block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())) {
            return ProposalState.Expired;
        } else {
            return ProposalState.Queued;
        }
    }

    function castVote(
        uint proposalId,
        bool support
    )
    public returns (uint128) {
        return _castVote(msg.sender, proposalId, support);
    }

    function castVoteBySig(
        uint proposalId,
        bool support,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
    public returns (uint128) {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "GovernorAlpha::castVoteBySig: invalid signature"
        );
        return _castVote(signatory, proposalId, support);
    }

    function _castVote(
        address voter,
        uint proposalId,
        bool support
    ) internal returns (uint128) {
        require(
            state(proposalId) == ProposalState.Active,
            "GovernorAlpha::_castVote: voting is closed"
        );

        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[voter];
        require(
            receipt.hasVoted == false,
            "GovernorAlpha::_castVote: voter already voted"
        );

        uint128 votes = _getVotes(voter, proposal.startBlock);

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

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

        emit VoteCast(voter, proposalId, support, votes);

        return votes;
    }

    function __acceptAdmin() public {
        require(
            msg.sender == guardian || msg.sender == address(timelock),
            "GovernorAlpha::__acceptAdmin: sender must be gov guardian or timelock"
        );

        timelock.acceptAdmin();
    }

    function __abdicate() public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__abdicate: sender must be gov guardian"
        );

        guardian = address(0);
    }

    function __queueSetTimelockPendingAdmin(
        address newPendingAdmin,
        uint eta
    ) public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__queueSetTimelockPendingAdmin: sender must be gov guardian"
        );

        timelock.queueTransaction(address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta);
    }

    function __executeSetTimelockPendingAdmin(
        address newPendingAdmin,
        uint eta
    ) public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__executeSetTimelockPendingAdmin: sender must be gov guardian"
        );

        timelock.executeTransaction(address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta);
    }

    function _getVotes(
        address user,
        uint blockNumber
    ) internal view returns (uint128) {
        return dmg.getPriorVotes(user, blockNumber);
    }

    function add256(uint256 a, uint256 b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "GovernorAlpha::add256: ADDITION_OVERFLOW");
        return c;
    }

    function sub256(uint256 a, uint256 b) internal pure returns (uint) {
        require(b <= a, "GovernorAlpha::add256: SUBTRACTION_UNDERFLOW");
        return a - b;
    }

    function getChainId() internal pure returns (uint) {
        uint chainId;
        assembly {chainId := chainid()}
        return chainId;
    }
}

// File: contracts/governance/dmg/SafeBitMath.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.0;

library SafeBitMath {

    function safe64(uint n, string memory errorMessage) internal pure returns (uint64) {
        require(n < 2 ** 64, errorMessage);
        return uint64(n);
    }

    function safe128(uint n, string memory errorMessage) internal pure returns (uint128) {
        require(n < 2 ** 128, errorMessage);
        return uint128(n);
    }

    function add128(uint128 a, uint128 b, string memory errorMessage) internal pure returns (uint128) {
        uint128 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function add128(uint128 a, uint128 b) internal pure returns (uint128) {
        return add128(a, b, "");
    }

    function sub128(uint128 a, uint128 b, string memory errorMessage) internal pure returns (uint128) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function sub128(uint128 a, uint128 b) internal pure returns (uint128) {
        return sub128(a, b, "");
    }

}

// File: @openzeppelin/upgrades/contracts/Initializable.sol

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: contracts/protocol/interfaces/IOwnableOrGuardian.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.0;


/**
 * NOTE:    THE STATE VARIABLES IN THIS CONTRACT CANNOT CHANGE NAME OR POSITION BECAUSE THIS CONTRACT IS USED IN
 *          UPGRADEABLE CONTRACTS.
 */
contract IOwnableOrGuardian is Initializable {

    // *************************
    // ***** Events
    // *************************

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event GuardianTransferred(address indexed previousGuardian, address indexed newGuardian);

    // *************************
    // ***** Modifiers
    // *************************

    modifier onlyOwnerOrGuardian {
        require(
            msg.sender == _owner || msg.sender == _guardian,
            "OwnableOrGuardian: UNAUTHORIZED_OWNER_OR_GUARDIAN"
        );
        _;
    }

    modifier onlyOwner {
        require(
            msg.sender == _owner,
            "OwnableOrGuardian: UNAUTHORIZED"
        );
        _;
    }
    // *********************************************
    // ***** State Variables DO NOT CHANGE OR MOVE
    // *********************************************

    // ******************************
    // ***** DO NOT CHANGE OR MOVE
    // ******************************
    address internal _owner;
    address internal _guardian;
    // ******************************
    // ***** DO NOT CHANGE OR MOVE
    // ******************************

    // ******************************
    // ***** Misc Functions
    // ******************************

    function owner() external view returns (address) {
        return _owner;
    }

    function guardian() external view returns (address) {
        return _guardian;
    }

    // ******************************
    // ***** Admin Functions
    // ******************************

    function initialize(
        address __owner,
        address __guardian
    )
    public
    initializer {
        _transferOwnership(__owner);
        _transferGuardian(__guardian);
    }

    function transferOwnership(
        address __owner
    )
    public
    onlyOwner {
        require(
            __owner != address(0),
            "OwnableOrGuardian::transferOwnership: INVALID_OWNER"
        );
        _transferOwnership(__owner);
    }

    function renounceOwnership() public onlyOwner {
        _transferOwnership(address(0));
    }

    function transferGuardian(
        address __guardian
    )
    public
    onlyOwner {
        require(
            __guardian != address(0),
            "OwnableOrGuardian::transferGuardian: INVALID_OWNER"
        );
        _transferGuardian(__guardian);
    }

    function renounceGuardian() public onlyOwnerOrGuardian {
        _transferGuardian(address(0));
    }

    // ******************************
    // ***** Internal Functions
    // ******************************

    function _transferOwnership(
        address __owner
    )
    internal {
        address previousOwner = _owner;
        _owner = __owner;
        emit OwnershipTransferred(previousOwner, __owner);
    }

    function _transferGuardian(
        address __guardian
    )
    internal {
        address previousGuardian = _guardian;
        _guardian = __guardian;
        emit GuardianTransferred(previousGuardian, __guardian);
    }

}

// File: contracts/external/asset_introducers/AssetIntroducerData.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.0;




contract AssetIntroducerData is Initializable, IOwnableOrGuardian {

    // *************************
    // ***** Constants
    // *************************

    // *************************
    // ***** V1 State Variables
    // *************************

    /// For preventing reentrancy attacks
    uint64 internal _guardCounter;

    AssetIntroducerStateV1 internal _assetIntroducerStateV1;

    ERC721StateV1 internal _erc721StateV1;

    VoteStateV1 internal _voteStateV1;

    // *************************
    // ***** Data Structures
    // *************************

    enum AssetIntroducerType {
        PRINCIPAL, AFFILIATE
    }

    struct AssetIntroducerStateV1 {
        /// The timestamp at which this contract was initialized
        uint64 initTimestamp;

        /// True if the DMM Foundation purchased its token for the bootstrapped pool, false otherwise.
        bool isDmmFoundationSetup;

        /// Total amount of DMG locked in this contract
        uint128 totalDmgLocked;

        /// For calculating the results of off-chain signature requests
        bytes32 domainSeparator;

        /// Address of the DMG token
        address dmg;

        /// Address of the DMM Controller
        address dmmController;

        /// Address of the DMM token valuator, which gets the USD value of a token
        address underlyingTokenValuator;

        /// Address of the implementation for the discount
        address assetIntroducerDiscount;

        /// Address of the implementation for the staking purchaser contract. Used to buy NFTs at a steep discount by
        /// staking mTokens.
        address stakingPurchaser;

        /// Mapping from NFT ID to the asset introducer struct.
        mapping(uint => AssetIntroducer) idToAssetIntroducer;

        /// Mapping from country code to asset introducer type to token IDs
        mapping(bytes3 => mapping(uint8 => uint[])) countryCodeToAssetIntroducerTypeToTokenIdsMap;

        /// A mapping from the country code to asset introducer type to the cost needed to buy one. The cost is represented
        /// in USD (with 18 decimals) and is purchased using DMG, so a conversion is needed using Chainlink.
        mapping(bytes3 => mapping(uint8 => uint96)) countryCodeToAssetIntroducerTypeToPriceUsd;

        /// The dollar amount that has actually been deployed by the asset introducer
        mapping(uint => mapping(address => uint)) tokenIdToUnderlyingTokenToWithdrawnAmount;

        /// Mapping for the count of each user's off-chain signed messages. 0-indexed.
        mapping(address => uint) ownerToNonceMap;
    }

    struct ERC721StateV1 {
        /// Total number of NFTs created
        uint64 totalSupply;

        /// The proxy address created by OpenSea, which is used to enable a smoother trading experience
        address openSeaProxyRegistry;

        /// The last token ID in the linked list.
        uint lastTokenId;

        /// The base URI for getting NFT information by token ID.
        string baseURI;

        /// Mapping of all token IDs. Works as a linked list such that previous key --> next value. The 0th key in the
        /// list is LINKED_LIST_GUARD.
        mapping(uint => uint) allTokens;

        /// Mapping from NFT ID to owner address.
        mapping(uint256 => address) idToOwnerMap;

        /// Mapping from NFT ID to approved address.
        mapping(uint256 => address) idToSpenderMap;

        /// Mapping from owner to an operator that can spend all of owner's NFTs.
        mapping(address => mapping(address => bool)) ownerToOperatorToIsApprovedMap;

        /// Mapping from owner address to all owned token IDs. Works as a linked list such that previous key --> next value.
        /// The 0th key in the list is LINKED_LIST_GUARD.
        mapping(address => mapping(uint => uint)) ownerToTokenIds;

        /// Mapping from owner address to a count of all owned NFTs.
        mapping(address => uint32) ownerToTokenCount;

        /// Mapping from an interface to whether or not it's supported.
        mapping(bytes4 => bool) interfaceIdToIsSupportedMap;
    }

    /// Used for storing information about voting
    struct VoteStateV1 {
        /// Taken from the DMG token implementation
        mapping(address => mapping(uint64 => Checkpoint)) ownerToCheckpointIndexToCheckpointMap;
        /// Taken from the DMG token implementation
        mapping(address => uint64) ownerToCheckpointCountMap;
    }

    /// Tightly-packed, this data structure is 2 slots; 64 bytes
    struct AssetIntroducer {
        bytes3 countryCode;
        AssetIntroducerType introducerType;
        /// True if the asset introducer has been purchased yet, false if it hasn't and is thus
        bool isOnSecondaryMarket;
        /// True if the asset introducer can withdraw tokens from mToken deposits, false if it cannot yet. This value
        /// must only be changed to `true` via governance vote
        bool isAllowedToWithdrawFunds;
        /// 1-based index at which the asset introducer was created. Used for optics
        uint16 serialNumber;
        uint96 dmgLocked;
        /// How much this asset introducer can manage
        uint96 dollarAmountToManage;
        uint tokenId;
    }

    /// Used for tracking delegation and number of votes each user has at a given block height.
    struct Checkpoint {
        uint64 fromBlock;
        uint128 votes;
    }

    /// Used to prevent the "stack too deep" error and make code more readable
    struct DmgApprovalStruct {
        address spender;
        uint rawAmount;
        uint nonce;
        uint expiry;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct DiscountStruct {
        uint64 initTimestamp;
    }

    // *************************
    // ***** Modifiers
    // *************************

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;

        _;

        require(
            localCounter == _guardCounter,
            "AssetIntroducerData: REENTRANCY"
        );
    }

    /// Enforces that an NFT has NOT been sold to a user yet
    modifier requireIsPrimaryMarketNft(uint __tokenId) {
        require(
            !_assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isOnSecondaryMarket,
            "AssetIntroducerData: IS_SECONDARY_MARKET"
        );

        _;
    }

    /// Enforces that an NFT has been sold to a user
    modifier requireIsSecondaryMarketNft(uint __tokenId) {
        require(
            _assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isOnSecondaryMarket,
            "AssetIntroducerData: IS_PRIMARY_MARKET"
        );

        _;
    }

    modifier requireIsValidNft(uint __tokenId) {
        require(
            _erc721StateV1.idToOwnerMap[__tokenId] != address(0),
            "AssetIntroducerData: INVALID_NFT"
        );

        _;
    }

    modifier requireIsNftOwner(uint __tokenId) {
        require(
            _erc721StateV1.idToOwnerMap[__tokenId] == msg.sender,
            "AssetIntroducerData: INVALID_NFT_OWNER"
        );

        _;
    }

    modifier requireCanWithdrawFunds(uint __tokenId) {
        require(
            _assetIntroducerStateV1.idToAssetIntroducer[__tokenId].isAllowedToWithdrawFunds,
            "AssetIntroducerData: NFT_NOT_ACTIVATED"
        );

        _;
    }

    modifier requireIsStakingPurchaser() {
        require(
            _assetIntroducerStateV1.stakingPurchaser != address(0),
            "AssetIntroducerData: STAKING_PURCHASER_NOT_SETUP"
        );

        require(
            _assetIntroducerStateV1.stakingPurchaser == msg.sender,
            "AssetIntroducerData: INVALID_SENDER_FOR_STAKING"
        );
        _;
    }

}

// File: contracts/external/asset_introducers/v1/IAssetIntroducerV1.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.0;


interface IAssetIntroducerV1 {

    // *************************
    // ***** Events
    // *************************

    event AssetIntroducerBought(uint indexed tokenId, address indexed buyer, address indexed recipient, uint dmgAmount);
    event AssetIntroducerActivationChanged(uint indexed tokenId, bool isActivated);
    event AssetIntroducerCreated(uint indexed tokenId, string countryCode, AssetIntroducerData.AssetIntroducerType introducerType, uint serialNumber);
    event AssetIntroducerDiscountChanged(address indexed oldAssetIntroducerDiscount, address indexed newAssetIntroducerDiscount);
    event AssetIntroducerDollarAmountToManageChange(uint indexed tokenId, uint oldDollarAmountToManage, uint newDollarAmountToManage);
    event AssetIntroducerPriceChanged(string indexed countryCode, AssetIntroducerData.AssetIntroducerType indexed introducerType, uint oldPriceUsd, uint newPriceUsd);
    event BaseURIChanged(string newBaseURI);
    event CapitalDeposited(uint indexed tokenId, address indexed token, uint amount);
    event CapitalWithdrawn(uint indexed tokenId, address indexed token, uint amount);
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
    event InterestPaid(uint indexed tokenId, address indexed token, uint amount);
    event SignatureValidated(address indexed signer, uint nonce);
    event StakingPurchaserChanged(address indexed oldStakingPurchaser, address indexed newStakingPurchaser);

    // *************************
    // ***** Admin Functions
    // *************************

    function createAssetIntroducersForPrimaryMarket(
        string[] calldata countryCode,
        AssetIntroducerData.AssetIntroducerType[] calldata introducerType
    ) external returns (uint[] memory);

    function setDollarAmountToManageByTokenId(
        uint tokenId,
        uint dollarAmountToManage
    ) external;

    function setDollarAmountToManageByCountryCodeAndIntroducerType(
        string calldata countryCode,
        AssetIntroducerData.AssetIntroducerType introducerType,
        uint dollarAmountToManage
    ) external;

    function setAssetIntroducerDiscount(
        address assetIntroducerDiscount
    ) external;

    function setAssetIntroducerPrice(
        string calldata countryCode,
        AssetIntroducerData.AssetIntroducerType introducerType,
        uint priceUsd
    ) external;

    function activateAssetIntroducerByTokenId(
        uint tokenId
    ) external;

    function setStakingPurchaser(
        address stakingPurchaser
    ) external;

    // *************************
    // ***** Misc Functions
    // *************************

    /**
     * @return  The timestamp at which this contract was created
     */
    function initTimestamp() external view returns (uint64);

    function stakingPurchaser() external view returns (address);

    function openSeaProxyRegistry() external view returns (address);

    /**
     * @return  The domain separator used in off-chain signatures. See EIP 712 for more:
     *          https://eips.ethereum.org/EIPS/eip-712
     */
    function domainSeparator() external view returns (bytes32);

    /**
     * @return  The address of the DMG token
     */
    function dmg() external view returns (address);

    function dmmController() external view returns (address);

    function underlyingTokenValuator() external view returns (address);

    function assetIntroducerDiscount() external view returns (address);

    /**
     * @return  The discount applied to the price of the asset introducer for being an early purchaser. Represented as
     *          a number with 18 decimals, such that 0.1 * 1e18 == 10%
     */
    function getAssetIntroducerDiscount() external view returns (uint);

    /**
     * @return  The price of the asset introducer, represented in USD
     */
    function getAssetIntroducerPriceUsdByTokenId(
        uint tokenId
    ) external view returns (uint);

    /**
     * @return  The price of the asset introducer, represented in DMG. DMG is the needed currency to purchase an asset
     *          introducer NFT.
     */
    function getAssetIntroducerPriceDmgByTokenId(
        uint tokenId
    ) external view returns (uint);

    function getAssetIntroducerPriceUsdByCountryCodeAndIntroducerType(
        string calldata countryCode,
        AssetIntroducerData.AssetIntroducerType introducerType
    )
    external view returns (uint);

    function getAssetIntroducerPriceDmgByCountryCodeAndIntroducerType(
        string calldata countryCode,
        AssetIntroducerData.AssetIntroducerType introducerType
    )
    external view returns (uint);

    /**
     * @return  The total amount of DMG locked in the asset introducer reserves
     */
    function getTotalDmgLocked() external view returns (uint);

    /**
     * @return  The amount that this asset introducer can manager, represented in wei format (a number with 18
     *          decimals). Meaning, 10,000.25 * 1e18 == $10,000.25
     */
    function getDollarAmountToManageByTokenId(
        uint tokenId
    ) external view returns (uint);

    /**
     * @return  The amount of DMG that this asset introducer has locked in order to maintain a valid status as an asset
     *          introducer.
     */
    function getDmgLockedByTokenId(
        uint tokenId
    ) external view returns (uint);

    function getAssetIntroducerByTokenId(
        uint tokenId
    ) external view returns (AssetIntroducerData.AssetIntroducer memory);

    function getAssetIntroducersByCountryCode(
        string calldata countryCode
    ) external view returns (AssetIntroducerData.AssetIntroducer[] memory);

    function getAllAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory);

    function getPrimaryMarketAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory);

    function getSecondaryMarketAssetIntroducers() external view returns (AssetIntroducerData.AssetIntroducer[] memory);

    // *************************
    // ***** User Functions
    // *************************

    function getNonceByUser(
        address user
    ) external view returns (uint);

    function getNextAssetIntroducerTokenId(
        string calldata __countryCode,
        AssetIntroducerData.AssetIntroducerType __introducerType
    ) external view returns (uint);

    /**
     * Buys the slot for the appropriate amount of DMG, by attempting to transfer the DMG from `msg.sender` to this
     * contract
     */
    function buyAssetIntroducerSlot(
        uint tokenId
    ) external returns (bool);

    /**
     * Buys the slot for the appropriate amount of DMG, by attempting to transfer the DMG from `msg.sender` to this
     * contract. The additional discount is added to the existing one
     */
    function buyAssetIntroducerSlotViaStaking(
        uint tokenId,
        uint additionalDiscount
    ) external returns (bool);

    function nonceOf(
        address user
    ) external view returns (uint);

    function buyAssetIntroducerSlotBySig(
        uint tokenId,
        address recipient,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (bool);

    function buyAssetIntroducerSlotBySigWithDmgPermit(
        uint __tokenId,
        address __recipient,
        uint __nonce,
        uint __expiry,
        uint8 __v,
        bytes32 __r,
        bytes32 __s,
        AssetIntroducerData.DmgApprovalStruct calldata dmgApprovalStruct
    ) external returns (bool);

    function getPriorVotes(
        address user,
        uint blockNumber
    ) external view returns (uint128);

    function getCurrentVotes(
        address user
    ) external view returns (uint);

    function getDmgLockedByUser(
        address user
    ) external view returns (uint);

    /**
     * @return  The amount of capital that has been withdrawn by this asset introducer, denominated in USD with 18
     *          decimals
     */
    function getDeployedCapitalUsdByTokenId(
        uint tokenId
    ) external view returns (uint);

    function getWithdrawnAmountByTokenIdAndUnderlyingToken(
        uint tokenId,
        address underlyingToken
    ) external view returns (uint);

    /**
     * @dev Deactivates the specified asset introducer from being able to withdraw funds. Doing so enables it to
     *      be transferred. NOTE: NFTs can only be deactivated once all deployed capital is returned.
     */
    function deactivateAssetIntroducerByTokenId(
        uint tokenId
    ) external;

    function withdrawCapitalByTokenIdAndToken(
        uint tokenId,
        address token,
        uint amount
    ) external;

    function depositCapitalByTokenIdAndToken(
        uint tokenId,
        address token,
        uint amount
    ) external;

    function payInterestByTokenIdAndToken(
        uint tokenId,
        address token,
        uint amount
    ) external;

    // *************************
    // ***** Other Functions
    // *************************

    /**
     * @dev Used by the DMMF to buy its token and initialize it based upon its usage of the protocol prior to the NFT
     *      system having been created. We are passing through the USDC token specifically, because it was drawn down
     *      by 300,000 early in the system's maturity to run a full cycle of the system and do a small allocation to
     *      the bootstrapped asset pool.
     */
    function buyDmmFoundationToken(
        uint tokenId,
        address usdcToken
    ) external returns (bool);

    function isDmmFoundationSetup() external view returns (bool);

}

// File: contracts/governance/governors/GovernorBeta.sol

/*
 * Copyright 2020 DMM Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


pragma solidity ^0.5.13;




contract GovernorBeta is GovernorAlpha {

    using SafeBitMath for uint128;

    event LocalOperatorSet(address indexed voter, address indexed operator, bool isTrusted);
    event GlobalOperatorSet(address indexed operator, bool isTrusted);

    modifier onlyTrustedOperator(address voter) {
        require(
            msg.sender == voter ||
            _globalOperatorToIsSupportedMap[msg.sender] ||
            _voterToLocalOperatorToIsSupportedMap[voter][msg.sender],
            "GovernorBeta: UNAUTHORIZED_OPERATOR"
        );

        _;
    }

    IAssetIntroducerV1 public assetIntroducerProxy;
    mapping(address => mapping(address => bool)) internal _voterToLocalOperatorToIsSupportedMap;
    mapping(address => bool) internal _globalOperatorToIsSupportedMap;

    constructor(
        address __assetIntroducerProxy,
        address __dmg,
        address __guardian
    ) public GovernorAlpha(__dmg, __guardian) {
        assetIntroducerProxy = IAssetIntroducerV1(__assetIntroducerProxy);
    }

    // *************************
    // ***** Admin Functions
    // *************************

    function setGlobalOperator(
        address __operator,
        bool __isTrusted
    ) public {
        require(
            address(timelock) == msg.sender,
            "GovernorBeta::setGlobalOperator: UNAUTHORIZED"
        );

        _globalOperatorToIsSupportedMap[__operator] = __isTrusted;
        emit GlobalOperatorSet(__operator, __isTrusted);
    }

    function __acceptAdmin() public {
        require(
            msg.sender == address(timelock),
            "GovernorBeta::__acceptAdmin: sender must be timelock"
        );

        timelock.acceptAdmin();
    }

    function __queueSetTimelockPendingAdmin(
        address,
        uint
    ) public {
        // The equivalent of this function should be called via governance proposal execution
        revert("GovernorBeta::__queueSetTimelockPendingAdmin: NOT_USED");
    }

    function __executeSetTimelockPendingAdmin(
        address,
        uint
    ) public {
        // The equivalent of this function should be called via governance proposal execution
        revert("GovernorBeta::__executeSetTimelockPendingAdmin: NOT_USED");
    }

    // *************************
    // ***** User Functions
    // *************************

    function setLocalOperator(
        address __operator,
        bool __isTrusted
    ) public {
        _voterToLocalOperatorToIsSupportedMap[msg.sender][__operator] = __isTrusted;
        emit LocalOperatorSet(msg.sender, __operator, __isTrusted);
    }

    /**
     * Can be called by a global operator or local operator on behalf of `voter` to cast votes on `voter`'s behalf.
     *
     * This function is mainly used to wrap around voting functionality with a proxy contract to perform additional
     * logic before or after voting.
     *
     * @return The amount of votes the user casted in favor of or against the proposal.
     */
    function castVote(
        address __voter,
        uint __proposalId,
        bool __support
    )
    onlyTrustedOperator(__voter)
    public returns (uint128) {
        return _castVote(__voter, __proposalId, __support);
    }

    // *************************
    // ***** Misc Functions
    // *************************

    function getIsLocalOperator(
        address __voter,
        address __operator
    ) public view returns (bool) {
        return _voterToLocalOperatorToIsSupportedMap[__voter][__operator];
    }

    function getIsGlobalOperator(
        address __operator
    ) public view returns (bool) {
        return _globalOperatorToIsSupportedMap[__operator];
    }

    // *************************
    // ***** Internal Functions
    // *************************

    function _getVotes(
        address __user,
        uint __blockNumber
    ) internal view returns (uint128) {
        return SafeBitMath.add128(
            super._getVotes(__user, __blockNumber),
            assetIntroducerProxy.getPriorVotes(__user, __blockNumber)
        );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"__assetIntroducerProxy","type":"address"},{"internalType":"address","name":"__dmg","type":"address"},{"internalType":"address","name":"__guardian","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isTrusted","type":"bool"}],"name":"GlobalOperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isTrusted","type":"bool"}],"name":"LocalOperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"}],"name":"VoteCast","type":"event"},{"constant":true,"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"__abdicate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"__acceptAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"__executeSetTimelockPendingAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"__queueSetTimelockPendingAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"assetIntroducerProxy","outputs":[{"internalType":"contract IAssetIntroducerV1","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__voter","type":"address"},{"internalType":"uint256","name":"__proposalId","type":"uint256"},{"internalType":"bool","name":"__support","type":"bool"}],"name":"castVote","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteBySig","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dmg","outputs":[{"internalType":"contract IDMGToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"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[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"__operator","type":"address"}],"name":"getIsGlobalOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"__voter","type":"address"},{"internalType":"address","name":"__operator","type":"address"}],"name":"getIsLocalOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"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":"uint128","name":"votes","type":"uint128"}],"internalType":"struct GovernorAlphaData.Receipt","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"timelock_","type":"address"}],"name":"initializeTimelock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalMaxOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","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"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"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":"title","type":"string"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"quorumVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__operator","type":"address"},{"internalType":"bool","name":"__isTrusted","type":"bool"}],"name":"setGlobalOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"__operator","type":"address"},{"internalType":"bool","name":"__isTrusted","type":"bool"}],"name":"setLocalOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"proposalThreshold_","type":"uint256"}],"name":"setProposalThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"quorumVotes_","type":"uint256"}],"name":"setQuorumVotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"votingPeriod_","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum GovernorAlphaData.ProposalState","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"timelock","outputs":[{"internalType":"contract ITimelockInterface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162003ff238038062003ff28339810160408190526200003491620000af565b600180546001600160a01b039384166001600160a01b03199182161790915560028054928416928216929092179091556969e10de76676d080000060045569152d02c7e14af6800000600555614380600655600980549390921692169190911790556200012f565b8051620000a98162000115565b92915050565b600080600060608486031215620000c557600080fd5b6000620000d386866200009c565b9350506020620000e6868287016200009c565b9250506040620000f9868287016200009c565b9150509250925092565b60006001600160a01b038216620000a9565b620001208162000103565b81146200012c57600080fd5b50565b613eb3806200013f6000396000f3fe60806040526004361061021a5760003560e01c806340e58ee511610123578063b58131b0116100ab578063deaaa7cc1161006f578063deaaa7cc14610610578063e23a9a5214610625578063ea0217cf14610652578063ece40cc114610672578063fe0d94c1146106925761021a565b8063b58131b01461059c578063b9a61961146105b1578063d33219b4146105c6578063da35c664146105db578063ddf0b009146105f05761021a565b8063490145c8116100f2578063490145c814610512578063760fbc13146105325780637bdbe4d014610547578063915006711461055c578063b4959e721461057c5761021a565b806340e58ee514610490578063452a9320146104b05780634634c61f146104d257806346d256c5146104f25761021a565b806317977c61116101a65780632aab8c89116101755780632aab8c89146103e9578063328dd982146103fe5780633932abb11461042e5780633a031bf0146104435780633e4f49e6146104635761021a565b806317977c611461037f57806320606b701461039f57806321f43e42146103b457806324bc1a64146103d45761021a565b8063052f72d7116101ed578063052f72d7146102c357806306fdde03146102f057806311c670281461031257806312d320c51461033257806315373e3d1461035f5761021a565b8063013cf08b1461021f57806302a251a31461025d57806302ec8f9e1461027f57806304c02c0e146102a1575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612895565b6106a5565b60405161025499989796959493929190613c77565b60405180910390f35b34801561026957600080fd5b50610272610701565b6040516102549190613900565b34801561028b57600080fd5b5061029f61029a366004612895565b610707565b005b3480156102ad57600080fd5b506102b661073f565b60405161025491906139a0565b3480156102cf57600080fd5b506102e36102de3660046125e3565b61074e565b60405161025491906138f2565b3480156102fc57600080fd5b50610305610770565b60405161025491906139bc565b34801561031e57600080fd5b5061029f61032d3660046125e3565b61079e565b34801561033e57600080fd5b5061035261034d3660046126a3565b610813565b6040516102549190613bab565b34801561036b57600080fd5b5061035261037a3660046128d2565b61089a565b34801561038b57600080fd5b5061027261039a3660046125e3565b6108b0565b3480156103ab57600080fd5b506102726108c2565b3480156103c057600080fd5b5061029f6103cf366004612673565b6108d9565b3480156103e057600080fd5b506102726108f1565b3480156103f557600080fd5b506102b66108f7565b34801561040a57600080fd5b5061041e610419366004612895565b610906565b60405161025494939291906138a5565b34801561043a57600080fd5b50610272610b95565b34801561044f57600080fd5b506102e361045e366004612609565b610b9b565b34801561046f57600080fd5b5061048361047e366004612895565b610bc9565b60405161025491906139ae565b34801561049c57600080fd5b5061029f6104ab366004612895565b610d45565b3480156104bc57600080fd5b506104c5610f3b565b60405161025491906137b6565b3480156104de57600080fd5b506103526104ed3660046128f1565b610f4a565b3480156104fe57600080fd5b5061029f61050d366004612643565b6110e0565b34801561051e57600080fd5b5061027261052d3660046126f0565b61116a565b34801561053e57600080fd5b5061029f611521565b34801561055357600080fd5b5061027261155d565b34801561056857600080fd5b5061029f610577366004612673565b611562565b34801561058857600080fd5b5061029f610597366004612643565b61157a565b3480156105a857600080fd5b506102726115e9565b3480156105bd57600080fd5b5061029f6115ef565b3480156105d257600080fd5b506102b6611674565b3480156105e757600080fd5b50610272611683565b3480156105fc57600080fd5b5061029f61060b366004612895565b611689565b34801561061c57600080fd5b506102726118f7565b34801561063157600080fd5b506106456106403660046128b3565b611903565b6040516102549190613b9d565b34801561065e57600080fd5b5061029f61066d366004612895565b61196f565b34801561067e57600080fd5b5061029f61068d366004612895565b6119c0565b61029f6106a0366004612895565b6119ef565b60076020819052600091825260409091208054600182015460028301549383015460088401546009850154600a860154600b9096015494966001600160a01b039094169593949293919290919060ff8082169161010090041689565b60065481565b6000546001600160a01b0316331461073a5760405162461bcd60e51b815260040161073190613b7d565b60405180910390fd5b600455565b6009546001600160a01b031681565b6001600160a01b0381166000908152600b602052604090205460ff165b919050565b60405180604001604052806012815260200171444d4d20476f7665726e6f7220416c70686160701b81525081565b6002546001600160a01b031633146107c85760405162461bcd60e51b8152600401610731906139ed565b6000546001600160a01b0316156107f15760405162461bcd60e51b815260040161073190613a1d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600083336001600160a01b038216148061083c5750336000908152600b602052604090205460ff165b8061086a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260040161073190613a3d565b610891858585611bb4565b95945050505050565b60006108a7338484611bb4565b90505b92915050565b60086020526000908152604090205481565b6040516108ce906137a0565b604051809103902081565b60405162461bcd60e51b815260040161073190613a6d565b60045481565b6001546001600160a01b031681565b6060806060806000600760008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561098857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161096a575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156109da57602002820191906000526020600020905b8154815260200190600101908083116109c6575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610aad5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b505050505081526020019060010190610a02565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610b7f5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b6b5780601f10610b4057610100808354040283529160200191610b6b565b820191906000526020600020905b815481529060010190602001808311610b4e57829003601f168201915b505050505081526020019060010190610ad4565b5050505090509450945094509450509193509193565b60015b90565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b60008160035410158015610bdd5750600082115b610bf95760405162461bcd60e51b815260040161073190613a0d565b6000828152600760205260409020600b81015460ff1615610c1e57600291505061076b565b80600701544311610c3357600091505061076b565b80600801544311610c4857600191505061076b565b80600a01548160090154111580610c6457506004548160090154105b15610c7357600391505061076b565b6002810154610c8657600491505061076b565b600b810154610100900460ff1615610ca257600791505061076b565b6002810154600054604080516360d143f160e11b81529051610d2b93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d269190810190612824565b611d11565b4210610d3b57600691505061076b565b600591505061076b565b6000610d5082610bc9565b90506007816007811115610d6057fe5b1415610d7e5760405162461bcd60e51b815260040161073190613b4d565b600082815260076020526040902060018101546001600160a01b0316331480610dd65750600554600180830154610dcb916001600160a01b0390911690610dc6904390611d36565b611d5e565b6001600160801b0316105b610df25760405162461bcd60e51b815260040161073190613abd565b600b8101805460ff1916600117905560005b6003820154811015610efe576000546003830180546001600160a01b039092169163591fcdfe919084908110610e3657fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610e5e57fe5b9060005260206000200154856005018581548110610e7857fe5b90600052602060002001866006018681548110610e9157fe5b9060005260206000200187600201546040518663ffffffff1660e01b8152600401610ec0959493929190613864565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b505060019092019150610e049050565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610f2e9190613900565b60405180910390a1505050565b6002546001600160a01b031681565b600080604051610f59906137a0565b604080519182900382208282019091526012825271444d4d20476f7665726e6f7220416c70686160701b6020909201919091527f782228f4a48d65779a8fbcebcc728b9876a1f0bf928fad4390fd1367e2906573610fb5611df4565b30604051602001610fc9949392919061390e565b6040516020818303038152906040528051906020012090506000604051610fef906137ab565b604051908190038120611008918a908a90602001613943565b6040516020818303038152906040528051906020012090506000828260405160200161103592919061376f565b604051602081830303815290604052805190602001209050600060018289898960405160008152602001604052604051611072949392919061396b565b6020604051602081039080840390855afa158015611094573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110c75760405162461bcd60e51b815260040161073190613b1d565b6110d2818b8b611bb4565b9a9950505050505050505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260040161073190613aad565b6001600160a01b0382166000818152600b602052604090819020805460ff1916841515179055517fa6efca93f94be6d527ba1bea9555e6d7976b93ea663120fdecc8510a4c8781759061115e9084906138f2565b60405180910390a25050565b6002546000906001600160a01b031633148061119e575060055461119333610dc6436001611d36565b6001600160801b0316115b6111ba5760405162461bcd60e51b815260040161073190613b0d565b855187511480156111cc575084518751145b80156111d9575083518751145b6111f55760405162461bcd60e51b815260040161073190613a9d565b86516112135760405162461bcd60e51b815260040161073190613afd565b61121b61155d565b8751111561123b5760405162461bcd60e51b815260040161073190613a8d565b3360009081526008602052604090205480156112b857600061125c82610bc9565b9050600181600781111561126c57fe5b141561128a5760405162461bcd60e51b815260040161073190613b3d565b600081600781111561129857fe5b14156112b65760405162461bcd60e51b815260040161073190613a4d565b505b60006112c643610d26610b95565b905060006112d682600654611d11565b60038054600101905590506112e961202d565b604051806101a001604052806003548152602001336001600160a01b03168152602001600081526020018c81526020018b81526020018a815260200189815260200184815260200183815260200160008152602001600081526020016000151581526020016000151581525090508060076000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030190805190602001906113cc9291906120a2565b50608082015180516113e8916004840191602090910190612107565b5060a0820151805161140491600584019160209091019061214e565b5060c082015180516114209160068401916020909101906121a7565b5060e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff02191690831515021790555090505080600001516008600083602001516001600160a01b03166001600160a01b03168152602001908152602001600020819055507fb88787ccad609a4d41058c8a0928927dd2516296c139d218d1e9131c2c219bd38160000151338d8d8d8d89898f8f6040516115089a99989796959493929190613bb9565b60405180910390a15193505050505b9695505050505050565b6002546001600160a01b0316331461154b5760405162461bcd60e51b815260040161073190613b8d565b600280546001600160a01b0319169055565b600a90565b60405162461bcd60e51b815260040161073190613a5d565b336000818152600a602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907fb77b2072ad835753fcf96849f2997d0762c972493aca380defd7f5b450b59040906115dd9085906138f2565b60405180910390a35050565b60055481565b6000546001600160a01b031633146116195760405162461bcd60e51b815260040161073190613b5d565b6000805460408051630e18b68160e01b815290516001600160a01b0390921692630e18b6819260048084019382900301818387803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b50505050565b6000546001600160a01b031681565b60035481565b600461169482610bc9565b600781111561169f57fe5b146116bc5760405162461bcd60e51b8152600401610731906139cd565b600081815260076020908152604080832083548251630d48571f60e31b815292519194936117159342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b158015610cee57600080fd5b905060005b60038301548110156118bd576118b583600301828154811061173857fe5b6000918252602090912001546004850180546001600160a01b03909216918490811061176057fe5b906000526020600020015485600501848154811061177a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b505050505086600601858154811061181c57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505086611df8565b60010161171a565b50600282018190556040517f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289290610f2e9085908490613cef565b6040516108ce906137ab565b61190b612200565b5060009182526007602090815260408084206001600160a01b03939093168452600c9092018152918190208151606081018352905460ff80821615158352610100820416151593820193909352620100009092046001600160801b03169082015290565b6000546001600160a01b031633146119995760405162461bcd60e51b815260040161073190613a7d565b6116808110156119bb5760405162461bcd60e51b815260040161073190613acd565b600655565b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610731906139fd565b600555565b60056119fa82610bc9565b6007811115611a0557fe5b14611a225760405162461bcd60e51b8152600401610731906139dd565b6000818152600760205260408120600b8101805461ff001916610100179055905b6003820154811015611b78576000546004830180546001600160a01b0390921691630825f38f919084908110611a7557fe5b9060005260206000200154846003018481548110611a8f57fe5b6000918252602090912001546004860180546001600160a01b039092169186908110611ab757fe5b9060005260206000200154866005018681548110611ad157fe5b90600052602060002001876006018781548110611aea57fe5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611b19959493929190613864565b6000604051808303818588803b158015611b3257600080fd5b505af1158015611b46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611b6f9190810190612842565b50600101611a43565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611ba89190613900565b60405180910390a15050565b60006001611bc184610bc9565b6007811115611bcc57fe5b14611be95760405162461bcd60e51b815260040161073190613b6d565b60008381526007602090815260408083206001600160a01b0388168452600c8101909252909120805460ff1615611c325760405162461bcd60e51b815260040161073190613a2d565b6000611c42878460070154611d5e565b90508415611c6b57611c618360090154826001600160801b0316611d11565b6009840155611c88565b611c8283600a0154826001600160801b0316611d11565b600a8401555b8154600160ff199091161761ff001916610100861515021771ffffffffffffffffffffffffffffffff00001916620100006001600160801b038316021782556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4690611cfd9089908990899086906137df565b60405180910390a1925050505b9392505050565b6000828201838110156108a75760405162461bcd60e51b815260040161073190613aed565b600082821115611d585760405162461bcd60e51b815260040161073190613b2d565b50900390565b60006108a7611d6d8484611f57565b60095460405163782d6fe160e01b81526001600160a01b039091169063782d6fe190611d9f90889088906004016137c4565b60206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611def9190810190612877565b611fda565b4690565b6000546040516001600160a01b039091169063f2b0653790611e269088908890889088908890602001613814565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e589190613900565b60206040518083038186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea89190810190612806565b15611ec55760405162461bcd60e51b815260040161073190613add565b600054604051633a66f90160e01b81526001600160a01b0390911690633a66f90190611efd9088908890889088908890600401613814565b602060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f4f9190810190612824565b505050505050565b60015460405163782d6fe160e01b81526000916001600160a01b03169063782d6fe190611f8a90869086906004016137c4565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a79190810190612877565b60006108a78383604051806020016040528060008152506000838301826001600160801b0380871690831610156120245760405162461bcd60e51b815260040161073191906139bc565b50949350505050565b604051806101a001604052806000815260200160006001600160a01b031681526020016000815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156120f7579160200282015b828111156120f757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120c2565b50612103929150612220565b5090565b828054828255906000526020600020908101928215612142579160200282015b82811115612142578251825591602001919060010190612127565b50612103929150612244565b82805482825590600052602060002090810192821561219b579160200282015b8281111561219b578251805161218b91849160209091019061225e565b509160200191906001019061216e565b506121039291506122cb565b8280548282559060005260206000209081019282156121f4579160200282015b828111156121f457825180516121e491849160209091019061225e565b50916020019190600101906121c7565b506121039291506122ee565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b808211156121035780546001600160a01b0319168155600101612226565b610b9891905b80821115612103576000815560010161224a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229f57805160ff1916838001178555612142565b828001600101855582156121425791820182811115612142578251825591602001919060010190612127565b610b9891905b808211156121035760006122e58282612311565b506001016122d1565b610b9891905b808211156121035760006123088282612311565b506001016122f4565b50805460018160011615610100020316600290046000825580601f106123375750612355565b601f0160209004906000526020600020908101906123559190612244565b50565b80356108aa81613e38565b600082601f83011261237457600080fd5b813561238761238282613d24565b613cfd565b915081818352602084019350602081019050838560208402820111156123ac57600080fd5b60005b838110156123d857816123c28882612358565b84525060209283019291909101906001016123af565b5050505092915050565b600082601f8301126123f357600080fd5b813561240161238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124298882612538565b8452506020928301929190910190600101612413565b600082601f83011261245057600080fd5b813561245e61238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124868882612538565b8452506020928301929190910190600101612470565b600082601f8301126124ad57600080fd5b81356124bb61238282613d24565b915081818352602084019350602081019050838560208402820111156124e057600080fd5b60005b838110156123d857816124f68882612522565b84525060209283019291909101906001016124e3565b80356108aa81613e4c565b80516108aa81613e4c565b80356108aa81613e55565b80516108aa81613e55565b600082601f83011261254957600080fd5b813561255761238282613d45565b9150808252602083016020830185838301111561257357600080fd5b61257e838284613dec565b50505092915050565b600082601f83011261259857600080fd5b81516125a661238282613d45565b915080825260208301602083018583830111156125c257600080fd5b61257e838284613df8565b80516108aa81613e5e565b80356108aa81613e67565b6000602082840312156125f557600080fd5b60006126018484612358565b949350505050565b6000806040838503121561261c57600080fd5b60006126288585612358565b925050602061263985828601612358565b9150509250929050565b6000806040838503121561265657600080fd5b60006126628585612358565b92505060206126398582860161250c565b6000806040838503121561268657600080fd5b60006126928585612358565b925050602061263985828601612522565b6000806000606084860312156126b857600080fd5b60006126c48686612358565b93505060206126d586828701612522565b92505060406126e68682870161250c565b9150509250925092565b60008060008060008060c0878903121561270957600080fd5b863567ffffffffffffffff81111561272057600080fd5b61272c89828a01612363565b965050602087013567ffffffffffffffff81111561274957600080fd5b61275589828a0161249c565b955050604087013567ffffffffffffffff81111561277257600080fd5b61277e89828a0161243f565b945050606087013567ffffffffffffffff81111561279b57600080fd5b6127a789828a016123e2565b935050608087013567ffffffffffffffff8111156127c457600080fd5b6127d089828a01612538565b92505060a087013567ffffffffffffffff8111156127ed57600080fd5b6127f989828a01612538565b9150509295509295509295565b60006020828403121561281857600080fd5b60006126018484612517565b60006020828403121561283657600080fd5b6000612601848461252d565b60006020828403121561285457600080fd5b815167ffffffffffffffff81111561286b57600080fd5b61260184828501612587565b60006020828403121561288957600080fd5b600061260184846125cd565b6000602082840312156128a757600080fd5b60006126018484612522565b600080604083850312156128c657600080fd5b60006126288585612522565b600080604083850312156128e557600080fd5b60006126628585612522565b600080600080600060a0868803121561290957600080fd5b60006129158888612522565b95505060206129268882890161250c565b9450506040612937888289016125d8565b935050606061294888828901612522565b925050608061295988828901612522565b9150509295509295909350565b600061297283836129a1565b505060200190565b60006108a78383612b43565b60006129728383612b29565b61299b81613dc4565b82525050565b61299b81613d8c565b60006129b582613d7f565b6129bf8185613d83565b93506129ca83613d6d565b8060005b838110156129f85781516129e28882612966565b97506129ed83613d6d565b9250506001016129ce565b509495945050505050565b6000612a0e82613d7f565b612a188185613d83565b935083602082028501612a2a85613d6d565b8060005b85811015612a645784840389528151612a47858261297a565b9450612a5283613d6d565b60209a909a0199925050600101612a2e565b5091979650505050505050565b6000612a7c82613d7f565b612a868185613d83565b935083602082028501612a9885613d6d565b8060005b85811015612a645784840389528151612ab5858261297a565b9450612ac083613d6d565b60209a909a0199925050600101612a9c565b6000612add82613d7f565b612ae78185613d83565b9350612af283613d6d565b8060005b838110156129f8578151612b0a8882612986565b9750612b1583613d6d565b925050600101612af6565b61299b81613d97565b61299b81610b98565b61299b612b3e82610b98565b610b98565b6000612b4e82613d7f565b612b588185613d83565b9350612b68818560208601613df8565b612b7181613e24565b9093019392505050565b600081546001811660008114612b985760018114612bbe57612bfd565b607f6002830416612ba98187613d83565b60ff1984168152955050602085019250612bfd565b60028204612bcc8187613d83565b9550612bd785613d73565b60005b82811015612bf657815488820152600190910190602001612bda565b8701945050505b505092915050565b61299b81613dcb565b61299b81613dd6565b6000612c24604483613d83565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206381527f616e206f6e6c79206265207175657565642069662069742069732073756363656020820152631959195960e21b604082015260600192915050565b6000612c90604583613d83565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c81527f2063616e206f6e6c7920626520657865637574656420696620697420697320716020820152641d595d595960da1b604082015260600192915050565b6000612cfd603383613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2043616c6c81527232b91036bab9ba1031329033bab0b93234b0b760691b602082015260400192915050565b6000612d52603383613d83565b7f476f7665726e6f72416c7068613a3a73657450726f706f73616c54687265736881527237b6321d1034b73b30b634b21039b2b73232b960691b602082015260400192915050565b6000612da760028361076b565b61190160f01b815260020192915050565b6000612dc5602983613d83565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c69642070728152681bdc1bdcd85b081a5960ba1b602082015260400192915050565b6000612e10604083613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2074696d6581527f6c6f636b206d757374206e6f7420626520696e697469616c697a656420796574602082015260400192915050565b6000612e6f602d83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722081526c185b1c9958591e481d9bdd1959609a1b602082015260400192915050565b6000612ebe602383613d83565b7f476f7665726e6f72426574613a20554e415554484f52495a45445f4f504552418152622a27a960e91b602082015260400192915050565b6000612f03605983613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015260600192915050565b6000612f88603683613d83565b7f476f7665726e6f72426574613a3a5f5f717565756553657454696d656c6f636b81527514195b991a5b99d0591b5a5b8e881393d517d554d15160521b602082015260400192915050565b6000612fe0603883613d83565b7f476f7665726e6f72426574613a3a5f5f6578656375746553657454696d656c6f81527f636b50656e64696e6741646d696e3a204e4f545f555345440000000000000000602082015260400192915050565b600061303f602e83613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081526d34b73b30b634b21039b2b73232b960911b602082015260400192915050565b600061308f602883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7981526720616374696f6e7360c01b602082015260400192915050565b60006130d960438361076b565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061314460278361076b565b7f42616c6c6f742875696e743235362070726f706f73616c49642c626f6f6c20738152667570706f72742960c81b602082015260270192915050565b600061318d604483613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c81527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6020820152630c2e8c6d60e31b604082015260600192915050565b60006131f9602d83613d83565b7f476f7665726e6f72426574613a3a736574476c6f62616c4f70657261746f723a81526c0815539055551213d492569151609a1b602082015260400192915050565b6000613248602f83613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722081526e18589bdd99481d1a1c995cda1bdb19608a1b602082015260400192915050565b6000613299604583613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081527f6e657720766f74696e6720706572696f64206d75737420657863656564206d696020820152646e696d756d60d81b604082015260600192915050565b6000613306604483613d83565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207081527f726f706f73616c20616374696f6e20616c7265616479207175657565642061746020820152632065746160e01b604082015260600192915050565b6000613372602883613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a204144444954494f4e5f8152674f564552464c4f5760c01b602082015260400192915050565b60006133bc602c83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f81526b7669646520616374696f6e7360a01b602082015260400192915050565b600061340a603f83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657281527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015260400192915050565b6000613469602f83613d83565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e81526e76616c6964207369676e617475726560881b602082015260400192915050565b60006134ba602c83613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a2053554254524143544981526b4f4e5f554e444552464c4f5760a01b602082015260400192915050565b6000613508605883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015260600192915050565b600061358d603683613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f742063618152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b602082015260400192915050565b60006135e5603483613d83565b7f476f7665726e6f72426574613a3a5f5f61636365707441646d696e3a2073656e815273646572206d7573742062652074696d656c6f636b60601b602082015260400192915050565b600061363b602a83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e67815269081a5cc818db1bdcd95960b21b602082015260400192915050565b6000613687602d83613d83565b7f476f7665726e6f72416c7068613a3a73657451756f72756d566f7465733a206981526c373b30b634b21039b2b73232b960991b602082015260400192915050565b60006136d6603683613d83565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e6465815275391036bab9ba1031329033b7bb1033bab0b93234b0b760511b602082015260400192915050565b805160608301906137328482612b20565b5060208201516137456020850182612b20565b50604082015161166e60408501825b61299b81613da6565b61299b81613de1565b61299b81613dbe565b600061377a82612d9a565b91506137868285612b32565b6020820191506137968284612b32565b5060200192915050565b60006108aa826130cc565b60006108aa82613137565b602081016108aa82846129a1565b604081016137d282856129a1565b611d0a6020830184612b29565b608081016137ed82876129a1565b6137fa6020830186612b29565b6138076040830185612b20565b610891606083018461375d565b60a0810161382282886129a1565b61382f6020830187612b29565b81810360408301526138418186612b43565b905081810360608301526138558185612b43565b90506115176080830184612b29565b60a0810161387282886129a1565b61387f6020830187612b29565b81810360408301526138918186612b7b565b905081810360608301526138558185612b7b565b608080825281016138b681876129aa565b905081810360208301526138ca8186612ad2565b905081810360408301526138de8185612a71565b905081810360608301526115178184612a03565b602081016108aa8284612b20565b602081016108aa8284612b29565b6080810161391c8287612b29565b6139296020830186612b29565b6139366040830185612b29565b61089160608301846129a1565b606081016139518286612b29565b61395e6020830185612b29565b6126016040830184612b20565b608081016139798287612b29565b6139866020830186613766565b6139936040830185612b29565b6108916060830184612b29565b602081016108aa8284612c05565b602081016108aa8284612c0e565b602080825281016108a78184612b43565b602080825281016108aa81612c17565b602080825281016108aa81612c83565b602080825281016108aa81612cf0565b602080825281016108aa81612d45565b602080825281016108aa81612db8565b602080825281016108aa81612e03565b602080825281016108aa81612e62565b602080825281016108aa81612eb1565b602080825281016108aa81612ef6565b602080825281016108aa81612f7b565b602080825281016108aa81612fd3565b602080825281016108aa81613032565b602080825281016108aa81613082565b602080825281016108aa81613180565b602080825281016108aa816131ec565b602080825281016108aa8161323b565b602080825281016108aa8161328c565b602080825281016108aa816132f9565b602080825281016108aa81613365565b602080825281016108aa816133af565b602080825281016108aa816133fd565b602080825281016108aa8161345c565b602080825281016108aa816134ad565b602080825281016108aa816134fb565b602080825281016108aa81613580565b602080825281016108aa816135d8565b602080825281016108aa8161362e565b602080825281016108aa8161367a565b602080825281016108aa816136c9565b606081016108aa8284613721565b602081016108aa8284613754565b6101408101613bc8828d612b29565b613bd5602083018c612992565b8181036040830152613be7818b6129aa565b90508181036060830152613bfb818a612ad2565b90508181036080830152613c0f8189612a71565b905081810360a0830152613c238188612a03565b9050613c3260c0830187612b29565b613c3f60e0830186612b29565b818103610100830152613c528185612b43565b9050818103610120830152613c678184612b43565b9c9b505050505050505050505050565b6101208101613c86828c612b29565b613c93602083018b6129a1565b613ca0604083018a612b29565b613cad6060830189612b29565b613cba6080830188612b29565b613cc760a0830187612b29565b613cd460c0830186612b29565b613ce160e0830185612b20565b6110d2610100830184612b20565b604081016137d28285612b29565b60405181810167ffffffffffffffff81118282101715613d1c57600080fd5b604052919050565b600067ffffffffffffffff821115613d3b57600080fd5b5060209081020190565b600067ffffffffffffffff821115613d5c57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b60006108aa82613db2565b151590565b8061076b81613e2e565b6001600160801b031690565b6001600160a01b031690565b60ff1690565b60006108aa825b60006108aa82613d8c565b60006108aa82613d9c565b60006108aa82613da6565b82818337506000910152565b60005b83811015613e13578181015183820152602001613dfb565b8381111561166e5750506000910152565b601f01601f191690565b6008811061235557fe5b613e4181613d8c565b811461235557600080fd5b613e4181613d97565b613e4181610b98565b613e4181613da6565b613e4181613dbe56fea365627a7a723158202aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a6c6578706572696d656e74616cf564736f6c634300050d004000000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806340e58ee511610123578063b58131b0116100ab578063deaaa7cc1161006f578063deaaa7cc14610610578063e23a9a5214610625578063ea0217cf14610652578063ece40cc114610672578063fe0d94c1146106925761021a565b8063b58131b01461059c578063b9a61961146105b1578063d33219b4146105c6578063da35c664146105db578063ddf0b009146105f05761021a565b8063490145c8116100f2578063490145c814610512578063760fbc13146105325780637bdbe4d014610547578063915006711461055c578063b4959e721461057c5761021a565b806340e58ee514610490578063452a9320146104b05780634634c61f146104d257806346d256c5146104f25761021a565b806317977c61116101a65780632aab8c89116101755780632aab8c89146103e9578063328dd982146103fe5780633932abb11461042e5780633a031bf0146104435780633e4f49e6146104635761021a565b806317977c611461037f57806320606b701461039f57806321f43e42146103b457806324bc1a64146103d45761021a565b8063052f72d7116101ed578063052f72d7146102c357806306fdde03146102f057806311c670281461031257806312d320c51461033257806315373e3d1461035f5761021a565b8063013cf08b1461021f57806302a251a31461025d57806302ec8f9e1461027f57806304c02c0e146102a1575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612895565b6106a5565b60405161025499989796959493929190613c77565b60405180910390f35b34801561026957600080fd5b50610272610701565b6040516102549190613900565b34801561028b57600080fd5b5061029f61029a366004612895565b610707565b005b3480156102ad57600080fd5b506102b661073f565b60405161025491906139a0565b3480156102cf57600080fd5b506102e36102de3660046125e3565b61074e565b60405161025491906138f2565b3480156102fc57600080fd5b50610305610770565b60405161025491906139bc565b34801561031e57600080fd5b5061029f61032d3660046125e3565b61079e565b34801561033e57600080fd5b5061035261034d3660046126a3565b610813565b6040516102549190613bab565b34801561036b57600080fd5b5061035261037a3660046128d2565b61089a565b34801561038b57600080fd5b5061027261039a3660046125e3565b6108b0565b3480156103ab57600080fd5b506102726108c2565b3480156103c057600080fd5b5061029f6103cf366004612673565b6108d9565b3480156103e057600080fd5b506102726108f1565b3480156103f557600080fd5b506102b66108f7565b34801561040a57600080fd5b5061041e610419366004612895565b610906565b60405161025494939291906138a5565b34801561043a57600080fd5b50610272610b95565b34801561044f57600080fd5b506102e361045e366004612609565b610b9b565b34801561046f57600080fd5b5061048361047e366004612895565b610bc9565b60405161025491906139ae565b34801561049c57600080fd5b5061029f6104ab366004612895565b610d45565b3480156104bc57600080fd5b506104c5610f3b565b60405161025491906137b6565b3480156104de57600080fd5b506103526104ed3660046128f1565b610f4a565b3480156104fe57600080fd5b5061029f61050d366004612643565b6110e0565b34801561051e57600080fd5b5061027261052d3660046126f0565b61116a565b34801561053e57600080fd5b5061029f611521565b34801561055357600080fd5b5061027261155d565b34801561056857600080fd5b5061029f610577366004612673565b611562565b34801561058857600080fd5b5061029f610597366004612643565b61157a565b3480156105a857600080fd5b506102726115e9565b3480156105bd57600080fd5b5061029f6115ef565b3480156105d257600080fd5b506102b6611674565b3480156105e757600080fd5b50610272611683565b3480156105fc57600080fd5b5061029f61060b366004612895565b611689565b34801561061c57600080fd5b506102726118f7565b34801561063157600080fd5b506106456106403660046128b3565b611903565b6040516102549190613b9d565b34801561065e57600080fd5b5061029f61066d366004612895565b61196f565b34801561067e57600080fd5b5061029f61068d366004612895565b6119c0565b61029f6106a0366004612895565b6119ef565b60076020819052600091825260409091208054600182015460028301549383015460088401546009850154600a860154600b9096015494966001600160a01b039094169593949293919290919060ff8082169161010090041689565b60065481565b6000546001600160a01b0316331461073a5760405162461bcd60e51b815260040161073190613b7d565b60405180910390fd5b600455565b6009546001600160a01b031681565b6001600160a01b0381166000908152600b602052604090205460ff165b919050565b60405180604001604052806012815260200171444d4d20476f7665726e6f7220416c70686160701b81525081565b6002546001600160a01b031633146107c85760405162461bcd60e51b8152600401610731906139ed565b6000546001600160a01b0316156107f15760405162461bcd60e51b815260040161073190613a1d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600083336001600160a01b038216148061083c5750336000908152600b602052604090205460ff165b8061086a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6108865760405162461bcd60e51b815260040161073190613a3d565b610891858585611bb4565b95945050505050565b60006108a7338484611bb4565b90505b92915050565b60086020526000908152604090205481565b6040516108ce906137a0565b604051809103902081565b60405162461bcd60e51b815260040161073190613a6d565b60045481565b6001546001600160a01b031681565b6060806060806000600760008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561098857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161096a575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156109da57602002820191906000526020600020905b8154815260200190600101908083116109c6575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610aad5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b505050505081526020019060010190610a02565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610b7f5760008481526020908190208301805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b6b5780601f10610b4057610100808354040283529160200191610b6b565b820191906000526020600020905b815481529060010190602001808311610b4e57829003601f168201915b505050505081526020019060010190610ad4565b5050505090509450945094509450509193509193565b60015b90565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b60008160035410158015610bdd5750600082115b610bf95760405162461bcd60e51b815260040161073190613a0d565b6000828152600760205260409020600b81015460ff1615610c1e57600291505061076b565b80600701544311610c3357600091505061076b565b80600801544311610c4857600191505061076b565b80600a01548160090154111580610c6457506004548160090154105b15610c7357600391505061076b565b6002810154610c8657600491505061076b565b600b810154610100900460ff1615610ca257600791505061076b565b6002810154600054604080516360d143f160e11b81529051610d2b93926001600160a01b03169163c1a287e2916004808301926020929190829003018186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d269190810190612824565b611d11565b4210610d3b57600691505061076b565b600591505061076b565b6000610d5082610bc9565b90506007816007811115610d6057fe5b1415610d7e5760405162461bcd60e51b815260040161073190613b4d565b600082815260076020526040902060018101546001600160a01b0316331480610dd65750600554600180830154610dcb916001600160a01b0390911690610dc6904390611d36565b611d5e565b6001600160801b0316105b610df25760405162461bcd60e51b815260040161073190613abd565b600b8101805460ff1916600117905560005b6003820154811015610efe576000546003830180546001600160a01b039092169163591fcdfe919084908110610e3657fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610e5e57fe5b9060005260206000200154856005018581548110610e7857fe5b90600052602060002001866006018681548110610e9157fe5b9060005260206000200187600201546040518663ffffffff1660e01b8152600401610ec0959493929190613864565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b505060019092019150610e049050565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610f2e9190613900565b60405180910390a1505050565b6002546001600160a01b031681565b600080604051610f59906137a0565b604080519182900382208282019091526012825271444d4d20476f7665726e6f7220416c70686160701b6020909201919091527f782228f4a48d65779a8fbcebcc728b9876a1f0bf928fad4390fd1367e2906573610fb5611df4565b30604051602001610fc9949392919061390e565b6040516020818303038152906040528051906020012090506000604051610fef906137ab565b604051908190038120611008918a908a90602001613943565b6040516020818303038152906040528051906020012090506000828260405160200161103592919061376f565b604051602081830303815290604052805190602001209050600060018289898960405160008152602001604052604051611072949392919061396b565b6020604051602081039080840390855afa158015611094573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110c75760405162461bcd60e51b815260040161073190613b1d565b6110d2818b8b611bb4565b9a9950505050505050505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260040161073190613aad565b6001600160a01b0382166000818152600b602052604090819020805460ff1916841515179055517fa6efca93f94be6d527ba1bea9555e6d7976b93ea663120fdecc8510a4c8781759061115e9084906138f2565b60405180910390a25050565b6002546000906001600160a01b031633148061119e575060055461119333610dc6436001611d36565b6001600160801b0316115b6111ba5760405162461bcd60e51b815260040161073190613b0d565b855187511480156111cc575084518751145b80156111d9575083518751145b6111f55760405162461bcd60e51b815260040161073190613a9d565b86516112135760405162461bcd60e51b815260040161073190613afd565b61121b61155d565b8751111561123b5760405162461bcd60e51b815260040161073190613a8d565b3360009081526008602052604090205480156112b857600061125c82610bc9565b9050600181600781111561126c57fe5b141561128a5760405162461bcd60e51b815260040161073190613b3d565b600081600781111561129857fe5b14156112b65760405162461bcd60e51b815260040161073190613a4d565b505b60006112c643610d26610b95565b905060006112d682600654611d11565b60038054600101905590506112e961202d565b604051806101a001604052806003548152602001336001600160a01b03168152602001600081526020018c81526020018b81526020018a815260200189815260200184815260200183815260200160008152602001600081526020016000151581526020016000151581525090508060076000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030190805190602001906113cc9291906120a2565b50608082015180516113e8916004840191602090910190612107565b5060a0820151805161140491600584019160209091019061214e565b5060c082015180516114209160068401916020909101906121a7565b5060e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff02191690831515021790555090505080600001516008600083602001516001600160a01b03166001600160a01b03168152602001908152602001600020819055507fb88787ccad609a4d41058c8a0928927dd2516296c139d218d1e9131c2c219bd38160000151338d8d8d8d89898f8f6040516115089a99989796959493929190613bb9565b60405180910390a15193505050505b9695505050505050565b6002546001600160a01b0316331461154b5760405162461bcd60e51b815260040161073190613b8d565b600280546001600160a01b0319169055565b600a90565b60405162461bcd60e51b815260040161073190613a5d565b336000818152600a602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907fb77b2072ad835753fcf96849f2997d0762c972493aca380defd7f5b450b59040906115dd9085906138f2565b60405180910390a35050565b60055481565b6000546001600160a01b031633146116195760405162461bcd60e51b815260040161073190613b5d565b6000805460408051630e18b68160e01b815290516001600160a01b0390921692630e18b6819260048084019382900301818387803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b50505050565b6000546001600160a01b031681565b60035481565b600461169482610bc9565b600781111561169f57fe5b146116bc5760405162461bcd60e51b8152600401610731906139cd565b600081815260076020908152604080832083548251630d48571f60e31b815292519194936117159342936001600160a01b0390931692636a42b8f892600480840193919291829003018186803b158015610cee57600080fd5b905060005b60038301548110156118bd576118b583600301828154811061173857fe5b6000918252602090912001546004850180546001600160a01b03909216918490811061176057fe5b906000526020600020015485600501848154811061177a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118085780601f106117dd57610100808354040283529160200191611808565b820191906000526020600020905b8154815290600101906020018083116117eb57829003601f168201915b505050505086600601858154811061181c57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156118aa5780601f1061187f576101008083540402835291602001916118aa565b820191906000526020600020905b81548152906001019060200180831161188d57829003601f168201915b505050505086611df8565b60010161171a565b50600282018190556040517f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289290610f2e9085908490613cef565b6040516108ce906137ab565b61190b612200565b5060009182526007602090815260408084206001600160a01b03939093168452600c9092018152918190208151606081018352905460ff80821615158352610100820416151593820193909352620100009092046001600160801b03169082015290565b6000546001600160a01b031633146119995760405162461bcd60e51b815260040161073190613a7d565b6116808110156119bb5760405162461bcd60e51b815260040161073190613acd565b600655565b6000546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610731906139fd565b600555565b60056119fa82610bc9565b6007811115611a0557fe5b14611a225760405162461bcd60e51b8152600401610731906139dd565b6000818152600760205260408120600b8101805461ff001916610100179055905b6003820154811015611b78576000546004830180546001600160a01b0390921691630825f38f919084908110611a7557fe5b9060005260206000200154846003018481548110611a8f57fe5b6000918252602090912001546004860180546001600160a01b039092169186908110611ab757fe5b9060005260206000200154866005018681548110611ad157fe5b90600052602060002001876006018781548110611aea57fe5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611b19959493929190613864565b6000604051808303818588803b158015611b3257600080fd5b505af1158015611b46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611b6f9190810190612842565b50600101611a43565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611ba89190613900565b60405180910390a15050565b60006001611bc184610bc9565b6007811115611bcc57fe5b14611be95760405162461bcd60e51b815260040161073190613b6d565b60008381526007602090815260408083206001600160a01b0388168452600c8101909252909120805460ff1615611c325760405162461bcd60e51b815260040161073190613a2d565b6000611c42878460070154611d5e565b90508415611c6b57611c618360090154826001600160801b0316611d11565b6009840155611c88565b611c8283600a0154826001600160801b0316611d11565b600a8401555b8154600160ff199091161761ff001916610100861515021771ffffffffffffffffffffffffffffffff00001916620100006001600160801b038316021782556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4690611cfd9089908990899086906137df565b60405180910390a1925050505b9392505050565b6000828201838110156108a75760405162461bcd60e51b815260040161073190613aed565b600082821115611d585760405162461bcd60e51b815260040161073190613b2d565b50900390565b60006108a7611d6d8484611f57565b60095460405163782d6fe160e01b81526001600160a01b039091169063782d6fe190611d9f90889088906004016137c4565b60206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611def9190810190612877565b611fda565b4690565b6000546040516001600160a01b039091169063f2b0653790611e269088908890889088908890602001613814565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e589190613900565b60206040518083038186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea89190810190612806565b15611ec55760405162461bcd60e51b815260040161073190613add565b600054604051633a66f90160e01b81526001600160a01b0390911690633a66f90190611efd9088908890889088908890600401613814565b602060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f4f9190810190612824565b505050505050565b60015460405163782d6fe160e01b81526000916001600160a01b03169063782d6fe190611f8a90869086906004016137c4565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a79190810190612877565b60006108a78383604051806020016040528060008152506000838301826001600160801b0380871690831610156120245760405162461bcd60e51b815260040161073191906139bc565b50949350505050565b604051806101a001604052806000815260200160006001600160a01b031681526020016000815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b8280548282559060005260206000209081019282156120f7579160200282015b828111156120f757825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120c2565b50612103929150612220565b5090565b828054828255906000526020600020908101928215612142579160200282015b82811115612142578251825591602001919060010190612127565b50612103929150612244565b82805482825590600052602060002090810192821561219b579160200282015b8281111561219b578251805161218b91849160209091019061225e565b509160200191906001019061216e565b506121039291506122cb565b8280548282559060005260206000209081019282156121f4579160200282015b828111156121f457825180516121e491849160209091019061225e565b50916020019190600101906121c7565b506121039291506122ee565b604080516060810182526000808252602082018190529181019190915290565b610b9891905b808211156121035780546001600160a01b0319168155600101612226565b610b9891905b80821115612103576000815560010161224a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061229f57805160ff1916838001178555612142565b828001600101855582156121425791820182811115612142578251825591602001919060010190612127565b610b9891905b808211156121035760006122e58282612311565b506001016122d1565b610b9891905b808211156121035760006123088282612311565b506001016122f4565b50805460018160011615610100020316600290046000825580601f106123375750612355565b601f0160209004906000526020600020908101906123559190612244565b50565b80356108aa81613e38565b600082601f83011261237457600080fd5b813561238761238282613d24565b613cfd565b915081818352602084019350602081019050838560208402820111156123ac57600080fd5b60005b838110156123d857816123c28882612358565b84525060209283019291909101906001016123af565b5050505092915050565b600082601f8301126123f357600080fd5b813561240161238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124298882612538565b8452506020928301929190910190600101612413565b600082601f83011261245057600080fd5b813561245e61238282613d24565b81815260209384019390925082018360005b838110156123d857813586016124868882612538565b8452506020928301929190910190600101612470565b600082601f8301126124ad57600080fd5b81356124bb61238282613d24565b915081818352602084019350602081019050838560208402820111156124e057600080fd5b60005b838110156123d857816124f68882612522565b84525060209283019291909101906001016124e3565b80356108aa81613e4c565b80516108aa81613e4c565b80356108aa81613e55565b80516108aa81613e55565b600082601f83011261254957600080fd5b813561255761238282613d45565b9150808252602083016020830185838301111561257357600080fd5b61257e838284613dec565b50505092915050565b600082601f83011261259857600080fd5b81516125a661238282613d45565b915080825260208301602083018583830111156125c257600080fd5b61257e838284613df8565b80516108aa81613e5e565b80356108aa81613e67565b6000602082840312156125f557600080fd5b60006126018484612358565b949350505050565b6000806040838503121561261c57600080fd5b60006126288585612358565b925050602061263985828601612358565b9150509250929050565b6000806040838503121561265657600080fd5b60006126628585612358565b92505060206126398582860161250c565b6000806040838503121561268657600080fd5b60006126928585612358565b925050602061263985828601612522565b6000806000606084860312156126b857600080fd5b60006126c48686612358565b93505060206126d586828701612522565b92505060406126e68682870161250c565b9150509250925092565b60008060008060008060c0878903121561270957600080fd5b863567ffffffffffffffff81111561272057600080fd5b61272c89828a01612363565b965050602087013567ffffffffffffffff81111561274957600080fd5b61275589828a0161249c565b955050604087013567ffffffffffffffff81111561277257600080fd5b61277e89828a0161243f565b945050606087013567ffffffffffffffff81111561279b57600080fd5b6127a789828a016123e2565b935050608087013567ffffffffffffffff8111156127c457600080fd5b6127d089828a01612538565b92505060a087013567ffffffffffffffff8111156127ed57600080fd5b6127f989828a01612538565b9150509295509295509295565b60006020828403121561281857600080fd5b60006126018484612517565b60006020828403121561283657600080fd5b6000612601848461252d565b60006020828403121561285457600080fd5b815167ffffffffffffffff81111561286b57600080fd5b61260184828501612587565b60006020828403121561288957600080fd5b600061260184846125cd565b6000602082840312156128a757600080fd5b60006126018484612522565b600080604083850312156128c657600080fd5b60006126288585612522565b600080604083850312156128e557600080fd5b60006126628585612522565b600080600080600060a0868803121561290957600080fd5b60006129158888612522565b95505060206129268882890161250c565b9450506040612937888289016125d8565b935050606061294888828901612522565b925050608061295988828901612522565b9150509295509295909350565b600061297283836129a1565b505060200190565b60006108a78383612b43565b60006129728383612b29565b61299b81613dc4565b82525050565b61299b81613d8c565b60006129b582613d7f565b6129bf8185613d83565b93506129ca83613d6d565b8060005b838110156129f85781516129e28882612966565b97506129ed83613d6d565b9250506001016129ce565b509495945050505050565b6000612a0e82613d7f565b612a188185613d83565b935083602082028501612a2a85613d6d565b8060005b85811015612a645784840389528151612a47858261297a565b9450612a5283613d6d565b60209a909a0199925050600101612a2e565b5091979650505050505050565b6000612a7c82613d7f565b612a868185613d83565b935083602082028501612a9885613d6d565b8060005b85811015612a645784840389528151612ab5858261297a565b9450612ac083613d6d565b60209a909a0199925050600101612a9c565b6000612add82613d7f565b612ae78185613d83565b9350612af283613d6d565b8060005b838110156129f8578151612b0a8882612986565b9750612b1583613d6d565b925050600101612af6565b61299b81613d97565b61299b81610b98565b61299b612b3e82610b98565b610b98565b6000612b4e82613d7f565b612b588185613d83565b9350612b68818560208601613df8565b612b7181613e24565b9093019392505050565b600081546001811660008114612b985760018114612bbe57612bfd565b607f6002830416612ba98187613d83565b60ff1984168152955050602085019250612bfd565b60028204612bcc8187613d83565b9550612bd785613d73565b60005b82811015612bf657815488820152600190910190602001612bda565b8701945050505b505092915050565b61299b81613dcb565b61299b81613dd6565b6000612c24604483613d83565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206381527f616e206f6e6c79206265207175657565642069662069742069732073756363656020820152631959195960e21b604082015260600192915050565b6000612c90604583613d83565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c81527f2063616e206f6e6c7920626520657865637574656420696620697420697320716020820152641d595d595960da1b604082015260600192915050565b6000612cfd603383613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2043616c6c81527232b91036bab9ba1031329033bab0b93234b0b760691b602082015260400192915050565b6000612d52603383613d83565b7f476f7665726e6f72416c7068613a3a73657450726f706f73616c54687265736881527237b6321d1034b73b30b634b21039b2b73232b960691b602082015260400192915050565b6000612da760028361076b565b61190160f01b815260020192915050565b6000612dc5602983613d83565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c69642070728152681bdc1bdcd85b081a5960ba1b602082015260400192915050565b6000612e10604083613d83565b7f476f7665726e6f72416c7068613a3a73657454696d656c6f636b3a2074696d6581527f6c6f636b206d757374206e6f7420626520696e697469616c697a656420796574602082015260400192915050565b6000612e6f602d83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722081526c185b1c9958591e481d9bdd1959609a1b602082015260400192915050565b6000612ebe602383613d83565b7f476f7665726e6f72426574613a20554e415554484f52495a45445f4f504552418152622a27a960e91b602082015260400192915050565b6000612f03605983613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015260600192915050565b6000612f88603683613d83565b7f476f7665726e6f72426574613a3a5f5f717565756553657454696d656c6f636b81527514195b991a5b99d0591b5a5b8e881393d517d554d15160521b602082015260400192915050565b6000612fe0603883613d83565b7f476f7665726e6f72426574613a3a5f5f6578656375746553657454696d656c6f81527f636b50656e64696e6741646d696e3a204e4f545f555345440000000000000000602082015260400192915050565b600061303f602e83613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081526d34b73b30b634b21039b2b73232b960911b602082015260400192915050565b600061308f602883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7981526720616374696f6e7360c01b602082015260400192915050565b60006130d960438361076b565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b600061314460278361076b565b7f42616c6c6f742875696e743235362070726f706f73616c49642c626f6f6c20738152667570706f72742960c81b602082015260270192915050565b600061318d604483613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c81527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6020820152630c2e8c6d60e31b604082015260600192915050565b60006131f9602d83613d83565b7f476f7665726e6f72426574613a3a736574476c6f62616c4f70657261746f723a81526c0815539055551213d492569151609a1b602082015260400192915050565b6000613248602f83613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722081526e18589bdd99481d1a1c995cda1bdb19608a1b602082015260400192915050565b6000613299604583613d83565b7f476f7665726e6f72416c7068613a3a736574566f74696e67506572696f643a2081527f6e657720766f74696e6720706572696f64206d75737420657863656564206d696020820152646e696d756d60d81b604082015260600192915050565b6000613306604483613d83565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207081527f726f706f73616c20616374696f6e20616c7265616479207175657565642061746020820152632065746160e01b604082015260600192915050565b6000613372602883613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a204144444954494f4e5f8152674f564552464c4f5760c01b602082015260400192915050565b60006133bc602c83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f81526b7669646520616374696f6e7360a01b602082015260400192915050565b600061340a603f83613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657281527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015260400192915050565b6000613469602f83613d83565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e81526e76616c6964207369676e617475726560881b602082015260400192915050565b60006134ba602c83613d83565b7f476f7665726e6f72416c7068613a3a6164643235363a2053554254524143544981526b4f4e5f554e444552464c4f5760a01b602082015260400192915050565b6000613508605883613d83565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766581527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015260600192915050565b600061358d603683613d83565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f742063618152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b602082015260400192915050565b60006135e5603483613d83565b7f476f7665726e6f72426574613a3a5f5f61636365707441646d696e3a2073656e815273646572206d7573742062652074696d656c6f636b60601b602082015260400192915050565b600061363b602a83613d83565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e67815269081a5cc818db1bdcd95960b21b602082015260400192915050565b6000613687602d83613d83565b7f476f7665726e6f72416c7068613a3a73657451756f72756d566f7465733a206981526c373b30b634b21039b2b73232b960991b602082015260400192915050565b60006136d6603683613d83565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e6465815275391036bab9ba1031329033b7bb1033bab0b93234b0b760511b602082015260400192915050565b805160608301906137328482612b20565b5060208201516137456020850182612b20565b50604082015161166e60408501825b61299b81613da6565b61299b81613de1565b61299b81613dbe565b600061377a82612d9a565b91506137868285612b32565b6020820191506137968284612b32565b5060200192915050565b60006108aa826130cc565b60006108aa82613137565b602081016108aa82846129a1565b604081016137d282856129a1565b611d0a6020830184612b29565b608081016137ed82876129a1565b6137fa6020830186612b29565b6138076040830185612b20565b610891606083018461375d565b60a0810161382282886129a1565b61382f6020830187612b29565b81810360408301526138418186612b43565b905081810360608301526138558185612b43565b90506115176080830184612b29565b60a0810161387282886129a1565b61387f6020830187612b29565b81810360408301526138918186612b7b565b905081810360608301526138558185612b7b565b608080825281016138b681876129aa565b905081810360208301526138ca8186612ad2565b905081810360408301526138de8185612a71565b905081810360608301526115178184612a03565b602081016108aa8284612b20565b602081016108aa8284612b29565b6080810161391c8287612b29565b6139296020830186612b29565b6139366040830185612b29565b61089160608301846129a1565b606081016139518286612b29565b61395e6020830185612b29565b6126016040830184612b20565b608081016139798287612b29565b6139866020830186613766565b6139936040830185612b29565b6108916060830184612b29565b602081016108aa8284612c05565b602081016108aa8284612c0e565b602080825281016108a78184612b43565b602080825281016108aa81612c17565b602080825281016108aa81612c83565b602080825281016108aa81612cf0565b602080825281016108aa81612d45565b602080825281016108aa81612db8565b602080825281016108aa81612e03565b602080825281016108aa81612e62565b602080825281016108aa81612eb1565b602080825281016108aa81612ef6565b602080825281016108aa81612f7b565b602080825281016108aa81612fd3565b602080825281016108aa81613032565b602080825281016108aa81613082565b602080825281016108aa81613180565b602080825281016108aa816131ec565b602080825281016108aa8161323b565b602080825281016108aa8161328c565b602080825281016108aa816132f9565b602080825281016108aa81613365565b602080825281016108aa816133af565b602080825281016108aa816133fd565b602080825281016108aa8161345c565b602080825281016108aa816134ad565b602080825281016108aa816134fb565b602080825281016108aa81613580565b602080825281016108aa816135d8565b602080825281016108aa8161362e565b602080825281016108aa8161367a565b602080825281016108aa816136c9565b606081016108aa8284613721565b602081016108aa8284613754565b6101408101613bc8828d612b29565b613bd5602083018c612992565b8181036040830152613be7818b6129aa565b90508181036060830152613bfb818a612ad2565b90508181036080830152613c0f8189612a71565b905081810360a0830152613c238188612a03565b9050613c3260c0830187612b29565b613c3f60e0830186612b29565b818103610100830152613c528185612b43565b9050818103610120830152613c678184612b43565b9c9b505050505050505050505050565b6101208101613c86828c612b29565b613c93602083018b6129a1565b613ca0604083018a612b29565b613cad6060830189612b29565b613cba6080830188612b29565b613cc760a0830187612b29565b613cd460c0830186612b29565b613ce160e0830185612b20565b6110d2610100830184612b20565b604081016137d28285612b29565b60405181810167ffffffffffffffff81118282101715613d1c57600080fd5b604052919050565b600067ffffffffffffffff821115613d3b57600080fd5b5060209081020190565b600067ffffffffffffffff821115613d5c57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b5190565b90815260200190565b60006108aa82613db2565b151590565b8061076b81613e2e565b6001600160801b031690565b6001600160a01b031690565b60ff1690565b60006108aa825b60006108aa82613d8c565b60006108aa82613d9c565b60006108aa82613da6565b82818337506000910152565b60005b83811015613e13578181015183820152602001613dfb565b8381111561166e5750506000910152565b601f01601f191690565b6008811061235557fe5b613e4181613d8c565b811461235557600080fd5b613e4181613d97565b613e4181610b98565b613e4181613da6565b613e4181613dbe56fea365627a7a723158202aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a6c6578706572696d656e74616cf564736f6c634300050d0040

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

00000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf

-----Decoded View---------------
Arg [0] : __assetIntroducerProxy (address): 0x22DA19b404F432D64e280c3c5712E52612b689Fd
Arg [1] : __dmg (address): 0xEd91879919B71bB6905f23af0A68d231EcF87b14
Arg [2] : __guardian (address): 0xdd7680B6B2EeC193ce3ECe7129708EE12531BCcF

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000022da19b404f432d64e280c3c5712e52612b689fd
Arg [1] : 000000000000000000000000ed91879919b71bb6905f23af0a68d231ecf87b14
Arg [2] : 000000000000000000000000dd7680b6b2eec193ce3ece7129708ee12531bccf


Deployed Bytecode Sourcemap

56199:4184:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14758:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14758:42:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;14657:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14657:24:0;;;:::i;:::-;;;;;;;;16049:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16049:248:0;;;;;;;;:::i;:::-;;56775:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56775:46:0;;;:::i;:::-;;;;;;;;59814:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59814:161:0;;;;;;;;:::i;:::-;;;;;;;;13903:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13903:50:0;;;:::i;:::-;;;;;;;;15618:423;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15618:423:0;;;;;;;;:::i;59261:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59261:237:0;;;;;;;;:::i;:::-;;;;;;;;24318:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24318:172:0;;;;;;;;:::i;14864:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14864:49:0;;;;;;;;:::i;14986:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14986:122:0;;;:::i;58223:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58223:269:0;;;;;;;;:::i;14449:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14449:23:0;;;:::i;14120:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14120:20:0;;;:::i;22741:303::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22741:303:0;;;;;;;;:::i;:::-;;;;;;;;;;;16947:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16947:97:0;;;:::i;59605:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59605:201:0;;;;;;;;:::i;23212:1098::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23212:1098:0;;;;;;;;:::i;:::-;;;;;;;;21896:837;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21896:837:0;;;;;;;;:::i;14203:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14203:23:0;;;:::i;:::-;;;;;;;;24498:737;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24498:737:0;;;;;;;;:::i;57345:370::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57345:370:0;;;;;;;;:::i;17550:2487::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17550:2487:0;;;;;;;;:::i;26506:208::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26506:208:0;;;:::i;16691:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16691:111:0;;;:::i;57950:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57950:265:0;;;;;;;;:::i;58599:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58599:259:0;;;;;;;;:::i;14554:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14554:29:0;;;:::i;57723:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57723:219:0;;;:::i;14020:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14020:34:0;;;:::i;14282:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14282:25:0;;;:::i;20045:632::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20045:632:0;;;;;;;;:::i;15198:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15198:94:0;;;:::i;23052:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23052:152:0;;;;;;;;:::i;:::-;;;;;;;;17052:490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17052:490:0;;;;;;;;:::i;16305:278::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16305:278:0;;;;;;;;:::i;21160:728::-;;;;;;;;;:::i;14758:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14758:42:0;;;;;;;;;;;;;;;;;;;;;;;:::o;14657:24::-;;;;:::o;16049:248::-;16170:8;;-1:-1:-1;;;;;16170:8:0;16148:10;:31;16126:126;;;;-1:-1:-1;;;16126:126:0;;;;;;;;;;;;;;;;;16263:11;:26;16049:248::o;56775:46::-;;;-1:-1:-1;;;;;56775:46:0;;:::o;59814:161::-;-1:-1:-1;;;;;59924:43:0;;59900:4;59924:43;;;:31;:43;;;;;;;;59814:161;;;;:::o;13903:50::-;;;;;;;;;;;;;;-1:-1:-1;;;13903:50:0;;;;:::o;15618:423::-;15735:8;;-1:-1:-1;;;;;15735:8:0;15721:10;:22;15699:123;;;;-1:-1:-1;;;15699:123:0;;;;;;;;;15884:3;15863:8;-1:-1:-1;;;;;15863:8:0;15855:33;15833:147;;;;-1:-1:-1;;;15833:147:0;;;;;;;;;15993:8;:40;;-1:-1:-1;;;;;;15993:40:0;-1:-1:-1;;;;;15993:40:0;;;;;;;;;;15618:423::o;59261:237::-;59420:7;59390;56530:10;-1:-1:-1;;;;;56530:19:0;;;;:79;;-1:-1:-1;56598:10:0;56566:43;;;;:31;:43;;;;;;;;56530:79;:152;;;-1:-1:-1;;;;;;56626:44:0;;;;;;:37;:44;;;;;;;;56671:10;56626:56;;;;;;;;;;56530:152;56508:237;;;;-1:-1:-1;;;56508:237:0;;;;;;;;;59447:43;59457:7;59466:12;59480:9;59447;:43::i;:::-;59440:50;59261:237;-1:-1:-1;;;;;59261:237:0:o;24318:172::-;24413:7;24440:42;24450:10;24462;24474:7;24440:9;:42::i;:::-;24433:49;;24318:172;;;;;:::o;14864:49::-;;;;;;;;;;;;;:::o;14986:122::-;15028:80;;;;;;;;;;;;;;14986:122;:::o;58223:269::-;58418:66;;-1:-1:-1;;;58418:66:0;;;;;;;;14449:23;;;;:::o;14120:20::-;;;-1:-1:-1;;;;;14120:20:0;;:::o;22741:303::-;22815:24;22841:20;22863:26;22891:24;22928:18;22949:9;:21;22959:10;22949:21;;;;;;;;;;;22928:42;;22989:1;:9;;23000:1;:8;;23010:1;:12;;23024:1;:11;;22981:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22981:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22741:303;;;;;:::o;16947:97::-;17035:1;16947:97;;:::o;59605:201::-;-1:-1:-1;;;;;59740:46:0;;;59716:4;59740:46;;;:37;:46;;;;;;;;:58;;;;;;;;;;;;;;;59605:201::o;23212:1098::-;23281:13;23346:10;23329:13;;:27;;:45;;;;;23373:1;23360:10;:14;23329:45;23307:136;;;;-1:-1:-1;;;23307:136:0;;;;;;;;;23456:25;23484:21;;;:9;:21;;;;;23520:17;;;;;;23516:787;;;23561:22;23554:29;;;;;23516:787;23621:8;:19;;;23605:12;:35;23601:702;;23664:21;23657:28;;;;;23601:702;23723:8;:17;;;23707:12;:33;23703:600;;23764:20;23757:27;;;;;23703:600;23827:8;:21;;;23806:8;:17;;;:42;;:77;;;;23872:11;;23852:8;:17;;;:31;23806:77;23802:501;;;23907:22;23900:29;;;;;23802:501;23951:12;;;;23947:356;;23992:23;23985:30;;;;;23947:356;24037:17;;;;;;;;;24033:270;;;24078:22;24071:29;;;;;24033:270;24148:12;;;;24162:8;;:23;;;-1:-1:-1;;;24162:23:0;;;;24141:45;;24148:12;-1:-1:-1;;;;;24162:8:0;;:21;;:23;;;;;;;;;;;;;;:8;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;24162:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24162:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24162:23:0;;;;;;;;;24141:6;:45::i;:::-;24122:15;:64;24118:185;;24210:21;24203:28;;;;;24118:185;24271:20;24264:27;;;;;21896:837;21963:19;21985:17;21991:10;21985:5;:17::i;:::-;21963:39;-1:-1:-1;22044:22:0;22035:5;:31;;;;;;;;;;22013:135;;;;-1:-1:-1;;;22013:135:0;;;;;;;;;22161:25;22189:21;;;:9;:21;;;;;22257:17;;;;-1:-1:-1;;;;;22257:17:0;22243:10;:31;;:108;;-1:-1:-1;22334:17:0;;22288;;;;;22278:53;;-1:-1:-1;;;;;22288:17:0;;;;22307:23;;22314:12;;22307:6;:23::i;:::-;22278:9;:53::i;:::-;-1:-1:-1;;;;;22278:73:0;;22243:108;22221:205;;;;-1:-1:-1;;;22221:205:0;;;;;;;;;22439:17;;;:24;;-1:-1:-1;;22439:24:0;22459:4;22439:24;;;:17;22474:206;22495:16;;;:23;22491:27;;22474:206;;;22540:8;;22567:16;;;:19;;-1:-1:-1;;;;;22540:8:0;;;;:26;;22567:16;22584:1;;22567:19;;;;;;;;;;;;;;;;22588:15;;;:18;;-1:-1:-1;;;;;22567:19:0;;;;22604:1;;22588:18;;;;;;;;;;;;;;22608:8;:19;;22628:1;22608:22;;;;;;;;;;;;;;;22632:8;:18;;22651:1;22632:21;;;;;;;;;;;;;;;22655:8;:12;;;22540:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22540:128:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;22520:3:0;;;;;-1:-1:-1;22474:206:0;;-1:-1:-1;22474:206:0;;;22697:28;22714:10;22697:28;;;;;;;;;;;;;;;21896:837;;;:::o;14203:23::-;;;-1:-1:-1;;;;;14203:23:0;;:::o;24498:737::-;24656:7;24676:23;15028:80;;;;;;;;;;;;;;;;24756:4;;;;;;;;;-1:-1:-1;;;24756:4:0;;;;;;;;24740:22;24764:12;:10;:12::i;:::-;24786:4;24712:80;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24712:80:0;;;24702:91;;;;;;24676:117;;24804:18;15240:52;;;;;;;;;;;;;;;24835:48;;24863:10;;24875:7;;24835:48;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24835:48:0;;;24825:59;;;;;;24804:80;;24895:14;24951:15;24968:10;24922:57;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24922:57:0;;;24912:68;;;;;;24895:85;;24991:17;25011:26;25021:6;25029:1;25032;25035;25011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25011:26:0;;-1:-1:-1;;25011:26:0;;;-1:-1:-1;;;;;;;25070:23:0;;25048:120;;;;-1:-1:-1;;;25048:120:0;;;;;;;;;25186:41;25196:9;25207:10;25219:7;25186:9;:41::i;:::-;25179:48;24498:737;-1:-1:-1;;;;;;;;;;24498:737:0:o;57345:370::-;57483:8;;-1:-1:-1;;;;;57483:8:0;57496:10;57475:31;57453:126;;;;-1:-1:-1;;;57453:126:0;;;;;;;;;-1:-1:-1;;;;;57592:43:0;;;;;;:31;:43;;;;;;;:57;;-1:-1:-1;;57592:57:0;;;;;;;57665:42;;;;;57592:57;;57665:42;;;;;;;;;;57345:370;;:::o;17550:2487::-;17847:8;;17794:4;;-1:-1:-1;;;;;17847:8:0;17833:10;:22;;:92;;;17908:17;;17859:46;17869:10;17881:23;17888:12;17902:1;17881:6;:23::i;17859:46::-;-1:-1:-1;;;;;17859:66:0;;17833:92;17811:205;;;;-1:-1:-1;;;17811:205:0;;;;;;;;;18067:6;:13;18049:7;:14;:31;:70;;;;;18102:10;:17;18084:7;:14;:35;18049:70;:108;;;;;18141:9;:16;18123:7;:14;:34;18049:108;18027:226;;;;-1:-1:-1;;;18027:226:0;;;;;;;;;18286:14;;18264:113;;;;-1:-1:-1;;;18264:113:0;;;;;;;;;18428:23;:21;:23::i;:::-;18410:7;:14;:41;;18388:131;;;;-1:-1:-1;;;18388:131:0;;;;;;;;;18574:10;18532:21;18556:29;;;:17;:29;;;;;;18600:21;;18596:558;;18638:42;18683:23;18689:16;18683:5;:23::i;:::-;18638:68;-1:-1:-1;18779:20:0;18747:28;:52;;;;;;;;;;18721:202;;;;-1:-1:-1;;;18721:202:0;;;;;;;;;18996:21;18964:28;:53;;;;;;;;;;18938:204;;;;-1:-1:-1;;;18938:204:0;;;;;;;;;18596:558;;19166:15;19184:35;19191:12;19205:13;:11;:13::i;19184:35::-;19166:53;;19230:13;19246:32;19253:10;19265:12;;19246:6;:32::i;:::-;19291:13;:15;;;;;;19230:48;-1:-1:-1;19317:27:0;;:::i;:::-;19347:388;;;;;;;;19372:13;;19347:388;;;;19407:10;-1:-1:-1;;;;;19347:388:0;;;;;19434:1;19347:388;;;;19456:7;19347:388;;;;19483:6;19347:388;;;;19513:10;19347:388;;;;19546:9;19347:388;;;;19579:10;19347:388;;;;19611:8;19347:388;;;;19641:1;19347:388;;;;19668:1;19347:388;;;;19691:5;19347:388;;;;;;19718:5;19347:388;;;;;19317:418;;19776:11;19748:9;:25;19758:11;:14;;;19748:25;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19748:39:0;;;;;-1:-1:-1;;;;;19748:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19748:39:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19840:11;:14;;;19798:17;:39;19816:11;:20;;;-1:-1:-1;;;;;19798:39:0;-1:-1:-1;;;;;19798:39:0;;;;;;;;;;;;:56;;;;19872:125;19888:11;:14;;;19904:10;19916:7;19925:6;19933:10;19945:9;19956:10;19968:8;19978:5;19985:11;19872:125;;;;;;;;;;;;;;;;;;;;;;;;20015:14;;-1:-1:-1;;;;17550:2487:0;;;;;;;;;:::o;26506:208::-;26582:8;;-1:-1:-1;;;;;26582:8:0;26568:10;:22;26546:126;;;;-1:-1:-1;;;26546:126:0;;;;;;;;;26685:8;:21;;-1:-1:-1;;;;;;26685:21:0;;;26506:208::o;16691:111::-;16792:2;16691:111;:::o;57950:265::-;58143:64;;-1:-1:-1;;;58143:64:0;;;;;;;;58599:259;58744:10;58706:49;;;;:37;:49;;;;;;;;-1:-1:-1;;;;;58706:61:0;;;;;;;;;;;:75;;-1:-1:-1;;58706:75:0;;;;;;;58797:53;;58706:61;;58744:10;58797:53;;;;58706:75;;58797:53;;;;;;;;;;58599:259;;:::o;14554:29::-;;;;:::o;57723:219::-;57810:8;;-1:-1:-1;;;;;57810:8:0;57788:10;:31;57766:133;;;;-1:-1:-1;;;57766:133:0;;;;;;;;;57912:8;;;:22;;;-1:-1:-1;;;57912:22:0;;;;-1:-1:-1;;;;;57912:8:0;;;;:20;;:22;;;;;;;;;;:8;;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;57912:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57912:22:0;;;;57723:219::o;14020:34::-;;;-1:-1:-1;;;;;14020:34:0;;:::o;14282:25::-;;;;:::o;20045:632::-;20154:23;20133:17;20139:10;20133:5;:17::i;:::-;:44;;;;;;;;;20111:162;;;;-1:-1:-1;;;20111:162:0;;;;;;;;;20286:25;20314:21;;;:9;:21;;;;;;;;20381:8;;:16;;-1:-1:-1;;;20381:16:0;;;;20314:21;;20286:25;20357:41;;20364:15;;-1:-1:-1;;;;;20381:8:0;;;;:14;;:16;;;;;20314:21;;20381:16;;;;;;:8;:16;;;5:2:-1;;;;30:1;27;20:12;20357:41:0;20346:52;-1:-1:-1;20414:6:0;20409:185;20430:16;;;:23;20426:27;;20409:185;;;20475:107;20490:8;:16;;20507:1;20490:19;;;;;;;;;;;;;;;;;;20511:15;;;:18;;-1:-1:-1;;;;;20490:19:0;;;;20527:1;;20511:18;;;;;;;;;;;;;;20531:8;:19;;20551:1;20531:22;;;;;;;;;;;;;;;;;;20475:107;;;;;;;-1:-1:-1;;20475:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20531:22;20475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20555:8;:18;;20574:1;20555:21;;;;;;;;;;;;;;;;;;20475:107;;;;;;;-1:-1:-1;;20475:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20555:21;20475:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20578:3;20475:14;:107::i;:::-;20455:3;;20409:185;;;-1:-1:-1;20604:12:0;;;:18;;;20638:31;;;;;;20653:10;;20619:3;;20638:31;;15198:94;15240:52;;;;;;23052:152;23125:14;;:::i;:::-;-1:-1:-1;23159:21:0;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23159:37:0;;;;;;:30;;;;:37;;;;;;23152:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23152:44:0;;;;;;23052:152::o;17052:490::-;17175:8;;-1:-1:-1;;;;;17175:8:0;17153:10;:31;17131:127;;;;-1:-1:-1;;;17131:127:0;;;;;;;;;17308:4;17291:13;:21;;17269:140;;;;-1:-1:-1;;;17269:140:0;;;;;;;;;17506:12;:28;17052:490::o;16305:278::-;16438:8;;-1:-1:-1;;;;;16438:8:0;16416:10;:31;16394:132;;;;-1:-1:-1;;;16394:132:0;;;;;;;;;16537:17;:38;16305:278::o;21160:728::-;21279:20;21258:17;21264:10;21258:5;:17::i;:::-;:41;;;;;;;;;21236:160;;;;-1:-1:-1;;;21236:160:0;;;;;;;;;21409:25;21437:21;;;:9;:21;;;;;21469:17;;;:24;;-1:-1:-1;;21469:24:0;;;;;21437:21;21504:333;21525:16;;;:23;21521:27;;21504:333;;;21570:8;;21604:15;;;:18;;-1:-1:-1;;;;;21570:8:0;;;;:27;;21604:15;21620:1;;21604:18;;;;;;;;;;;;;;21642:8;:16;;21659:1;21642:19;;;;;;;;;;;;;;;;;;21680:15;;;:18;;-1:-1:-1;;;;;21642:19:0;;;;21696:1;;21680:18;;;;;;;;;;;;;;21717:8;:19;;21737:1;21717:22;;;;;;;;;;;;;;;21758:8;:18;;21777:1;21758:21;;;;;;;;;;;;;;;21798:8;:12;;;21570:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21570:255:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21570:255:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;21570:255:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;21570:255:0;;;;;;;;;-1:-1:-1;21550:3:0;;21504:333;;;;21852:28;21869:10;21852:28;;;;;;;;;;;;;;;21160:728;;:::o;25243:985::-;25360:7;25423:20;25402:17;25408:10;25402:5;:17::i;:::-;:41;;;;;;;;;25380:133;;;;-1:-1:-1;;;25380:133:0;;;;;;;;;25526:25;25554:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;25612:24:0;;;;:17;;;:24;;;;;;25669:16;;;;:25;25647:120;;;;-1:-1:-1;;;25647:120:0;;;;;;;;;25780:13;25796:37;25806:5;25813:8;:19;;;25796:9;:37::i;:::-;25780:53;;25850:7;25846:185;;;25894:32;25901:8;:17;;;25920:5;-1:-1:-1;;;;;25894:32:0;:6;:32::i;:::-;25874:17;;;:52;25846:185;;;25983:36;25990:8;:21;;;26013:5;-1:-1:-1;;;;;25983:36:0;:6;:36::i;:::-;25959:21;;;:60;25846:185;26043:23;;26062:4;-1:-1:-1;;26043:23:0;;;;-1:-1:-1;;26077:25:0;26043:23;26077:25;;;;;-1:-1:-1;;26113:21:0;;-1:-1:-1;;;;;26113:21:0;;;;;;26152:43;;;;;;26161:5;;26168:10;;26077:25;;26113:21;;26152:43;;;;;;;;;;26215:5;-1:-1:-1;;;25243:985:0;;;;;;:::o;27710:189::-;27771:4;27797:5;;;27821:6;;;;27813:59;;;;-1:-1:-1;;;27813:59:0;;;;;;;;27907:172;27968:4;27998:1;27993;:6;;27985:63;;;;-1:-1:-1;;;27985:63:0;;;;;;;;;-1:-1:-1;28066:5:0;;;27907:172::o;60086:292::-;60189:7;60216:154;60249:38;60265:6;60273:13;60249:15;:38::i;:::-;60302:20;;:57;;-1:-1:-1;;;60302:57:0;;-1:-1:-1;;;;;60302:20:0;;;;:34;;:57;;60337:6;;60345:13;;60302:57;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60302:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60302:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60302:57:0;;;;;;;;;60216:18;:154::i;28087:148::-;28193:9;28087:148;:::o;20685:467::-;20886:8;;20924:47;;-1:-1:-1;;;;;20886:8:0;;;;:27;;20924:47;;20935:6;;20943:5;;20950:9;;20961:4;;20967:3;;20924:47;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20924:47:0;;;20914:58;;;;;;20886:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20886:87:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20886:87:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20886:87:0;;;;;;;;;20885:88;20863:206;;;;-1:-1:-1;;;20863:206:0;;;;;;;;;21082:8;;:62;;-1:-1:-1;;;21082:62:0;;-1:-1:-1;;;;;21082:8:0;;;;:25;;:62;;21108:6;;21116:5;;21123:9;;21134:4;;21140:3;;21082:62;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21082:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21082:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21082:62:0;;;;;;;;;;20685:467;;;;;:::o;27532:170::-;27658:3;;:36;;-1:-1:-1;;;27658:36:0;;27631:7;;-1:-1:-1;;;;;27658:3:0;;:17;;:36;;27676:4;;27682:11;;27658:36;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27658:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27658:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27658:36:0;;;;;;;;29511:112;29572:7;29599:16;29606:1;29609;29599:16;;;;;;;;;;;;29399:7;29431:5;;;29463:12;-1:-1:-1;;;;;29455:6:0;;;;;;;;29447:29;;;;-1:-1:-1;;;29447:29:0;;;;;;;;;;-1:-1:-1;29494:1:0;29310:193;-1:-1:-1;;;;29310:193:0:o;56199:4184::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;56199:4184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56199:4184:0;-1:-1:-1;;;;;56199:4184:0;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;56199:4184:0;;;-1:-1:-1;56199:4184:0;:::i;:::-;;;;;;;;;-1:-1:-1;56199:4184:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;56199:4184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;748:50;;-1:-1;821:4;812:14;;;;840;;;;;702:1;695:9;655:206;;;659:14;237:630;;;;;;;;891:693;;1013:3;1006:4;998:6;994:17;990:27;980:2;;1031:1;1028;1021:12;980:2;1068:6;1055:20;1090:85;1105:69;1167:6;1105:69;;1090:85;1203:21;;;1247:4;1235:17;;;;1081:94;;-1:-1;1260:14;;1235:17;1355:1;1340:238;1365:6;1362:1;1359:13;1340:238;;;1448:3;1435:17;1427:6;1423:30;1472:42;1510:3;1498:10;1472:42;;;1460:55;;-1:-1;1538:4;1529:14;;;;1557;;;;;1387:1;1380:9;1340:238;;1609:696;;1732:3;1725:4;1717:6;1713:17;1709:27;1699:2;;1750:1;1747;1740:12;1699:2;1787:6;1774:20;1809:86;1824:70;1887:6;1824:70;;1809:86;1923:21;;;1967:4;1955:17;;;;1800:95;;-1:-1;1980:14;;1955:17;2075:1;2060:239;2085:6;2082:1;2079:13;2060:239;;;2168:3;2155:17;2147:6;2143:30;2192:43;2231:3;2219:10;2192:43;;;2180:56;;-1:-1;2259:4;2250:14;;;;2278;;;;;2107:1;2100:9;2060:239;;2331:707;;2448:3;2441:4;2433:6;2429:17;2425:27;2415:2;;2466:1;2463;2456:12;2415:2;2503:6;2490:20;2525:80;2540:64;2597:6;2540:64;;2525:80;2516:89;;2622:5;2647:6;2640:5;2633:21;2677:4;2669:6;2665:17;2655:27;;2699:4;2694:3;2690:14;2683:21;;2752:6;2799:3;2791:4;2783:6;2779:17;2774:3;2770:27;2767:36;2764:2;;;2816:1;2813;2806:12;2764:2;2841:1;2826:206;2851:6;2848:1;2845:13;2826:206;;;2909:3;2931:37;2964:3;2952:10;2931:37;;;2919:50;;-1:-1;2992:4;2983:14;;;;3011;;;;;2873:1;2866:9;2826:206;;3046:124;3110:20;;3135:30;3110:20;3135:30;;3177:128;3252:13;;3270:30;3252:13;3270:30;;3312:130;3379:20;;3404:33;3379:20;3404:33;;3449:134;3527:13;;3545:33;3527:13;3545:33;;3591:432;;3688:3;3681:4;3673:6;3669:17;3665:27;3655:2;;3706:1;3703;3696:12;3655:2;3743:6;3730:20;3765:60;3780:44;3817:6;3780:44;;3765:60;3756:69;;3845:6;3838:5;3831:21;3881:4;3873:6;3869:17;3914:4;3907:5;3903:16;3949:3;3940:6;3935:3;3931:16;3928:25;3925:2;;;3966:1;3963;3956:12;3925:2;3976:41;4010:6;4005:3;4000;3976:41;;;3648:375;;;;;;;;4032:442;;4144:3;4137:4;4129:6;4125:17;4121:27;4111:2;;4162:1;4159;4152:12;4111:2;4192:6;4186:13;4214:64;4229:48;4270:6;4229:48;;4214:64;4205:73;;4298:6;4291:5;4284:21;4334:4;4326:6;4322:17;4367:4;4360:5;4356:16;4402:3;4393:6;4388:3;4384:16;4381:25;4378:2;;;4419:1;4416;4409:12;4378:2;4429:39;4461:6;4456:3;4451;4429:39;;5376:134;5454:13;;5472:33;5454:13;5472:33;;5795:126;5860:20;;5885:31;5860:20;5885:31;;5928:241;;6032:2;6020:9;6011:7;6007:23;6003:32;6000:2;;;6048:1;6045;6038:12;6000:2;6083:1;6100:53;6145:7;6125:9;6100:53;;;6090:63;5994:175;-1:-1;;;;5994:175;6176:366;;;6297:2;6285:9;6276:7;6272:23;6268:32;6265:2;;;6313:1;6310;6303:12;6265:2;6348:1;6365:53;6410:7;6390:9;6365:53;;;6355:63;;6327:97;6455:2;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;;;6463:63;;6434:98;6259:283;;;;;;6549:360;;;6667:2;6655:9;6646:7;6642:23;6638:32;6635:2;;;6683:1;6680;6673:12;6635:2;6718:1;6735:53;6780:7;6760:9;6735:53;;;6725:63;;6697:97;6825:2;6843:50;6885:7;6876:6;6865:9;6861:22;6843:50;;6916:366;;;7037:2;7025:9;7016:7;7012:23;7008:32;7005:2;;;7053:1;7050;7043:12;7005:2;7088:1;7105:53;7150:7;7130:9;7105:53;;;7095:63;;7067:97;7195:2;7213:53;7258:7;7249:6;7238:9;7234:22;7213:53;;7289:485;;;;7424:2;7412:9;7403:7;7399:23;7395:32;7392:2;;;7440:1;7437;7430:12;7392:2;7475:1;7492:53;7537:7;7517:9;7492:53;;;7482:63;;7454:97;7582:2;7600:53;7645:7;7636:6;7625:9;7621:22;7600:53;;;7590:63;;7561:98;7690:2;7708:50;7750:7;7741:6;7730:9;7726:22;7708:50;;;7698:60;;7669:95;7386:388;;;;;;7781:1647;;;;;;;8101:3;8089:9;8080:7;8076:23;8072:33;8069:2;;;8118:1;8115;8108:12;8069:2;8153:31;;8204:18;8193:30;;8190:2;;;8236:1;8233;8226:12;8190:2;8256:78;8326:7;8317:6;8306:9;8302:22;8256:78;;;8246:88;;8132:208;8399:2;8388:9;8384:18;8371:32;8423:18;8415:6;8412:30;8409:2;;;8455:1;8452;8445:12;8409:2;8475:78;8545:7;8536:6;8525:9;8521:22;8475:78;;;8465:88;;8350:209;8618:2;8607:9;8603:18;8590:32;8642:18;8634:6;8631:30;8628:2;;;8674:1;8671;8664:12;8628:2;8694:84;8770:7;8761:6;8750:9;8746:22;8694:84;;;8684:94;;8569:215;8843:2;8832:9;8828:18;8815:32;8867:18;8859:6;8856:30;8853:2;;;8899:1;8896;8889:12;8853:2;8919:83;8994:7;8985:6;8974:9;8970:22;8919:83;;;8909:93;;8794:214;9067:3;9056:9;9052:19;9039:33;9092:18;9084:6;9081:30;9078:2;;;9124:1;9121;9114:12;9078:2;9144:63;9199:7;9190:6;9179:9;9175:22;9144:63;;;9134:73;;9018:195;9272:3;9261:9;9257:19;9244:33;9297:18;9289:6;9286:30;9283:2;;;9329:1;9326;9319:12;9283:2;9349:63;9404:7;9395:6;9384:9;9380:22;9349:63;;;9339:73;;9223:195;8063:1365;;;;;;;;;9435:257;;9547:2;9535:9;9526:7;9522:23;9518:32;9515:2;;;9563:1;9560;9553:12;9515:2;9598:1;9615:61;9668:7;9648:9;9615:61;;9699:263;;9814:2;9802:9;9793:7;9789:23;9785:32;9782:2;;;9830:1;9827;9820:12;9782:2;9865:1;9882:64;9938:7;9918:9;9882:64;;9969:360;;10093:2;10081:9;10072:7;10068:23;10064:32;10061:2;;;10109:1;10106;10099:12;10061:2;10144:24;;10188:18;10177:30;;10174:2;;;10220:1;10217;10210:12;10174:2;10240:73;10305:7;10296:6;10285:9;10281:22;10240:73;;10336:263;;10451:2;10439:9;10430:7;10426:23;10422:32;10419:2;;;10467:1;10464;10457:12;10419:2;10502:1;10519:64;10575:7;10555:9;10519:64;;10606:241;;10710:2;10698:9;10689:7;10685:23;10681:32;10678:2;;;10726:1;10723;10716:12;10678:2;10761:1;10778:53;10823:7;10803:9;10778:53;;11124:366;;;11245:2;11233:9;11224:7;11220:23;11216:32;11213:2;;;11261:1;11258;11251:12;11213:2;11296:1;11313:53;11358:7;11338:9;11313:53;;11497:360;;;11615:2;11603:9;11594:7;11590:23;11586:32;11583:2;;;11631:1;11628;11621:12;11583:2;11666:1;11683:53;11728:7;11708:9;11683:53;;11864:733;;;;;;12031:3;12019:9;12010:7;12006:23;12002:33;11999:2;;;12048:1;12045;12038:12;11999:2;12083:1;12100:53;12145:7;12125:9;12100:53;;;12090:63;;12062:97;12190:2;12208:50;12250:7;12241:6;12230:9;12226:22;12208:50;;;12198:60;;12169:95;12295:2;12313:51;12356:7;12347:6;12336:9;12332:22;12313:51;;;12303:61;;12274:96;12401:2;12419:53;12464:7;12455:6;12444:9;12440:22;12419:53;;;12409:63;;12380:98;12509:3;12528:53;12573:7;12564:6;12553:9;12549:22;12528:53;;;12518:63;;12488:99;11993:604;;;;;;;;;12605:173;;12692:46;12734:3;12726:6;12692:46;;;-1:-1;;12767:4;12758:14;;12685:93;12787:177;;12898:60;12954:3;12946:6;12898:60;;13163:173;;13250:46;13292:3;13284:6;13250:46;;13344:142;13435:45;13474:5;13435:45;;;13430:3;13423:58;13417:69;;;13493:103;13566:24;13584:5;13566:24;;13754:690;;13899:54;13947:5;13899:54;;;13966:86;14045:6;14040:3;13966:86;;;13959:93;;14073:56;14123:5;14073:56;;;14149:7;14177:1;14162:260;14187:6;14184:1;14181:13;14162:260;;;14254:6;14248:13;14275:63;14334:3;14319:13;14275:63;;;14268:70;;14355:60;14408:6;14355:60;;;14345:70;-1:-1;;14209:1;14202:9;14162:260;;;-1:-1;14435:3;;13878:566;-1:-1;;;;;13878:566;14479:888;;14634:59;14687:5;14634:59;;;14706:91;14790:6;14785:3;14706:91;;;14699:98;;14820:3;14862:4;14854:6;14850:17;14845:3;14841:27;14889:61;14944:5;14889:61;;;14970:7;14998:1;14983:345;15008:6;15005:1;15002:13;14983:345;;;15070:9;15064:4;15060:20;15055:3;15048:33;15115:6;15109:13;15137:74;15206:4;15191:13;15137:74;;;15129:82;;15228:65;15286:6;15228:65;;;15316:4;15307:14;;;;;15218:75;-1:-1;;15030:1;15023:9;14983:345;;;-1:-1;15341:4;;14613:754;-1:-1;;;;;;;14613:754;15404:896;;15561:60;15615:5;15561:60;;;15634:92;15719:6;15714:3;15634:92;;;15627:99;;15749:3;15791:4;15783:6;15779:17;15774:3;15770:27;15818:62;15874:5;15818:62;;;15900:7;15928:1;15913:348;15938:6;15935:1;15932:13;15913:348;;;16000:9;15994:4;15990:20;15985:3;15978:33;16045:6;16039:13;16067:76;16138:4;16123:13;16067:76;;;16059:84;;16160:66;16219:6;16160:66;;;16249:4;16240:14;;;;;16150:76;-1:-1;;15960:1;15953:9;15913:348;;16339:690;;16484:54;16532:5;16484:54;;;16551:86;16630:6;16625:3;16551:86;;;16544:93;;16658:56;16708:5;16658:56;;;16734:7;16762:1;16747:260;16772:6;16769:1;16766:13;16747:260;;;16839:6;16833:13;16860:63;16919:3;16904:13;16860:63;;;16853:70;;16940:60;16993:6;16940:60;;;16930:70;-1:-1;;16794:1;16787:9;16747:260;;17037:94;17104:21;17119:5;17104:21;;17249:113;17332:24;17350:5;17332:24;;17369:152;17470:45;17490:24;17508:5;17490:24;;;17470:45;;17528:343;;17638:38;17670:5;17638:38;;;17688:70;17751:6;17746:3;17688:70;;;17681:77;;17763:52;17808:6;17803:3;17796:4;17789:5;17785:16;17763:52;;;17836:29;17858:6;17836:29;;;17827:39;;;;17618:253;-1:-1;;;17618:253;18223:818;;18340:5;18334:12;18374:1;18363:9;18359:17;18387:1;18382:247;;;;18640:1;18635:400;;;;18352:683;;18382:247;18460:4;18456:1;18445:9;18441:17;18437:28;18479:70;18542:6;18537:3;18479:70;;;-1:-1;;18568:25;;18556:38;;18472:77;-1:-1;;18617:4;18608:14;;;-1:-1;18382:247;;18635:400;18704:1;18693:9;18689:17;18720:70;18783:6;18778:3;18720:70;;;18713:77;;18812:37;18843:5;18812:37;;;18865:1;18873:130;18887:6;18884:1;18881:13;18873:130;;;18946:14;;18933:11;;;18926:35;18993:1;18980:15;;;;18909:4;18902:12;18873:130;;;19017:11;;;-1:-1;;;18352:683;;18310:731;;;;;;19049:180;19159:64;19217:5;19159:64;;19586:156;19684:52;19730:5;19684:52;;21632:566;;21792:67;21856:2;21851:3;21792:67;;;21892:66;21872:87;;21993:66;21988:2;21979:12;;21972:88;-1:-1;;;22089:2;22080:12;;22073:88;22189:2;22180:12;;21778:420;-1:-1;;21778:420;22207:566;;22367:67;22431:2;22426:3;22367:67;;;22467:66;22447:87;;22568:66;22563:2;22554:12;;22547:88;-1:-1;;;22664:2;22655:12;;22648:88;22764:2;22755:12;;22353:420;-1:-1;;22353:420;22782:465;;22942:67;23006:2;23001:3;22942:67;;;23042:66;23022:87;;-1:-1;;;23138:2;23129:12;;23122:88;23238:2;23229:12;;22928:319;-1:-1;;22928:319;23256:465;;23416:67;23480:2;23475:3;23416:67;;;23516:66;23496:87;;-1:-1;;;23612:2;23603:12;;23596:88;23712:2;23703:12;;23402:319;-1:-1;;23402:319;23730:398;;23908:84;23990:1;23985:3;23908:84;;;-1:-1;;;24005:87;;24120:1;24111:11;;23894:234;-1:-1;;23894:234;24137:465;;24297:67;24361:2;24356:3;24297:67;;;24397:66;24377:87;;-1:-1;;;24493:2;24484:12;;24477:88;24593:2;24584:12;;24283:319;-1:-1;;24283:319;24611:465;;24771:67;24835:2;24830:3;24771:67;;;24871:66;24851:87;;24972:66;24967:2;24958:12;;24951:88;25067:2;25058:12;;24757:319;-1:-1;;24757:319;25085:465;;25245:67;25309:2;25304:3;25245:67;;;25345:66;25325:87;;-1:-1;;;25441:2;25432:12;;25425:88;25541:2;25532:12;;25231:319;-1:-1;;25231:319;25559:465;;25719:67;25783:2;25778:3;25719:67;;;25819:66;25799:87;;-1:-1;;;25915:2;25906:12;;25899:88;26015:2;26006:12;;25705:319;-1:-1;;25705:319;26033:566;;26193:67;26257:2;26252:3;26193:67;;;26293:66;26273:87;;26394:66;26389:2;26380:12;;26373:88;26495:66;26490:2;26481:12;;26474:88;26590:2;26581:12;;26179:420;-1:-1;;26179:420;26608:465;;26768:67;26832:2;26827:3;26768:67;;;26868:66;26848:87;;-1:-1;;;26964:2;26955:12;;26948:88;27064:2;27055:12;;26754:319;-1:-1;;26754:319;27082:465;;27242:67;27306:2;27301:3;27242:67;;;27342:66;27322:87;;27443:66;27438:2;27429:12;;27422:88;27538:2;27529:12;;27228:319;-1:-1;;27228:319;27556:465;;27716:67;27780:2;27775:3;27716:67;;;27816:66;27796:87;;-1:-1;;;27912:2;27903:12;;27896:88;28012:2;28003:12;;27702:319;-1:-1;;27702:319;28030:465;;28190:67;28254:2;28249:3;28190:67;;;28290:66;28270:87;;-1:-1;;;28386:2;28377:12;;28370:88;28486:2;28477:12;;28176:319;-1:-1;;28176:319;28504:602;;28682:85;28764:2;28759:3;28682:85;;;28800:66;28780:87;;28901:66;28896:2;28887:12;;28880:88;-1:-1;;;28997:2;28988:12;;28981:88;29097:2;29088:12;;28668:438;-1:-1;;28668:438;29115:501;;29293:85;29375:2;29370:3;29293:85;;;29411:66;29391:87;;-1:-1;;;29507:2;29498:12;;29491:88;29607:2;29598:12;;29279:337;-1:-1;;29279:337;29625:566;;29785:67;29849:2;29844:3;29785:67;;;29885:66;29865:87;;29986:66;29981:2;29972:12;;29965:88;-1:-1;;;30082:2;30073:12;;30066:88;30182:2;30173:12;;29771:420;-1:-1;;29771:420;30200:465;;30360:67;30424:2;30419:3;30360:67;;;30460:66;30440:87;;-1:-1;;;30556:2;30547:12;;30540:88;30656:2;30647:12;;30346:319;-1:-1;;30346:319;30674:465;;30834:67;30898:2;30893:3;30834:67;;;30934:66;30914:87;;-1:-1;;;31030:2;31021:12;;31014:88;31130:2;31121:12;;30820:319;-1:-1;;30820:319;31148:566;;31308:67;31372:2;31367:3;31308:67;;;31408:66;31388:87;;31509:66;31504:2;31495:12;;31488:88;-1:-1;;;31605:2;31596:12;;31589:88;31705:2;31696:12;;31294:420;-1:-1;;31294:420;31723:566;;31883:67;31947:2;31942:3;31883:67;;;31983:66;31963:87;;32084:66;32079:2;32070:12;;32063:88;-1:-1;;;32180:2;32171:12;;32164:88;32280:2;32271:12;;31869:420;-1:-1;;31869:420;32298:465;;32458:67;32522:2;32517:3;32458:67;;;32558:66;32538:87;;-1:-1;;;32654:2;32645:12;;32638:88;32754:2;32745:12;;32444:319;-1:-1;;32444:319;32772:465;;32932:67;32996:2;32991:3;32932:67;;;33032:66;33012:87;;-1:-1;;;33128:2;33119:12;;33112:88;33228:2;33219:12;;32918:319;-1:-1;;32918:319;33246:465;;33406:67;33470:2;33465:3;33406:67;;;33506:66;33486:87;;33607:66;33602:2;33593:12;;33586:88;33702:2;33693:12;;33392:319;-1:-1;;33392:319;33720:465;;33880:67;33944:2;33939:3;33880:67;;;33980:66;33960:87;;-1:-1;;;34076:2;34067:12;;34060:88;34176:2;34167:12;;33866:319;-1:-1;;33866:319;34194:465;;34354:67;34418:2;34413:3;34354:67;;;34454:66;34434:87;;-1:-1;;;34550:2;34541:12;;34534:88;34650:2;34641:12;;34340:319;-1:-1;;34340:319;34668:566;;34828:67;34892:2;34887:3;34828:67;;;34928:66;34908:87;;35029:66;35024:2;35015:12;;35008:88;35130:66;35125:2;35116:12;;35109:88;35225:2;35216:12;;34814:420;-1:-1;;34814:420;35243:465;;35403:67;35467:2;35462:3;35403:67;;;35503:66;35483:87;;-1:-1;;;35599:2;35590:12;;35583:88;35699:2;35690:12;;35389:319;-1:-1;;35389:319;35717:465;;35877:67;35941:2;35936:3;35877:67;;;35977:66;35957:87;;-1:-1;;;36073:2;36064:12;;36057:88;36173:2;36164:12;;35863:319;-1:-1;;35863:319;36191:465;;36351:67;36415:2;36410:3;36351:67;;;36451:66;36431:87;;-1:-1;;;36547:2;36538:12;;36531:88;36647:2;36638:12;;36337:319;-1:-1;;36337:319;36665:465;;36825:67;36889:2;36884:3;36825:67;;;36925:66;36905:87;;-1:-1;;;37021:2;37012:12;;37005:88;37121:2;37112:12;;36811:319;-1:-1;;36811:319;37139:465;;37299:67;37363:2;37358:3;37299:67;;;37399:66;37379:87;;-1:-1;;;37495:2;37486:12;;37479:88;37595:2;37586:12;;37285:319;-1:-1;;37285:319;37687:622;37898:22;;37828:4;37819:14;;;37926:56;37823:3;37898:22;37926:56;;;37848:140;38064:4;38057:5;38053:16;38047:23;38076:57;38127:4;38122:3;38118:14;38104:12;38076:57;;;37998:141;38213:4;38206:5;38202:16;38196:23;38225:63;38282:4;38277:3;38273:14;38259:12;38316:103;38389:24;38407:5;38389:24;;38546:126;38629:37;38660:5;38629:37;;38909:107;38988:22;39004:5;38988:22;;39023:650;;39278:148;39422:3;39278:148;;;39271:155;;39437:75;39508:3;39499:6;39437:75;;;39534:2;39529:3;39525:12;39518:19;;39548:75;39619:3;39610:6;39548:75;;;-1:-1;39645:2;39636:12;;39259:414;-1:-1;;39259:414;39680:372;;39879:148;40023:3;39879:148;;40059:372;;40258:148;40402:3;40258:148;;40438:213;40556:2;40541:18;;40570:71;40545:9;40614:6;40570:71;;40658:324;40804:2;40789:18;;40818:71;40793:9;40862:6;40818:71;;;40900:72;40968:2;40957:9;40953:18;40944:6;40900:72;;40989:535;41185:3;41170:19;;41200:71;41174:9;41244:6;41200:71;;;41282:72;41350:2;41339:9;41335:18;41326:6;41282:72;;;41365:66;41427:2;41416:9;41412:18;41403:6;41365:66;;;41442:72;41510:2;41499:9;41495:18;41486:6;41442:72;;41531:831;41799:3;41784:19;;41814:71;41788:9;41858:6;41814:71;;;41896:72;41964:2;41953:9;41949:18;41940:6;41896:72;;;42016:9;42010:4;42006:20;42001:2;41990:9;41986:18;41979:48;42041:78;42114:4;42105:6;42041:78;;;42033:86;;42167:9;42161:4;42157:20;42152:2;42141:9;42137:18;42130:48;42192:76;42263:4;42254:6;42192:76;;;42184:84;;42279:73;42347:3;42336:9;42332:19;42323:6;42279:73;;42369:819;42631:3;42616:19;;42646:71;42620:9;42690:6;42646:71;;;42728:72;42796:2;42785:9;42781:18;42772:6;42728:72;;;42848:9;42842:4;42838:20;42833:2;42822:9;42818:18;42811:48;42873:75;42943:4;42934:6;42873:75;;;42865:83;;42996:9;42990:4;42986:20;42981:2;42970:9;42966:18;42959:48;43021:73;43089:4;43080:6;43021:73;;43195:1183;43619:3;43634:47;;;43604:19;;43695:108;43604:19;43789:6;43695:108;;;43687:116;;43851:9;43845:4;43841:20;43836:2;43825:9;43821:18;43814:48;43876:108;43979:4;43970:6;43876:108;;;43868:116;;44032:9;44026:4;44022:20;44017:2;44006:9;44002:18;43995:48;44057:120;44172:4;44163:6;44057:120;;;44049:128;;44225:9;44219:4;44215:20;44210:2;44199:9;44195:18;44188:48;44250:118;44363:4;44354:6;44250:118;;44385:201;44497:2;44482:18;;44511:65;44486:9;44549:6;44511:65;;44593:213;44711:2;44696:18;;44725:71;44700:9;44769:6;44725:71;;44813:547;45015:3;45000:19;;45030:71;45004:9;45074:6;45030:71;;;45112:72;45180:2;45169:9;45165:18;45156:6;45112:72;;;45195;45263:2;45252:9;45248:18;45239:6;45195:72;;;45278;45346:2;45335:9;45331:18;45322:6;45278:72;;45367:423;45535:2;45520:18;;45549:71;45524:9;45593:6;45549:71;;;45631:72;45699:2;45688:9;45684:18;45675:6;45631:72;;;45714:66;45776:2;45765:9;45761:18;45752:6;45714:66;;45797:539;45995:3;45980:19;;46010:71;45984:9;46054:6;46010:71;;;46092:68;46156:2;46145:9;46141:18;46132:6;46092:68;;;46171:72;46239:2;46228:9;46224:18;46215:6;46171:72;;;46254;46322:2;46311:9;46307:18;46298:6;46254:72;;46343:267;46488:2;46473:18;;46502:98;46477:9;46573:6;46502:98;;47141:243;47274:2;47259:18;;47288:86;47263:9;47347:6;47288:86;;47391:293;47525:2;47539:47;;;47510:18;;47600:74;47510:18;47660:6;47600:74;;47999:407;48190:2;48204:47;;;48175:18;;48265:131;48175:18;48265:131;;48413:407;48604:2;48618:47;;;48589:18;;48679:131;48589:18;48679:131;;48827:407;49018:2;49032:47;;;49003:18;;49093:131;49003:18;49093:131;;49241:407;49432:2;49446:47;;;49417:18;;49507:131;49417:18;49507:131;;49655:407;49846:2;49860:47;;;49831:18;;49921:131;49831:18;49921:131;;50069:407;50260:2;50274:47;;;50245:18;;50335:131;50245:18;50335:131;;50483:407;50674:2;50688:47;;;50659:18;;50749:131;50659:18;50749:131;;50897:407;51088:2;51102:47;;;51073:18;;51163:131;51073:18;51163:131;;51311:407;51502:2;51516:47;;;51487:18;;51577:131;51487:18;51577:131;;51725:407;51916:2;51930:47;;;51901:18;;51991:131;51901:18;51991:131;;52139:407;52330:2;52344:47;;;52315:18;;52405:131;52315:18;52405:131;;52553:407;52744:2;52758:47;;;52729:18;;52819:131;52729:18;52819:131;;52967:407;53158:2;53172:47;;;53143:18;;53233:131;53143:18;53233:131;;53381:407;53572:2;53586:47;;;53557:18;;53647:131;53557:18;53647:131;;53795:407;53986:2;54000:47;;;53971:18;;54061:131;53971:18;54061:131;;54209:407;54400:2;54414:47;;;54385:18;;54475:131;54385:18;54475:131;;54623:407;54814:2;54828:47;;;54799:18;;54889:131;54799:18;54889:131;;55037:407;55228:2;55242:47;;;55213:18;;55303:131;55213:18;55303:131;;55451:407;55642:2;55656:47;;;55627:18;;55717:131;55627:18;55717:131;;55865:407;56056:2;56070:47;;;56041:18;;56131:131;56041:18;56131:131;;56279:407;56470:2;56484:47;;;56455:18;;56545:131;56455:18;56545:131;;56693:407;56884:2;56898:47;;;56869:18;;56959:131;56869:18;56959:131;;57107:407;57298:2;57312:47;;;57283:18;;57373:131;57283:18;57373:131;;57521:407;57712:2;57726:47;;;57697:18;;57787:131;57697:18;57787:131;;57935:407;58126:2;58140:47;;;58111:18;;58201:131;58111:18;58201:131;;58349:407;58540:2;58554:47;;;58525:18;;58615:131;58525:18;58615:131;;58763:407;58954:2;58968:47;;;58939:18;;59029:131;58939:18;59029:131;;59177:407;59368:2;59382:47;;;59353:18;;59443:131;59353:18;59443:131;;59591:407;59782:2;59796:47;;;59767:18;;59857:131;59767:18;59857:131;;60005:309;60171:2;60156:18;;60185:119;60160:9;60277:6;60185:119;;60321:213;60439:2;60424:18;;60453:71;60428:9;60497:6;60453:71;;60761:2047;61401:3;61386:19;;61416:71;61390:9;61460:6;61416:71;;;61498:80;61574:2;61563:9;61559:18;61550:6;61498:80;;;61626:9;61620:4;61616:20;61611:2;61600:9;61596:18;61589:48;61651:108;61754:4;61745:6;61651:108;;;61643:116;;61807:9;61801:4;61797:20;61792:2;61781:9;61777:18;61770:48;61832:108;61935:4;61926:6;61832:108;;;61824:116;;61989:9;61983:4;61979:20;61973:3;61962:9;61958:19;61951:49;62014:120;62129:4;62120:6;62014:120;;;62006:128;;62183:9;62177:4;62173:20;62167:3;62156:9;62152:19;62145:49;62208:118;62321:4;62312:6;62208:118;;;62200:126;;62337:73;62405:3;62394:9;62390:19;62381:6;62337:73;;;62421;62489:3;62478:9;62474:19;62465:6;62421:73;;;62543:9;62537:4;62533:20;62527:3;62516:9;62512:19;62505:49;62568:78;62641:4;62632:6;62568:78;;;62560:86;;62695:9;62689:4;62685:20;62679:3;62668:9;62664:19;62657:49;62720:78;62793:4;62784:6;62720:78;;;62712:86;61372:1436;-1:-1;;;;;;;;;;;;61372:1436;62815:1083;63145:3;63130:19;;63160:71;63134:9;63204:6;63160:71;;;63242:72;63310:2;63299:9;63295:18;63286:6;63242:72;;;63325;63393:2;63382:9;63378:18;63369:6;63325:72;;;63408;63476:2;63465:9;63461:18;63452:6;63408:72;;;63491:73;63559:3;63548:9;63544:19;63535:6;63491:73;;;63575;63643:3;63632:9;63628:19;63619:6;63575:73;;;63659;63727:3;63716:9;63712:19;63703:6;63659:73;;;63743:67;63805:3;63794:9;63790:19;63781:6;63743:67;;;63821;63883:3;63872:9;63868:19;63859:6;63821:67;;63905:324;64051:2;64036:18;;64065:71;64040:9;64109:6;64065:71;;64236:256;64298:2;64292:9;64324:17;;;64399:18;64384:34;;64420:22;;;64381:62;64378:2;;;64456:1;64453;64446:12;64378:2;64472;64465:22;64276:216;;-1:-1;64276:216;64499:304;;64658:18;64650:6;64647:30;64644:2;;;64690:1;64687;64680:12;64644:2;-1:-1;64725:4;64713:17;;;64778:15;;64581:222;65754:317;;65893:18;65885:6;65882:30;65879:2;;;65925:1;65922;65915:12;65879:2;-1:-1;66056:4;65992;65969:17;;;;-1:-1;;65965:33;66046:15;;65816:255;67060:151;67184:4;67175:14;;67132:79;67703:157;;67797:14;;;67839:4;67826:18;;;67756:104;68032:137;68135:12;;68106:63;69597:178;69715:19;;;69764:4;69755:14;;69708:67;71175:91;;71237:24;71255:5;71237:24;;71273:85;71339:13;71332:21;;71315:43;71444:140;71523:5;71529:50;71523:5;71529:50;;71591:113;-1:-1;;;;;71653:46;;71636:68;71711:121;-1:-1;;;;;71773:54;;71756:76;71918:81;71989:4;71978:16;;71961:38;72006:129;;72093:37;72124:5;72142:175;;72248:64;72306:5;72248:64;;73078:140;;73172:41;73207:5;73172:41;;73225:108;;73304:24;73322:5;73304:24;;73584:145;73665:6;73660:3;73655;73642:30;-1:-1;73721:1;73703:16;;73696:27;73635:94;73738:268;73803:1;73810:101;73824:6;73821:1;73818:13;73810:101;;;73891:11;;;73885:18;73872:11;;;73865:39;73846:2;73839:10;73810:101;;;73926:6;73923:1;73920:13;73917:2;;;-1:-1;;73991:1;73973:16;;73966:27;73787:219;74095:97;74183:2;74163:14;-1:-1;;74159:28;;74143:49;74200:108;74286:1;74279:5;74276:12;74266:2;;74292:9;74315:117;74384:24;74402:5;74384:24;;;74377:5;74374:35;74364:2;;74423:1;74420;74413:12;74439:111;74505:21;74520:5;74505:21;;74557:117;74626:24;74644:5;74626:24;;74681:117;74750:24;74768:5;74750:24;;74929:113;74996:22;75012:5;74996:22;

Swarm Source

bzzr://2aae8125ad54540d868b2608d70e8fc7f932f34cc622472725fe2203ec7d0d9a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.