Contract 0x95d8b66DAE162C0C803C62d230e23579c2401a02

  Note: Our ETH balance display is temporarily unavailable. Please check back later.

Contract Overview

Balance:
Txn Hash Method
Block
From
To
Value
0x814b721f266da0e116c8650469d1c00f4e7df4fce5a16cc8fa66f58d106ba37b0x608060407979112022-09-01 15:35:37593 days 21 hrs ago0x3363e40cd9ed1bfc82dfa42e059d82570dd8651d IN  Create: ThalesOracleCouncil0 ETH0.0006322046890.00001
[ Download CSV Export 
Latest 24 internal transactions
Parent Txn Hash Block From To Value
0x6d515aa96dc9470dc09802dba6ad6cd0f603d28acdaa2ed19a26d229bba02d6d11313112022-09-15 14:44:27579 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x6d515aa96dc9470dc09802dba6ad6cd0f603d28acdaa2ed19a26d229bba02d6d11313112022-09-15 14:44:27579 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x9fc414b22b45877bba736aab410a3e2d97e2b9d9e0de0c758b0ada2bacd3921611285622022-09-15 12:26:18580 days 14 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x9fc414b22b45877bba736aab410a3e2d97e2b9d9e0de0c758b0ada2bacd3921611285622022-09-15 12:26:18580 days 14 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x91e7fbfff4e39cd3fefa08fce180c8662b2fca7fd6b57952835f2b83daed3ab011280142022-09-15 11:58:22580 days 42 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x91e7fbfff4e39cd3fefa08fce180c8662b2fca7fd6b57952835f2b83daed3ab011280142022-09-15 11:58:22580 days 42 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x00f7a97d1d041f10475dbf2dbd0c281d00f8550a87ddcf3e7b835902cee89ef211280022022-09-15 11:57:52580 days 42 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x00f7a97d1d041f10475dbf2dbd0c281d00f8550a87ddcf3e7b835902cee89ef211280022022-09-15 11:57:52580 days 42 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x5cc6b93bca5cd6cf640932bd7be1b93298dec9bf6237b766885badbafb32aaac11278992022-09-15 11:52:16580 days 48 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x5cc6b93bca5cd6cf640932bd7be1b93298dec9bf6237b766885badbafb32aaac11278992022-09-15 11:52:16580 days 48 mins ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x4397953950304aea4ce5e35c2df106d3dba6b705e6012541c3da90224a6332c311275552022-09-15 11:31:05580 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x4397953950304aea4ce5e35c2df106d3dba6b705e6012541c3da90224a6332c311275552022-09-15 11:31:05580 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xa00df822de7bcbe4c4e711d82718b0ec714fd6bb93d6edc3149c14a33ffa2e6911032752022-09-14 15:16:21580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xa00df822de7bcbe4c4e711d82718b0ec714fd6bb93d6edc3149c14a33ffa2e6911032752022-09-14 15:16:21580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x8d0225bbc49db74540b3461fabdaa0409bae210ca4276f9d285bf8879b7d400911032292022-09-14 15:14:21580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x8d0225bbc49db74540b3461fabdaa0409bae210ca4276f9d285bf8879b7d400911032292022-09-14 15:14:21580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x4ab4ecf72c092fa23bc02cc44b90cb24d8ad395405ffe0d5fdfbf5c5dcc8e7cc11031082022-09-14 15:08:20580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x4ab4ecf72c092fa23bc02cc44b90cb24d8ad395405ffe0d5fdfbf5c5dcc8e7cc11031082022-09-14 15:08:20580 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x217dc1c8aea581228892410355bbb5f52a3a6471980992c209205865f8327b2d10984862022-09-14 11:34:15581 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0x217dc1c8aea581228892410355bbb5f52a3a6471980992c209205865f8327b2d10984862022-09-14 11:34:15581 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xe0373ff5aacbbe11ecc4c67feda4ff3296a1067b20ecd37135a9f41dc2d48c0610984812022-09-14 11:33:57581 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xe0373ff5aacbbe11ecc4c67feda4ff3296a1067b20ecd37135a9f41dc2d48c0610984812022-09-14 11:33:57581 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xc1175fcaf66cb10e7cb356df80585374723ea6ea7fe6325883dbd65964bee0cf8198752022-09-02 11:15:45593 days 1 hr ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
0xd88c6a5881fc2d37b923f33ae1fd122ba7ba8f1b0c1c2ca46d0f10459613f66b7979122022-09-01 15:35:37593 days 21 hrs ago 0x385ac1100d82b88467e0cdc375c15ac2239a795c 0x95d8b66dae162c0c803c62d230e23579c2401a020 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ThalesOracleCouncil

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : ThalesOracleCouncil.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts-4.4.1/utils/math/SafeMath.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-4.4.1/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";

import "../utils/proxy/solidity-0.8.0/ProxyReentrancyGuard.sol";
import "../utils/proxy/solidity-0.8.0/ProxyOwned.sol";
import "../interfaces/IExoticPositionalMarket.sol";
import "../interfaces/IExoticPositionalMarketManager.sol";
import "../interfaces/IThalesBonds.sol";

contract ThalesOracleCouncil is Initializable, ProxyOwned, PausableUpgradeable, ProxyReentrancyGuard {
    using SafeMath for uint;
    uint private constant COUNCIL_MAX_MEMBERS = 5;
    uint private constant VOTING_OPTIONS = 7;

    uint private constant ACCEPT_SLASH = 1;
    uint private constant ACCEPT_NO_SLASH = 2;
    uint private constant REFUSE_ON_POSITIONING = 3;
    uint private constant ACCEPT_RESULT = 4;
    uint private constant ACCEPT_RESET = 5;
    uint private constant REFUSE_MATURE = 6;

    uint private constant CREATOR_BOND = 101;
    uint private constant RESOLVER_BOND = 102;
    uint private constant DISPUTOR_BOND = 103;
    uint private constant CREATOR_AND_DISPUTOR = 104;
    uint private constant RESOLVER_AND_DISPUTOR = 105;

    uint private constant TEN_SUSD = 10 * 1e18;

    struct Dispute {
        address disputorAddress;
        string disputeString;
        uint disputeCode;
        uint disputeTimestamp;
        bool disputeInPositioningPhase;
    }

    IExoticPositionalMarketManager public marketManager;
    uint public councilMemberCount;
    mapping(uint => address) public councilMemberAddress;
    mapping(address => uint) public councilMemberIndex;
    mapping(address => uint) public marketTotalDisputes;
    mapping(address => uint) public marketLastClosedDispute;
    mapping(address => uint) public allOpenDisputesCancelledToIndexForMarket;
    mapping(address => uint) public marketOpenDisputesCount;
    mapping(address => bool) public marketClosedForDisputes;
    mapping(address => address) public firstMemberThatChoseWinningPosition;

    mapping(address => mapping(uint => Dispute)) public dispute;
    mapping(address => mapping(uint => uint[])) public disputeVote;
    mapping(address => mapping(uint => uint[VOTING_OPTIONS])) public disputeVotesCount;
    mapping(address => mapping(uint => uint)) public disputeWinningPositionChoosen;
    mapping(address => mapping(uint => mapping(address => uint))) public disputeWinningPositionChoosenByMember;
    mapping(address => mapping(uint => mapping(uint => uint))) public disputeWinningPositionVotes;

    function initialize(address _owner, address _marketManager) public initializer {
        setOwner(_owner);
        initNonReentrant();
        marketManager = IExoticPositionalMarketManager(_marketManager);
    }

    /* ========== VIEWS ========== */

    function canMarketBeDisputed(address _market) public view returns (bool) {
        return !marketClosedForDisputes[_market] && IExoticPositionalMarket(_market).isMarketCreated();
    }

    function getMarketOpenDisputes(address _market) external view returns (uint) {
        return marketOpenDisputesCount[_market];
    }

    function getMarketLastClosedDispute(address _market) external view returns (uint) {
        return marketLastClosedDispute[_market];
    }

    function getNumberOfCouncilMembersForMarketDispute(address _market, uint _index) external view returns (uint) {
        return disputeVote[_market][_index].length.sub(1);
    }

    function getVotesCountForMarketDispute(address _market, uint _index) public view returns (uint) {
        uint count = 0;
        for (uint i = 1; i < disputeVote[_market][_index].length; i++) {
            count += disputeVote[_market][_index][i] > 0 ? 1 : 0;
        }
        return count;
    }

    function getVotesMissingForMarketDispute(address _market, uint _index) external view returns (uint) {
        return disputeVote[_market][_index].length.sub(1).sub(getVotesCountForMarketDispute(_market, _index));
    }

    function getDispute(address _market, uint _index) external view returns (Dispute memory) {
        return dispute[_market][_index];
    }

    function getDisputeTimestamp(address _market, uint _index) external view returns (uint) {
        return dispute[_market][_index].disputeTimestamp;
    }

    function getDisputeAddressOfDisputor(address _market, uint _index) external view returns (address) {
        return dispute[_market][_index].disputorAddress;
    }

    function getDisputeString(address _market, uint _index) external view returns (string memory) {
        return dispute[_market][_index].disputeString;
    }

    function getDisputeCode(address _market, uint _index) external view returns (uint) {
        return dispute[_market][_index].disputeCode;
    }

    function getDisputeVotes(address _market, uint _index) external view returns (uint[] memory) {
        return disputeVote[_market][_index];
    }

    function getDisputeVoteOfCouncilMember(
        address _market,
        uint _index,
        address _councilMember
    ) external view returns (uint) {
        if (isOracleCouncilMember(_councilMember)) {
            return disputeVote[_market][_index][councilMemberIndex[_councilMember]];
        } else {
            require(isOracleCouncilMember(_councilMember), "Not OC");
            return 1e18;
        }
    }

    function isDisputeOpen(address _market, uint _index) external view returns (bool) {
        return dispute[_market][_index].disputeCode == 0;
    }

    function isDisputeCancelled(address _market, uint _index) external view returns (bool) {
        return
            dispute[_market][_index].disputeCode == REFUSE_ON_POSITIONING ||
            dispute[_market][_index].disputeCode == REFUSE_MATURE;
    }

    function isOpenDisputeCancelled(address _market, uint _disputeIndex) external view returns (bool) {
        return
            (marketClosedForDisputes[_market] || _disputeIndex <= allOpenDisputesCancelledToIndexForMarket[_market]) &&
            dispute[_market][_disputeIndex].disputeCode == 0 &&
            marketLastClosedDispute[_market] != _disputeIndex;
    }

    function canDisputorClaimbackBondFromUnclosedDispute(
        address _market,
        uint _disputeIndex,
        address _disputorAddress
    ) public view returns (bool) {
        if (
            marketManager.isActiveMarket(_market) &&
            _disputeIndex <= marketTotalDisputes[_market] &&
            (marketClosedForDisputes[_market] ||
                _disputeIndex <= allOpenDisputesCancelledToIndexForMarket[_market] ||
                marketManager.cancelledByCreator(_market)) &&
            dispute[_market][_disputeIndex].disputorAddress == _disputorAddress &&
            dispute[_market][_disputeIndex].disputeCode == 0 &&
            marketLastClosedDispute[_market] != _disputeIndex &&
            IThalesBonds(marketManager.thalesBonds()).getDisputorBondForMarket(_market, _disputorAddress) > 0
        ) {
            return true;
        } else {
            return false;
        }
    }

    function isOracleCouncilMember(address _councilMember) public view returns (bool) {
        return (councilMemberIndex[_councilMember] > 0);
    }

    function isMarketClosedForDisputes(address _market) public view returns (bool) {
        return marketClosedForDisputes[_market] || IExoticPositionalMarket(_market).canUsersClaim();
    }

    function setMarketManager(address _marketManager) external onlyOwner {
        require(_marketManager != address(0), "Invalid address");
        marketManager = IExoticPositionalMarketManager(_marketManager);
        emit NewMarketManager(_marketManager);
    }

    function addOracleCouncilMember(address _councilMember) external onlyOwner {
        require(_councilMember != address(0), "Invalid address.");
        require(councilMemberCount <= marketManager.maxOracleCouncilMembers(), "OC members exceeded");
        require(!isOracleCouncilMember(_councilMember), "Already OC");
        councilMemberCount = councilMemberCount.add(1);
        councilMemberAddress[councilMemberCount] = _councilMember;
        councilMemberIndex[_councilMember] = councilMemberCount;
        marketManager.addPauserAddress(_councilMember);
        emit NewOracleCouncilMember(_councilMember, councilMemberCount);
    }

    function removeOracleCouncilMember(address _councilMember) external onlyOwner {
        require(isOracleCouncilMember(_councilMember), "Not OC");
        councilMemberAddress[councilMemberIndex[_councilMember]] = councilMemberAddress[councilMemberCount];
        councilMemberIndex[councilMemberAddress[councilMemberCount]] = councilMemberIndex[_councilMember];
        councilMemberCount = councilMemberCount.sub(1);
        councilMemberIndex[_councilMember] = 0;
        marketManager.removePauserAddress(_councilMember);
        emit OracleCouncilMemberRemoved(_councilMember, councilMemberCount);
    }

    function openDispute(address _market, string memory _disputeString) external whenNotPaused {
        require(marketManager.isActiveMarket(_market), "Not Active");
        require(!isMarketClosedForDisputes(_market), "Closed for disputes");
        require(marketManager.creatorAddress(_market) != msg.sender, "Creator can not dispute");
        require(!isOracleCouncilMember(msg.sender), "OC can not dispute.");
        require(
            IERC20(marketManager.paymentToken()).balanceOf(msg.sender) >= IExoticPositionalMarket(_market).disputePrice(),
            "Low amount for dispute"
        );
        require(
            IERC20(marketManager.paymentToken()).allowance(msg.sender, marketManager.thalesBonds()) >=
                IExoticPositionalMarket(_market).disputePrice(),
            "No allowance."
        );
        require(keccak256(abi.encode(_disputeString)) != keccak256(abi.encode("")), "Invalid dispute string");
        require(
            bytes(_disputeString).length < marketManager.disputeStringLengthLimit() || bytes(_disputeString).length < 110,
            "String exceeds length"
        );

        marketTotalDisputes[_market] = marketTotalDisputes[_market].add(1);
        marketOpenDisputesCount[_market] = marketOpenDisputesCount[_market].add(1);
        dispute[_market][marketTotalDisputes[_market]].disputorAddress = msg.sender;
        dispute[_market][marketTotalDisputes[_market]].disputeString = _disputeString;
        dispute[_market][marketTotalDisputes[_market]].disputeTimestamp = block.timestamp;
        disputeVote[_market][marketTotalDisputes[_market]] = new uint[](councilMemberCount + 1);
        if (!IExoticPositionalMarket(_market).resolved()) {
            dispute[_market][marketTotalDisputes[_market]].disputeInPositioningPhase = true;
        }
        marketManager.disputeMarket(_market, msg.sender);
        emit NewDispute(
            _market,
            _disputeString,
            dispute[_market][marketTotalDisputes[_market]].disputeInPositioningPhase,
            msg.sender
        );
    }

    function voteForDispute(
        address _market,
        uint _disputeIndex,
        uint _disputeCodeVote,
        uint _winningPosition
    ) external onlyCouncilMembers {
        require(marketManager.isActiveMarket(_market), "Not active market.");
        require(!isMarketClosedForDisputes(_market), "Closed for disputes.");
        require(_disputeIndex > 0, "Dispute non existent");
        require(dispute[_market][_disputeIndex].disputeCode == 0, "Dispute closed.");
        require(_disputeCodeVote <= VOTING_OPTIONS && _disputeCodeVote > 0, "Invalid dispute code.");
        if (dispute[_market][_disputeIndex].disputeInPositioningPhase) {
            require(_disputeCodeVote < ACCEPT_RESULT, "Invalid code.");
        } else {
            require(_disputeCodeVote >= ACCEPT_RESULT, "Invalid code in maturity");
            require(_disputeIndex > allOpenDisputesCancelledToIndexForMarket[_market], "Already cancelled");
        }
        if (_winningPosition > 0 && _disputeCodeVote == ACCEPT_RESULT) {
            require(
                _winningPosition != IExoticPositionalMarket(_market).winningPosition(),
                "OC can not vote for the resolved position"
            );
            require(
                disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] != _winningPosition,
                "Same winning position"
            );
            if (disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] == 0) {
                disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] = _winningPosition;
                disputeWinningPositionVotes[_market][_disputeIndex][_winningPosition] = disputeWinningPositionVotes[_market][
                    _disputeIndex
                ][_winningPosition]
                    .add(1);
            } else {
                disputeWinningPositionVotes[_market][_disputeIndex][
                    disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender]
                ] = disputeWinningPositionVotes[_market][_disputeIndex][
                    disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender]
                ]
                    .sub(1);
                disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] = _winningPosition;
                disputeWinningPositionVotes[_market][_disputeIndex][_winningPosition] = disputeWinningPositionVotes[_market][
                    _disputeIndex
                ][_winningPosition]
                    .add(1);
            }
        }

        // check if already has voted for another option, and revert the vote
        if (disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] > 0) {
            disputeVotesCount[_market][_disputeIndex][
                disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]]
            ] = disputeVotesCount[_market][_disputeIndex][
                disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]]
            ]
                .sub(1);
        }

        // record the voting option
        disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] = _disputeCodeVote;
        disputeVotesCount[_market][_disputeIndex][_disputeCodeVote] = disputeVotesCount[_market][_disputeIndex][
            _disputeCodeVote
        ]
            .add(1);

        emit VotedAddedForDispute(_market, _disputeIndex, _disputeCodeVote, _winningPosition, msg.sender);

        if (disputeVotesCount[_market][_disputeIndex][_disputeCodeVote] > (councilMemberCount.div(2))) {
            if (_disputeCodeVote == ACCEPT_RESULT) {
                (uint maxVotesForPosition, uint chosenPosition) =
                    calculateWinningPositionBasedOnVotes(_market, _disputeIndex);
                if (maxVotesForPosition > (councilMemberCount.div(2))) {
                    disputeWinningPositionChoosen[_market][_disputeIndex] = chosenPosition;
                    closeDispute(_market, _disputeIndex, _disputeCodeVote);
                }
            } else {
                closeDispute(_market, _disputeIndex, _disputeCodeVote);
            }
        }
    }

    function closeDispute(
        address _market,
        uint _disputeIndex,
        uint _decidedOption
    ) internal nonReentrant {
        require(dispute[_market][_disputeIndex].disputeCode == 0, "Already closed");
        require(_decidedOption > 0, "Invalid option");
        dispute[_market][_disputeIndex].disputeCode = _decidedOption;
        marketOpenDisputesCount[_market] = marketOpenDisputesCount[_market] > 0
            ? marketOpenDisputesCount[_market].sub(1)
            : 0;
        if (_decidedOption == REFUSE_ON_POSITIONING || _decidedOption == REFUSE_MATURE) {
            // set dispute to false
            // send disputor BOND to SafeBox
            // marketManager.getMarketBondAmount(_market);
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                marketManager.safeBoxAddress(),
                IExoticPositionalMarket(_market).disputePrice(),
                DISPUTOR_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            marketLastClosedDispute[_market] = _disputeIndex;
            //if it is the last dispute
            if (_decidedOption == REFUSE_MATURE) {
                marketManager.setBackstopTimeout(_market);
            }
            if (marketOpenDisputesCount[_market] == 0) {
                marketManager.closeDispute(_market);
            }
            emit DisputeClosed(_market, _disputeIndex, _decidedOption);
        } else if (_decidedOption == ACCEPT_SLASH) {
            // 4 hours
            marketManager.setBackstopTimeout(_market);
            // close dispute flag
            marketManager.closeDispute(_market);
            // cancel market
            marketManager.cancelMarket(_market);
            marketClosedForDisputes[_market] = true;
            // send bond to disputor and safeBox
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                marketManager.safeBoxAddress(),
                IExoticPositionalMarket(_market).safeBoxLowAmount(),
                CREATOR_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                dispute[_market][_disputeIndex].disputorAddress,
                (IExoticPositionalMarket(_market).fixedBondAmount().add(IExoticPositionalMarket(_market).disputePrice()))
                    .sub(IExoticPositionalMarket(_market).safeBoxLowAmount()),
                CREATOR_AND_DISPUTOR,
                dispute[_market][_disputeIndex].disputorAddress
            );

            marketLastClosedDispute[_market] = _disputeIndex;
            emit MarketClosedForDisputes(_market, _decidedOption);
            emit DisputeClosed(_market, _disputeIndex, _decidedOption);
        } else if (_decidedOption == ACCEPT_NO_SLASH) {
            marketManager.setBackstopTimeout(_market);
            marketManager.closeDispute(_market);
            marketManager.cancelMarket(_market);
            marketClosedForDisputes[_market] = true;
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                marketManager.creatorAddress(_market),
                IExoticPositionalMarket(_market).fixedBondAmount(),
                CREATOR_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                dispute[_market][_disputeIndex].disputorAddress,
                IExoticPositionalMarket(_market).disputePrice(),
                DISPUTOR_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            marketManager.sendRewardToDisputor(
                _market,
                dispute[_market][_disputeIndex].disputorAddress,
                IExoticPositionalMarket(_market).arbitraryRewardForDisputor()
            );

            marketLastClosedDispute[_market] = _disputeIndex;
            emit MarketClosedForDisputes(_market, _decidedOption);
            emit DisputeClosed(_market, _disputeIndex, _decidedOption);
        } else if (_decidedOption == ACCEPT_RESULT) {
            marketManager.setBackstopTimeout(_market);
            marketManager.closeDispute(_market);
            marketManager.resolveMarket(_market, disputeWinningPositionChoosen[_market][_disputeIndex]);
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                marketManager.safeBoxAddress(),
                IExoticPositionalMarket(_market).fixedBondAmount(),
                RESOLVER_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                dispute[_market][_disputeIndex].disputorAddress,
                IExoticPositionalMarket(_market).disputePrice(),
                DISPUTOR_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );

            marketClosedForDisputes[_market] = true;
            marketLastClosedDispute[_market] = _disputeIndex;
            emit MarketClosedForDisputes(_market, _decidedOption);
            emit DisputeClosed(_market, _disputeIndex, _decidedOption);
        } else if (_decidedOption == ACCEPT_RESET) {
            marketManager.closeDispute(_market);
            marketManager.resetMarket(_market);
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                marketManager.safeBoxAddress(),
                IExoticPositionalMarket(_market).safeBoxLowAmount(),
                RESOLVER_BOND,
                dispute[_market][_disputeIndex].disputorAddress
            );
            IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser(
                _market,
                dispute[_market][_disputeIndex].disputorAddress,
                IExoticPositionalMarket(_market).fixedBondAmount().add(IExoticPositionalMarket(_market).disputePrice()).sub(
                    IExoticPositionalMarket(_market).safeBoxLowAmount()
                ),
                RESOLVER_AND_DISPUTOR,
                dispute[_market][_disputeIndex].disputorAddress
            );
            allOpenDisputesCancelledToIndexForMarket[_market] = marketTotalDisputes[_market];
            marketOpenDisputesCount[_market] = 0;
            marketLastClosedDispute[_market] = _disputeIndex;
            emit DisputeClosed(_market, _disputeIndex, _decidedOption);
        } else {
            // (CANCEL)
        }
    }

    function claimUnclosedDisputeBonds(address _market, uint _disputeIndex) external whenNotPaused {
        require(canDisputorClaimbackBondFromUnclosedDispute(_market, _disputeIndex, msg.sender), "Unable to claim.");

        if (marketManager.cancelledByCreator(_market)) {
            marketOpenDisputesCount[_market] = 0;
            marketLastClosedDispute[_market] = _disputeIndex;
            emit DisputeClosed(_market, _disputeIndex, REFUSE_MATURE);
        }
        IThalesBonds(marketManager.thalesBonds()).sendOpenDisputeBondFromMarketToDisputor(
            _market,
            msg.sender,
            IThalesBonds(marketManager.thalesBonds()).getDisputorBondForMarket(_market, msg.sender)
        );
    }

    function calculateWinningPositionBasedOnVotes(address _market, uint _disputeIndex) internal view returns (uint, uint) {
        uint maxVotes;
        uint position;
        for (uint i = 0; i <= IExoticPositionalMarket(_market).positionCount(); i++) {
            if (disputeWinningPositionVotes[_market][_disputeIndex][i] > maxVotes) {
                maxVotes = disputeWinningPositionVotes[_market][_disputeIndex][i];
                position = i;
            }
        }

        return (maxVotes, position);
    }

    function closeMarketForDisputes(address _market) external {
        require(msg.sender == owner || msg.sender == address(marketManager), "Only manager/owner");
        require(!marketClosedForDisputes[_market], "Closed already");
        marketClosedForDisputes[_market] = true;
        emit MarketClosedForDisputes(_market, 0);
    }

    function reopenMarketForDisputes(address _market) external onlyOwner {
        require(marketClosedForDisputes[_market], "Open already");
        marketClosedForDisputes[_market] = false;
        emit MarketReopenedForDisputes(_market);
    }

    modifier onlyCouncilMembers() {
        require(isOracleCouncilMember(msg.sender), "Not OC");
        _;
    }
    event NewOracleCouncilMember(address councilMember, uint councilMemberCount);
    event OracleCouncilMemberRemoved(address councilMember, uint councilMemberCount);
    event NewMarketManager(address marketManager);
    event NewDispute(address market, string disputeString, bool disputeInPositioningPhase, address disputorAccount);
    event VotedAddedForDispute(address market, uint disputeIndex, uint disputeCodeVote, uint winningPosition, address voter);
    event MarketClosedForDisputes(address market, uint disputeFinalCode);
    event MarketReopenedForDisputes(address market);
    event DisputeClosed(address market, uint disputeIndex, uint decidedOption);
}

File 2 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 3 of 12 : Initializable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;

import "../../utils/AddressUpgradeable.sol";

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract 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 protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}

File 4 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 5 of 12 : PausableUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pausable_init() internal onlyInitializing {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal onlyInitializing {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
    uint256[49] private __gap;
}

File 6 of 12 : ProxyReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ProxyReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;
    bool private _initialized;

    function initNonReentrant() public {
        require(!_initialized, "Already initialized");
        _initialized = true;
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

File 7 of 12 : ProxyOwned.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// Clone of syntetix contract without constructor
contract ProxyOwned {
    address public owner;
    address public nominatedOwner;
    bool private _initialized;
    bool private _transferredAtInit;

    function setOwner(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        require(!_initialized, "Already initialized, use nominateNewOwner");
        _initialized = true;
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    function transferOwnershipAtInit(address proxyAddress) external onlyOwner {
        require(proxyAddress != address(0), "Invalid address");
        require(!_transferredAtInit, "Already transferred");
        owner = proxyAddress;
        _transferredAtInit = true;
        emit OwnerChanged(owner, proxyAddress);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

File 8 of 12 : IExoticPositionalMarket.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IExoticPositionalMarket {
    /* ========== VIEWS / VARIABLES ========== */
    function isMarketCreated() external view returns (bool);

    function creatorAddress() external view returns (address);

    function resolverAddress() external view returns (address);

    function totalBondAmount() external view returns (uint);

    function marketQuestion() external view returns (string memory);

    function marketSource() external view returns (string memory);

    function positionPhrase(uint index) external view returns (string memory);

    function getTicketType() external view returns (uint);

    function positionCount() external view returns (uint);

    function endOfPositioning() external view returns (uint);

    function resolvedTime() external view returns (uint);

    function fixedTicketPrice() external view returns (uint);

    function creationTime() external view returns (uint);

    function winningPosition() external view returns (uint);

    function getTags() external view returns (uint[] memory);

    function getTotalPlacedAmount() external view returns (uint);

    function getTotalClaimableAmount() external view returns (uint);

    function getPlacedAmountPerPosition(uint index) external view returns (uint);

    function fixedBondAmount() external view returns (uint);

    function disputePrice() external view returns (uint);

    function safeBoxLowAmount() external view returns (uint);

    function arbitraryRewardForDisputor() external view returns (uint);

    function backstopTimeout() external view returns (uint);

    function disputeClosedTime() external view returns (uint);

    function totalUsersTakenPositions() external view returns (uint);

    function withdrawalAllowed() external view returns (bool);

    function disputed() external view returns (bool);

    function resolved() external view returns (bool);

    function canUsersPlacePosition() external view returns (bool);

    function canMarketBeResolvedByPDAO() external view returns (bool);

    function canMarketBeResolved() external view returns (bool);

    function canUsersClaim() external view returns (bool);

    function isMarketCancelled() external view returns (bool);

    function paused() external view returns (bool);

    function canCreatorCancelMarket() external view returns (bool);

    function getAllFees()
        external
        view
        returns (
            uint,
            uint,
            uint,
            uint
        );

    function canIssueFees() external view returns (bool);

    function noWinners() external view returns (bool);

    function transferBondToMarket(address _sender, uint _amount) external;

    function resolveMarket(uint _outcomePosition, address _resolverAddress) external;

    function cancelMarket() external;

    function resetMarket() external;

    function claimWinningTicketOnBehalf(address _user) external;

    function openDispute() external;

    function closeDispute() external;

    function setBackstopTimeout(uint _timeoutPeriod) external;
}

File 9 of 12 : IExoticPositionalMarketManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IExoticPositionalMarketManager {
    /* ========== VIEWS / VARIABLES ========== */
    function paused() external view returns (bool);

    function getActiveMarketAddress(uint _index) external view returns (address);

    function getActiveMarketIndex(address _marketAddress) external view returns (uint);

    function isActiveMarket(address _marketAddress) external view returns (bool);

    function numberOfActiveMarkets() external view returns (uint);

    function getMarketBondAmount(address _market) external view returns (uint);

    function maximumPositionsAllowed() external view returns (uint);

    function paymentToken() external view returns (address);

    function owner() external view returns (address);

    function thalesBonds() external view returns (address);

    function oracleCouncilAddress() external view returns (address);

    function safeBoxAddress() external view returns (address);

    function creatorAddress(address _market) external view returns (address);

    function resolverAddress(address _market) external view returns (address);

    function isPauserAddress(address _pauserAddress) external view returns (bool);

    function safeBoxPercentage() external view returns (uint);

    function creatorPercentage() external view returns (uint);

    function resolverPercentage() external view returns (uint);

    function withdrawalPercentage() external view returns (uint);

    function pDAOResolveTimePeriod() external view returns (uint);

    function claimTimeoutDefaultPeriod() external view returns (uint);

    function maxOracleCouncilMembers() external view returns (uint);

    function fixedBondAmount() external view returns (uint);

    function disputePrice() external view returns (uint);

    function safeBoxLowAmount() external view returns (uint);

    function arbitraryRewardForDisputor() external view returns (uint);

    function disputeStringLengthLimit() external view returns (uint);

    function cancelledByCreator(address _market) external view returns (bool);

    function withdrawalTimePeriod() external view returns (uint);

    function maxAmountForOpenBidPosition() external view returns (uint);

    function maxFinalWithdrawPercentage() external view returns (uint);

    function minFixedTicketPrice() external view returns (uint);

    function createExoticMarket(
        string memory _marketQuestion,
        string memory _marketSource,
        uint _endOfPositioning,
        uint _fixedTicketPrice,
        bool _withdrawalAllowed,
        uint[] memory _tags,
        uint _positionCount,
        string[] memory _positionPhrases
    ) external;

    function createCLMarket(
        string memory _marketQuestion,
        string memory _marketSource,
        uint _endOfPositioning,
        uint _fixedTicketPrice,
        bool _withdrawalAllowed,
        uint[] memory _tags,
        uint _positionCount,
        uint[] memory _positionsOfCreator,
        string[] memory _positionPhrases
    ) external;

    function disputeMarket(address _marketAddress, address disputor) external;

    function resolveMarket(address _marketAddress, uint _outcomePosition) external;

    function resetMarket(address _marketAddress) external;

    function cancelMarket(address _market) external;

    function closeDispute(address _market) external;

    function setBackstopTimeout(address _market) external;

    function sendMarketBondAmountTo(
        address _market,
        address _recepient,
        uint _amount
    ) external;

    function addPauserAddress(address _pauserAddress) external;

    function removePauserAddress(address _pauserAddress) external;

    function sendRewardToDisputor(
        address _market,
        address _disputorAddress,
        uint amount
    ) external;

    function issueBondsBackToCreatorAndResolver(address _marketAddress) external;
}

File 10 of 12 : IThalesBonds.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IThalesBonds {
    /* ========== VIEWS / VARIABLES ========== */
    function getTotalDepositedBondAmountForMarket(address _market) external view returns (uint);

    function getClaimedBondAmountForMarket(address _market) external view returns (uint);

    function getClaimableBondAmountForMarket(address _market) external view returns (uint);

    function getDisputorBondForMarket(address _market, address _disputorAddress) external view returns (uint);

    function getCreatorBondForMarket(address _market) external view returns (uint);

    function getResolverBondForMarket(address _market) external view returns (uint);

    function getCurveQuoteForDifferentCollateral(
        uint amount,
        address collateral,
        bool toSUSD
    ) external view returns (uint);

    function sendCreatorBondToMarket(
        address _market,
        address _creatorAddress,
        uint _amount
    ) external;

    function sendResolverBondToMarket(
        address _market,
        address _resolverAddress,
        uint _amount
    ) external;

    function sendDisputorBondToMarket(
        address _market,
        address _disputorAddress,
        uint _amount
    ) external;

    function sendBondFromMarketToUser(
        address _market,
        address _account,
        uint _amount,
        uint _bondToReduce,
        address _disputorAddress
    ) external;

    function sendOpenDisputeBondFromMarketToDisputor(
        address _market,
        address _account,
        uint _amount
    ) external;

    function setOracleCouncilAddress(address _oracleCouncilAddress) external;

    function setManagerAddress(address _managerAddress) external;

    function setCurveSUSD(
        address _curveSUSD,
        address _dai,
        address _usdc,
        address _usdt,
        bool _curveOnrampEnabled
    ) external;

    function issueBondsBackToCreatorAndResolver(address _market) external;

    function transferToMarket(address _account, uint _amount) external;

    function transferToMarket(
        address _account,
        uint _amount,
        address collateral,
        uint expectedPayout,
        uint additionalSlippage
    ) external;

    function transferFromMarket(address _account, uint _amount) external;

    function transferCreatorToResolverBonds(address _market) external;

    function decreaseCreatorVolume(address _market) external;
}

File 11 of 12 : AddressUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 12 of 12 : ContextUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decidedOption","type":"uint256"}],"name":"DisputeClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeFinalCode","type":"uint256"}],"name":"MarketClosedForDisputes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"}],"name":"MarketReopenedForDisputes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"string","name":"disputeString","type":"string"},{"indexed":false,"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"},{"indexed":false,"internalType":"address","name":"disputorAccount","type":"address"}],"name":"NewDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketManager","type":"address"}],"name":"NewMarketManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"councilMember","type":"address"},{"indexed":false,"internalType":"uint256","name":"councilMemberCount","type":"uint256"}],"name":"NewOracleCouncilMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"councilMember","type":"address"},{"indexed":false,"internalType":"uint256","name":"councilMemberCount","type":"uint256"}],"name":"OracleCouncilMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"disputeCodeVote","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningPosition","type":"uint256"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"VotedAddedForDispute","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"addOracleCouncilMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allOpenDisputesCancelledToIndexForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"},{"internalType":"address","name":"_disputorAddress","type":"address"}],"name":"canDisputorClaimbackBondFromUnclosedDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"canMarketBeDisputed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"}],"name":"claimUnclosedDisputeBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"closeMarketForDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"councilMemberAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"councilMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"councilMemberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dispute","outputs":[{"internalType":"address","name":"disputorAddress","type":"address"},{"internalType":"string","name":"disputeString","type":"string"},{"internalType":"uint256","name":"disputeCode","type":"uint256"},{"internalType":"uint256","name":"disputeTimestamp","type":"uint256"},{"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeVotesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeWinningPositionChoosen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"disputeWinningPositionChoosenByMember","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeWinningPositionVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstMemberThatChoseWinningPosition","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDispute","outputs":[{"components":[{"internalType":"address","name":"disputorAddress","type":"address"},{"internalType":"string","name":"disputeString","type":"string"},{"internalType":"uint256","name":"disputeCode","type":"uint256"},{"internalType":"uint256","name":"disputeTimestamp","type":"uint256"},{"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"}],"internalType":"struct ThalesOracleCouncil.Dispute","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeAddressOfDisputor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeCode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_councilMember","type":"address"}],"name":"getDisputeVoteOfCouncilMember","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeVotes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getMarketLastClosedDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getMarketOpenDisputes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getNumberOfCouncilMembersForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getVotesCountForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getVotesMissingForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initNonReentrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_marketManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isDisputeCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isDisputeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"isMarketClosedForDisputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"}],"name":"isOpenDisputeCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"isOracleCouncilMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketClosedForDisputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketLastClosedDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"contract IExoticPositionalMarketManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketOpenDisputesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketTotalDisputes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"string","name":"_disputeString","type":"string"}],"name":"openDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"removeOracleCouncilMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"reopenMarketForDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketManager","type":"address"}],"name":"setMarketManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"transferOwnershipAtInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"},{"internalType":"uint256","name":"_disputeCodeVote","type":"uint256"},{"internalType":"uint256","name":"_winningPosition","type":"uint256"}],"name":"voteForDispute","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50615a0580620000216000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806379ba50971161019d578063a8cca32a116100e9578063c69d81d7116100a2578063ebc797721161007c578063ebc7977214610887578063eee7b0c11461088f578063f48bb534146108a2578063f68246ce146108c557600080fd5b8063c69d81d71461084e578063cf65e30f14610861578063d82aff111461087457600080fd5b8063a8cca32a146107b9578063aa7839e8146107cc578063b35bf5db146107df578063c3b2b6e4146107ff578063c3b83f5f14610828578063c63011b21461083b57600080fd5b80638a6ef9841161015657806395e7f02d1161013057806395e7f02d146107425780639906a1f514610766578063a24536f914610786578063a6182c981461079957600080fd5b80638a6ef984146106e05780638da5cb5b14610709578063944450391461072257600080fd5b806379ba5097146106695780637b6cfe9d146106715780637bd72d811461067a578063815feffd1461068d578063876ae352146106ad57806389c0b25c146106cd57600080fd5b806341ed2c121161025c578063677445471161021557806371dba48d116101ef57806371dba48d146105e15780637210cceb1461061a57806375969e321461062d57806375e2570b1461065657600080fd5b8063677445471461058e5780636cd431dd146105a157806371720212146105c157600080fd5b806341ed2c12146104e4578063485cc955146105145780634ee05dd61461052757806353a47bb71461055d578063580a913d146105705780635c975abb1461058357600080fd5b806322cdda1a116102c95780633878970f116102a35780633878970f1461043b57806339672ba3146104755780633baebf43146104a05780633c794933146104d157600080fd5b806322cdda1a146103f25780632db4c70814610415578063380d96221461042857600080fd5b8063084739e41461031157806313af40351461034d57806314ec9a1f146103625780631627540c146103755780631eb4370a1461038857806320564334146103c1575b600080fd5b61033a61031f366004615482565b6001600160a01b03166000908152606c602052604090205490565b6040519081526020015b60405180910390f35b61036061035b366004615482565b6108d8565b005b61033a61037036600461561d565b610a18565b610360610383366004615482565b610a4a565b61033a6103963660046155b1565b6001600160a01b03919091166000908152607160209081526040808320938352929052206003015490565b61033a6103cf36600461561d565b607660209081526000938452604080852082529284528284209052825290205481565b6104056104003660046155b1565b610aa0565b6040519015158152602001610344565b6103606104233660046155b1565b610b02565b6104056104363660046155dc565b610e76565b6104056104493660046155b1565b6001600160a01b0391909116600090815260716020908152604080832093835292905220600201541590565b61033a6104833660046155b1565b607460209081526000928352604080842090915290825290205481565b61033a6104ae3660046155dc565b607560209081526000938452604080852082529284528284209052825290205481565b61033a6104df3660046155b1565b61119e565b6067546104fc9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610344565b6103606105223660046154ba565b6111cd565b6104fc6105353660046155b1565b6001600160a01b03918216600090815260716020908152604080832093835292905220541690565b6001546104fc906001600160a01b031681565b61033a61057e3660046155b1565b6112b9565b60345460ff16610405565b61033a61059c36600461561d565b6112fd565b61033a6105af366004615482565b606c6020526000908152604090205481565b61033a6105cf366004615482565b606d6020526000908152604090205481565b61033a6105ef3660046155b1565b6001600160a01b03919091166000908152607160209081526040808320938352929052206002015490565b6104056106283660046155b1565b61133b565b6104fc61063b366004615482565b6070602052600090815260409020546001600160a01b031681565b610360610664366004615482565b6113d2565b61036061152d565b61033a60685481565b610405610688366004615482565b61162a565b61033a61069b366004615482565b606e6020526000908152604090205481565b6106c06106bb3660046155b1565b6116c5565b604051610344919061586c565b6103606106db3660046154f2565b6117fa565b6104fc6106ee3660046156ab565b6069602052600090815260409020546001600160a01b031681565b6000546104fc906201000090046001600160a01b031681565b6107356107303660046155b1565b6122f5565b60405161034491906157f5565b6107556107503660046155b1565b61236a565b604051610344959493929190615791565b61033a610774366004615482565b606a6020526000908152604090205481565b61033a6107943660046155b1565b61243b565b61033a6107a7366004615482565b606b6020526000908152604090205481565b6104056107c7366004615482565b6124f2565b6103606107da366004615482565b61250f565b6107f26107ed3660046155b1565b6125bf565b6040516103449190615839565b61033a61080d366004615482565b6001600160a01b03166000908152606e602052604090205490565b610360610836366004615482565b612670565b610405610849366004615482565b612789565b61036061085c366004615482565b6127e4565b61036061086f366004615482565b612a37565b610360610882366004615482565b612b5a565b610360612c00565b61036061089d366004615651565b612c5e565b6104056108b0366004615482565b606f6020526000908152604090205460ff1681565b61033a6108d33660046155dc565b61363b565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff161561099f5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b606482015260840161092a565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b60736020528260005260406000206020528160005260406000208160078110610a4057600080fd5b0154925083915050565b610a526136e0565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915281206002015460031480610afb57506001600160a01b03831660009081526071602090815260408083208584529091529020600201546006145b9392505050565b60345460ff1615610b485760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b610b53828233610e76565b610b925760405162461bcd60e51b815260206004820152601060248201526f2ab730b13632903a379031b630b4b69760811b604482015260640161092a565b60675460405163fbdec41360e01b81526001600160a01b0384811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061568b565b15610c6e576001600160a01b0382166000908152606e60209081526040808320839055606c90915290819020829055516000805160206159b083398151915290610c6590849084906006906157d4565b60405180910390a15b606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbc57600080fd5b505afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf4919061549e565b6001600160a01b031663403b14128333606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5257600080fd5b505afa158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061549e565b6040516380af208b60e01b81526001600160a01b03888116600483015233602483015291909116906380af208b9060440160206040518083038186803b158015610dd357600080fd5b505afa158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b91906156c3565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050505050565b606754604051633761c52760e11b81526001600160a01b03858116600483015260009261010090041690636ec38a4e9060240160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef9919061568b565b8015610f1d57506001600160a01b0384166000908152606b60205260409020548311155b8015610fec57506001600160a01b0384166000908152606f602052604090205460ff1680610f6357506001600160a01b0384166000908152606d60205260409020548311155b80610fec575060675460405163fbdec41360e01b81526001600160a01b0386811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610fb457600080fd5b505afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec919061568b565b801561101f57506001600160a01b0384811660009081526071602090815260408083208784529091529020548116908316145b801561104f57506001600160a01b0384166000908152607160209081526040808320868452909152902060020154155b801561107357506001600160a01b0384166000908152606c60205260409020548314155b801561118757506000606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611102919061549e565b6040516380af208b60e01b81526001600160a01b038781166004830152858116602483015291909116906380af208b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118591906156c3565b115b1561119457506001610afb565b5060009392505050565b6001600160a01b0382166000908152607260209081526040808320848452909152812054610afb90600161375a565b600054610100900460ff166111e85760005460ff16156111ec565b303b155b61124f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092a565b600054610100900460ff16158015611271576000805461ffff19166101011790555b61127a836108d8565b611282612c00565b60678054610100600160a81b0319166101006001600160a01b0385160217905580156112b4576000805461ff00191690555b505050565b6000610afb6112c8848461243b565b6001600160a01b03851660009081526072602090815260408083208784529091529020546112f790600161375a565b9061375a565b6072602052826000526040600020602052816000526040600020818154811061132557600080fd5b9060005260206000200160009250925050505481565b6001600160a01b0382166000908152606f602052604081205460ff168061137a57506001600160a01b0383166000908152606d60205260409020548211155b80156113aa57506001600160a01b0383166000908152607160209081526040808320858452909152902060020154155b8015610afb5750506001600160a01b03919091166000908152606c6020526040902054141590565b6113da6136e0565b6113e3816124f2565b6113ff5760405162461bcd60e51b815260040161092a9061584c565b606880546000908152606960208181526040808420546001600160a01b038781168652606a8085528387208054885286865284882080546001600160a01b0319169484169490941790935591548754875294845282862054168552909152909120555461146d90600161375a565b6068556001600160a01b038181166000818152606a6020526040808220919091556067549051631404a95d60e11b8152600481019290925261010090049091169063280952ba90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f86d1787a7c5d5a35ae49625fd6b646c884e5449312f20d0068fba244a8c657bb9350019050610a0d565b6001546001600160a01b031633146115a55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b606482015260840161092a565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b6001600160a01b0381166000908152606f602052604081205460ff161580156116bf5750816001600160a01b031663a9daaed56040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061568b565b92915050565b6117026040518060a0016040528060006001600160a01b031681526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b038084166000908152607160209081526040808320868452825291829020825160a08101909352805490931682526001830180549293929184019161174d90615915565b80601f016020809104026020016040519081016040528092919081815260200182805461177990615915565b80156117c65780601f1061179b576101008083540402835291602001916117c6565b820191906000526020600020905b8154815290600101906020018083116117a957829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b60345460ff16156118405760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561188b57600080fd5b505afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c3919061568b565b6118fc5760405162461bcd60e51b815260206004820152600a6024820152694e6f742041637469766560b01b604482015260640161092a565b61190582612789565b156119485760405162461bcd60e51b8152602060048201526013602482015272436c6f73656420666f7220646973707574657360681b604482015260640161092a565b60675460405163677755bb60e01b81526001600160a01b03848116600483015233926101009004169063677755bb9060240160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca919061549e565b6001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601760248201527f43726561746f722063616e206e6f742064697370757465000000000000000000604482015260640161092a565b611a2a336124f2565b15611a6d5760405162461bcd60e51b815260206004820152601360248201527227a19031b0b7103737ba103234b9b83aba329760691b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade91906156c3565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b64919061549e565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611ba557600080fd5b505afa158015611bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdd91906156c3565b1015611c245760405162461bcd60e51b81526020600482015260166024820152754c6f7720616d6f756e7420666f72206469737075746560501b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9591906156c3565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce357600080fd5b505afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b919061549e565b6001600160a01b031663dd62ed3e33606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061549e565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e91906156c3565b1015611e6c5760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b604482015260640161092a565b604051602001611e8790602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001611eae9190615839565b604051602081830303815290604052805190602001201415611f0b5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206469737075746520737472696e6760501b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b031663592740b26040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9191906156c3565b81511080611fa05750606e8151105b611fe45760405162461bcd60e51b81526020600482015260156024820152740a6e8e4d2dcce40caf0c6cacac8e640d8cadccee8d605b1b604482015260640161092a565b6001600160a01b0382166000908152606b6020526040902054612008906001613766565b6001600160a01b0383166000908152606b6020908152604080832093909355606e90522054612038906001613766565b6001600160a01b0383166000908152606e602090815260408083209390935560718152828220606b82528383208054845281835284842080546001600160a01b031916331790555483528152919020825161209c92600192909201918401906153af565b506001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020426003909101556068546120dc9060016158c6565b67ffffffffffffffff81111561210257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561212b578160200160208202803683370190505b506001600160a01b0383166000908152607260209081526040808320606b8352818420548452825290912082516121689391929190910190615433565b50816001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da919061568b565b612217576001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020600401805460ff191660011790555b60675460405163019e079960e61b81526001600160a01b03848116600483015233602483015261010090920490911690636781e64090604401600060405180830381600087803b15801561226a57600080fd5b505af115801561227e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152607160209081526040808320606b8352818420548452909152908190206004015490517ffd91eaa9167cff43800cbd454f3b6fb7051298a311ed47ec4f7fcf2c5a78738792506122e9918591859160ff16903390615756565b60405180910390a15050565b6001600160a01b038216600090815260726020908152604080832084845282529182902080548351818402810184019094528084526060939283018282801561235d57602002820191906000526020600020905b815481526020019060010190808311612349575b5050505050905092915050565b6071602090815260009283526040808420909152908252902080546001820180546001600160a01b0390921692916123a190615915565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd90615915565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b50505050600283015460038401546004909401549293909290915060ff1685565b60008060015b6001600160a01b03851660009081526072602090815260408083208784529091529020548110156124ea576001600160a01b038516600090815260726020908152604080832087845290915281208054839081106124af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154116124c65760006124c9565b60015b6124d69060ff16836158c6565b9150806124e281615950565b915050612441565b509392505050565b6001600160a01b03166000908152606a6020526040902054151590565b6125176136e0565b6001600160a01b0381166000908152606f602052604090205460ff1661256e5760405162461bcd60e51b815260206004820152600c60248201526b4f70656e20616c726561647960a01b604482015260640161092a565b6001600160a01b0381166000818152606f6020908152604091829020805460ff1916905590519182527fba1dc3bb562a92f019150e93749bcdeeb5d64787f37a856f4563f38a12877b0e9101610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915290206001018054606091906125f490615915565b80601f016020809104026020016040519081016040528092919081815260200182805461262090615915565b801561235d5780601f106126425761010080835404028352916020019161235d565b820191906000526020600020905b815481529060010190602001808311612650575093979650505050505050565b6126786136e0565b6001600160a01b0381166126c05760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b600154600160a81b900460ff16156127105760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b604482015260640161092a565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a0d565b6001600160a01b0381166000908152606f602052604081205460ff16806116bf5750816001600160a01b0316631897c8fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b6127ec6136e0565b6001600160a01b0381166128355760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b2323932b9b99760811b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b0316634d736d586040518163ffffffff1660e01b815260040160206040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb91906156c3565b60685411156129025760405162461bcd60e51b815260206004820152601360248201527213d0c81b595b58995c9cc8195e18d959591959606a1b604482015260640161092a565b61290b816124f2565b156129455760405162461bcd60e51b815260206004820152600a602482015269416c7265616479204f4360b01b604482015260640161092a565b606854612953906001613766565b6068818155600091825260696020908152604080842080546001600160a01b0319166001600160a01b038781169182179092559354848652606a9093529381902091909155606754905163a193687f60e01b8152600481019290925261010090049091169063a193687f90602401600060405180830381600087803b1580156129db57600080fd5b505af11580156129ef573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f7b669209e50faed123ff5edb840280b4529293d7408675dbe630eb19cc12e5bb9350019050610a0d565b6000546201000090046001600160a01b0316331480612a65575060675461010090046001600160a01b031633145b612aa65760405162461bcd60e51b815260206004820152601260248201527127b7363c9036b0b730b3b2b917b7bbb732b960711b604482015260640161092a565b6001600160a01b0381166000908152606f602052604090205460ff1615612b005760405162461bcd60e51b815260206004820152600e60248201526d436c6f73656420616c726561647960901b604482015260640161092a565b6001600160a01b0381166000818152606f60209081526040808320805460ff191660011790558051938452908301919091527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c59101610a0d565b612b626136e0565b6001600160a01b038116612baa5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f23e455350850b05998316f502175b427a275f4d5be9e2a04d530ea39239e1b6f90602001610a0d565b60675460ff1615612c495760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161092a565b6067805460ff19166001908117909155606655565b612c67336124f2565b612c835760405162461bcd60e51b815260040161092a9061584c565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015612cce57600080fd5b505afa158015612ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d06919061568b565b612d475760405162461bcd60e51b81526020600482015260126024820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604482015260640161092a565b612d5084612789565b15612d945760405162461bcd60e51b815260206004820152601460248201527321b637b9b2b2103337b9103234b9b83aba32b99760611b604482015260640161092a565b60008311612ddb5760405162461bcd60e51b8152602060048201526014602482015273111a5cdc1d5d19481b9bdb88195e1a5cdd195b9d60621b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206002015415612e415760405162461bcd60e51b815260206004820152600f60248201526e2234b9b83aba329031b637b9b2b21760891b604482015260640161092a565b60078211158015612e525750600082115b612e965760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103234b9b83aba329031b7b2329760591b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206004015460ff1615612f0a5760048210612f055760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21031b7b2329760991b604482015260640161092a565b612fb6565b6004821015612f5b5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f646520696e206d617475726974790000000000000000604482015260640161092a565b6001600160a01b0384166000908152606d60205260409020548311612fb65760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818d85b98d95b1b1959607a1b604482015260640161092a565b600081118015612fc65750600482145b156132a057836001600160a01b0316632486d6716040518163ffffffff1660e01b815260040160206040518083038186803b15801561300457600080fd5b505afa158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c91906156c3565b81141561309d5760405162461bcd60e51b815260206004820152602960248201527f4f432063616e206e6f7420766f746520666f7220746865207265736f6c766564604482015268103837b9b4ba34b7b760b91b606482015260840161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020548114156131105760405162461bcd60e51b815260206004820152601560248201527429b0b6b2903bb4b73734b733903837b9b4ba34b7b760591b604482015260640161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020546131c3576001600160a01b03841660008181526075602090815260408083208784528252808320338452825280832085905592825260768152828220868352815282822084835290522054613192906001613766565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020556132a0565b6001600160a01b038416600081815260766020908152604080832087845282528083209383526075825280832087845282528083203384528252808320548352929052205461321390600161375a565b6001600160a01b038516600081815260766020908152604080832088845282528083209383526075825280832088845282528083203384528252808320805484529390915280822093909355908390558281522054613273906001613766565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a909252822054815481106132ec57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115613423576001600160a01b03841660008181526073602090815260408083208784528252808320938352607282528083208784528252808320338452606a9092529091205481546133989360019390929091811061336757634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061339057634e487b7160e01b600052603260045260246000fd5b01549061375a565b6001600160a01b03851660008181526073602090815260408083208884528252808320938352607282528083208884528252808320338452606a90925290912054815481106133f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061342057634e487b7160e01b600052603260045260246000fd5b01555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a90925290912054815484929190811061347457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152607382526040808220868352909252206134cf9060019084600781106134c757634e487b7160e01b600052603260045260246000fd5b015490613766565b6001600160a01b03851660009081526073602090815260408083208784529091529020836007811061351157634e487b7160e01b600052603260045260246000fd5b0155604080516001600160a01b038616815260208101859052908101839052606081018290523360808201527fe5a4e79fc191615470d7a161db08d0e2f18b21da5df60451d35a2fcac7524a8e9060a00160405180910390a1606854613578906002613772565b6001600160a01b0385166000908152607360209081526040808320878452909152902083600781106135ba57634e487b7160e01b600052603260045260246000fd5b0154111561363557600482141561362a576000806135d8868661377e565b60685491935091506135eb906002613772565b821115613623576001600160a01b03861660009081526074602090815260408083208884529091529020819055613623868686613881565b5050613635565b613635848484613881565b50505050565b6000613646826124f2565b156136ac576001600160a01b03808516600090815260726020908152604080832087845282528083209386168352606a9091529020548154811061369a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050610afb565b6136b5826124f2565b6136d15760405162461bcd60e51b815260040161092a9061584c565b50670de0b6b3a7640000610afb565b6000546201000090046001600160a01b031633146137585760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b606482015260840161092a565b565b6000610afb82846158fe565b6000610afb82846158c6565b6000610afb82846158de565b60008060008060005b866001600160a01b031663e7702d056040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c057600080fd5b505afa1580156137d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f891906156c3565b8111613875576001600160a01b03871660009081526076602090815260408083208984528252808320848452909152902054831015613863576001600160a01b0387166000908152607660209081526040808320898452825280832084845290915290205492509050805b8061386d81615950565b915050613787565b50909590945092505050565b60016066600082825461389491906158c6565b90915550506066546001600160a01b0384166000908152607160209081526040808320868452909152902060020154156139015760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4818db1bdcd95960921b604482015260640161092a565b600082116139425760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b604482015260640161092a565b6001600160a01b03841660008181526071602090815260408083208784528252808320600201869055928252606e9052205461397f5760006139a3565b6001600160a01b0384166000908152606e60205260409020546139a390600161375a565b6001600160a01b0385166000908152606e602052604090205560038214806139cb5750600682145b15613d1757606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015613a1e57600080fd5b505afa158015613a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a56919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613ab357600080fd5b505afa158015613ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aeb919061549e565b876001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2457600080fd5b505afa158015613b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5c91906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613baa959493926067921690600401615726565b600060405180830381600087803b158015613bc457600080fd5b505af1158015613bd8573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606c60205260409020849055506006821415613c6657606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613c4d57600080fd5b505af1158015613c61573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152606e6020526040902054613ce9576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015613cd057600080fd5b505af1158015613ce4573d6000803e3d6000fd5b505050505b6000805160206159b0833981519152848484604051613d0a939291906157d4565b60405180910390a161535e565b600182141561437657606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613d6d57600080fd5b505af1158015613d81573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b158015613e3757600080fd5b505af1158015613e4b573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eea919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4757600080fd5b505afa158015613f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7f919061549e565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b158015613fb857600080fd5b505afa158015613fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff091906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b16815261403e959493926065921690600401615726565b600060405180830381600087803b15801561405857600080fd5b505af115801561406c573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156140be57600080fd5b505afa1580156140d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f6919061549e565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936142809363b0092db792600480840193829003018186803b15801561415d57600080fd5b505afa158015614171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419591906156c3565b6112f78a6001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b1580156141d157600080fd5b505afa1580156141e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420991906156c3565b8b6001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b15801561424257600080fd5b505afa158015614256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427a91906156c3565b90613766565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526142ce959493926068921690600401615726565b600060405180830381600087803b1580156142e857600080fd5b505af11580156142fc573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606c6020908152604091829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591015b60405180910390a16000805160206159b0833981519152848484604051613d0a939291906157d4565b600282141561494c57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b1580156143cc57600080fd5b505af11580156143e0573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b15801561443157600080fd5b505af1158015614445573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b15801561449657600080fd5b505af11580156144aa573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b15801561451157600080fd5b505afa158015614525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614549919061549e565b60675460405163677755bb60e01b81526001600160a01b038781166004830152928316926327b153a09288926101009091049091169063677755bb9060240160206040518083038186803b1580156145a057600080fd5b505afa1580156145b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145d8919061549e565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b15801561461157600080fd5b505afa158015614625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061464991906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614697959493926065921690600401615726565b600060405180830381600087803b1580156146b157600080fd5b505af11580156146c5573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561471757600080fd5b505afa15801561472b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474f919061549e565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b1580156147b557600080fd5b505afa1580156147c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147ed91906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b16815261483b959493926067921690600401615726565b600060405180830381600087803b15801561485557600080fd5b505af1158015614869573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526071602090815260408083208b845282529182902054825163465591f960e01b815292516101009096048516975063b33e3afb96508b9594169363465591f9926004808201939291829003018186803b1580156148da57600080fd5b505afa1580156148ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491291906156c3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016142ce565b6004821415614eb857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b1580156149a257600080fd5b505af11580156149b6573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015614a0757600080fd5b505af1158015614a1b573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526074602090815260408083208b84529091529081902054905163b91f5e3560e01b81526004810192909252602482015261010090920416925063b91f5e359150604401600060405180830381600087803b158015614a8d57600080fd5b505af1158015614aa1573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614af357600080fd5b505afa158015614b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b2b919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8857600080fd5b505afa158015614b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc0919061549e565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b158015614bf957600080fd5b505afa158015614c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3191906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614c7f959493926066921690600401615726565b600060405180830381600087803b158015614c9957600080fd5b505af1158015614cad573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614cff57600080fd5b505afa158015614d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d37919061549e565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b158015614d9d57600080fd5b505afa158015614db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd591906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614e23959493926067921690600401615726565b600060405180830381600087803b158015614e3d57600080fd5b505af1158015614e51573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606f60209081526040808320805460ff19166001179055606c825291829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c5910161434d565b600582141561535e576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015614f0e57600080fd5b505af1158015614f22573d6000803e3d6000fd5b50506067546040516304268b7560e31b81526001600160a01b03888116600483015261010090920490911692506321345ba89150602401600060405180830381600087803b158015614f7357600080fd5b505af1158015614f87573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614fd957600080fd5b505afa158015614fed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615011919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b15801561506e57600080fd5b505afa158015615082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150a6919061549e565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b1580156150df57600080fd5b505afa1580156150f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061511791906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152615165959493926066921690600401615726565b600060405180830381600087803b15801561517f57600080fd5b505af1158015615193573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156151e557600080fd5b505afa1580156151f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061521d919061549e565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936152849363b0092db792600480840193829003018186803b15801561415d57600080fd5b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526152d2959493926069921690600401615726565b600060405180830381600087803b1580156152ec57600080fd5b505af1158015615300573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606b6020908152604080832054606d835281842055606e8252808320839055606c90915290819020859055516000805160206159b08339815191529150613d0a908690869086906157d4565b60665481146136355760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161092a565b8280546153bb90615915565b90600052602060002090601f0160209004810192826153dd5760008555615423565b82601f106153f657805160ff1916838001178555615423565b82800160010185558215615423579182015b82811115615423578251825591602001919060010190615408565b5061542f92915061546d565b5090565b8280548282559060005260206000209081019282156154235791602002820182811115615423578251825591602001919060010190615408565b5b8082111561542f576000815560010161546e565b600060208284031215615493578081fd5b8135610afb81615997565b6000602082840312156154af578081fd5b8151610afb81615997565b600080604083850312156154cc578081fd5b82356154d781615997565b915060208301356154e781615997565b809150509250929050565b60008060408385031215615504578182fd5b823561550f81615997565b9150602083013567ffffffffffffffff8082111561552b578283fd5b818501915085601f83011261553e578283fd5b81358181111561555057615550615981565b604051601f8201601f19908116603f0116810190838211818310171561557857615578615981565b81604052828152886020848701011115615590578586fd5b82602086016020830137856020848301015280955050505050509250929050565b600080604083850312156155c3578182fd5b82356155ce81615997565b946020939093013593505050565b6000806000606084860312156155f0578081fd5b83356155fb81615997565b925060208401359150604084013561561281615997565b809150509250925092565b600080600060608486031215615631578283fd5b833561563c81615997565b95602085013595506040909401359392505050565b60008060008060808587031215615666578081fd5b843561567181615997565b966020860135965060408601359560600135945092505050565b60006020828403121561569c578081fd5b81518015158114610afb578182fd5b6000602082840312156156bc578081fd5b5035919050565b6000602082840312156156d4578081fd5b5051919050565b60008151808452815b81811015615700576020818501810151868301820152016156e4565b818111156157115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b600060018060a01b0380871683526080602084015261577860808401876156db565b9415156040840152929092166060909101525092915050565b6001600160a01b038616815260a0602082018190526000906157b5908301876156db565b6040830195909552506060810192909252151560809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561582d57835183529284019291840191600101615811565b50909695505050505050565b602081526000610afb60208301846156db565b6020808252600690820152654e6f74204f4360d01b604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061589a60c08401826156db565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b600082198211156158d9576158d961596b565b500190565b6000826158f957634e487b7160e01b81526012600452602481fd5b500490565b6000828210156159105761591061596b565b500390565b600181811c9082168061592957607f821691505b6020821081141561594a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156159645761596461596b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146159ac57600080fd5b5056fe22030d24c56fdfb5edf6a4fc074d3ae64f4a1de374968f0a0871f9fa5d494c4ea26469706673582212207a2950445802c7bd067be3afc40b322ee15cef09b51c88f48d0cfd42d2e4cbc064736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806379ba50971161019d578063a8cca32a116100e9578063c69d81d7116100a2578063ebc797721161007c578063ebc7977214610887578063eee7b0c11461088f578063f48bb534146108a2578063f68246ce146108c557600080fd5b8063c69d81d71461084e578063cf65e30f14610861578063d82aff111461087457600080fd5b8063a8cca32a146107b9578063aa7839e8146107cc578063b35bf5db146107df578063c3b2b6e4146107ff578063c3b83f5f14610828578063c63011b21461083b57600080fd5b80638a6ef9841161015657806395e7f02d1161013057806395e7f02d146107425780639906a1f514610766578063a24536f914610786578063a6182c981461079957600080fd5b80638a6ef984146106e05780638da5cb5b14610709578063944450391461072257600080fd5b806379ba5097146106695780637b6cfe9d146106715780637bd72d811461067a578063815feffd1461068d578063876ae352146106ad57806389c0b25c146106cd57600080fd5b806341ed2c121161025c578063677445471161021557806371dba48d116101ef57806371dba48d146105e15780637210cceb1461061a57806375969e321461062d57806375e2570b1461065657600080fd5b8063677445471461058e5780636cd431dd146105a157806371720212146105c157600080fd5b806341ed2c12146104e4578063485cc955146105145780634ee05dd61461052757806353a47bb71461055d578063580a913d146105705780635c975abb1461058357600080fd5b806322cdda1a116102c95780633878970f116102a35780633878970f1461043b57806339672ba3146104755780633baebf43146104a05780633c794933146104d157600080fd5b806322cdda1a146103f25780632db4c70814610415578063380d96221461042857600080fd5b8063084739e41461031157806313af40351461034d57806314ec9a1f146103625780631627540c146103755780631eb4370a1461038857806320564334146103c1575b600080fd5b61033a61031f366004615482565b6001600160a01b03166000908152606c602052604090205490565b6040519081526020015b60405180910390f35b61036061035b366004615482565b6108d8565b005b61033a61037036600461561d565b610a18565b610360610383366004615482565b610a4a565b61033a6103963660046155b1565b6001600160a01b03919091166000908152607160209081526040808320938352929052206003015490565b61033a6103cf36600461561d565b607660209081526000938452604080852082529284528284209052825290205481565b6104056104003660046155b1565b610aa0565b6040519015158152602001610344565b6103606104233660046155b1565b610b02565b6104056104363660046155dc565b610e76565b6104056104493660046155b1565b6001600160a01b0391909116600090815260716020908152604080832093835292905220600201541590565b61033a6104833660046155b1565b607460209081526000928352604080842090915290825290205481565b61033a6104ae3660046155dc565b607560209081526000938452604080852082529284528284209052825290205481565b61033a6104df3660046155b1565b61119e565b6067546104fc9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610344565b6103606105223660046154ba565b6111cd565b6104fc6105353660046155b1565b6001600160a01b03918216600090815260716020908152604080832093835292905220541690565b6001546104fc906001600160a01b031681565b61033a61057e3660046155b1565b6112b9565b60345460ff16610405565b61033a61059c36600461561d565b6112fd565b61033a6105af366004615482565b606c6020526000908152604090205481565b61033a6105cf366004615482565b606d6020526000908152604090205481565b61033a6105ef3660046155b1565b6001600160a01b03919091166000908152607160209081526040808320938352929052206002015490565b6104056106283660046155b1565b61133b565b6104fc61063b366004615482565b6070602052600090815260409020546001600160a01b031681565b610360610664366004615482565b6113d2565b61036061152d565b61033a60685481565b610405610688366004615482565b61162a565b61033a61069b366004615482565b606e6020526000908152604090205481565b6106c06106bb3660046155b1565b6116c5565b604051610344919061586c565b6103606106db3660046154f2565b6117fa565b6104fc6106ee3660046156ab565b6069602052600090815260409020546001600160a01b031681565b6000546104fc906201000090046001600160a01b031681565b6107356107303660046155b1565b6122f5565b60405161034491906157f5565b6107556107503660046155b1565b61236a565b604051610344959493929190615791565b61033a610774366004615482565b606a6020526000908152604090205481565b61033a6107943660046155b1565b61243b565b61033a6107a7366004615482565b606b6020526000908152604090205481565b6104056107c7366004615482565b6124f2565b6103606107da366004615482565b61250f565b6107f26107ed3660046155b1565b6125bf565b6040516103449190615839565b61033a61080d366004615482565b6001600160a01b03166000908152606e602052604090205490565b610360610836366004615482565b612670565b610405610849366004615482565b612789565b61036061085c366004615482565b6127e4565b61036061086f366004615482565b612a37565b610360610882366004615482565b612b5a565b610360612c00565b61036061089d366004615651565b612c5e565b6104056108b0366004615482565b606f6020526000908152604090205460ff1681565b61033a6108d33660046155dc565b61363b565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff161561099f5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b606482015260840161092a565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b60736020528260005260406000206020528160005260406000208160078110610a4057600080fd5b0154925083915050565b610a526136e0565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915281206002015460031480610afb57506001600160a01b03831660009081526071602090815260408083208584529091529020600201546006145b9392505050565b60345460ff1615610b485760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b610b53828233610e76565b610b925760405162461bcd60e51b815260206004820152601060248201526f2ab730b13632903a379031b630b4b69760811b604482015260640161092a565b60675460405163fbdec41360e01b81526001600160a01b0384811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061568b565b15610c6e576001600160a01b0382166000908152606e60209081526040808320839055606c90915290819020829055516000805160206159b083398151915290610c6590849084906006906157d4565b60405180910390a15b606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbc57600080fd5b505afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf4919061549e565b6001600160a01b031663403b14128333606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5257600080fd5b505afa158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061549e565b6040516380af208b60e01b81526001600160a01b03888116600483015233602483015291909116906380af208b9060440160206040518083038186803b158015610dd357600080fd5b505afa158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b91906156c3565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050505050565b606754604051633761c52760e11b81526001600160a01b03858116600483015260009261010090041690636ec38a4e9060240160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef9919061568b565b8015610f1d57506001600160a01b0384166000908152606b60205260409020548311155b8015610fec57506001600160a01b0384166000908152606f602052604090205460ff1680610f6357506001600160a01b0384166000908152606d60205260409020548311155b80610fec575060675460405163fbdec41360e01b81526001600160a01b0386811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610fb457600080fd5b505afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec919061568b565b801561101f57506001600160a01b0384811660009081526071602090815260408083208784529091529020548116908316145b801561104f57506001600160a01b0384166000908152607160209081526040808320868452909152902060020154155b801561107357506001600160a01b0384166000908152606c60205260409020548314155b801561118757506000606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611102919061549e565b6040516380af208b60e01b81526001600160a01b038781166004830152858116602483015291909116906380af208b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118591906156c3565b115b1561119457506001610afb565b5060009392505050565b6001600160a01b0382166000908152607260209081526040808320848452909152812054610afb90600161375a565b600054610100900460ff166111e85760005460ff16156111ec565b303b155b61124f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092a565b600054610100900460ff16158015611271576000805461ffff19166101011790555b61127a836108d8565b611282612c00565b60678054610100600160a81b0319166101006001600160a01b0385160217905580156112b4576000805461ff00191690555b505050565b6000610afb6112c8848461243b565b6001600160a01b03851660009081526072602090815260408083208784529091529020546112f790600161375a565b9061375a565b6072602052826000526040600020602052816000526040600020818154811061132557600080fd5b9060005260206000200160009250925050505481565b6001600160a01b0382166000908152606f602052604081205460ff168061137a57506001600160a01b0383166000908152606d60205260409020548211155b80156113aa57506001600160a01b0383166000908152607160209081526040808320858452909152902060020154155b8015610afb5750506001600160a01b03919091166000908152606c6020526040902054141590565b6113da6136e0565b6113e3816124f2565b6113ff5760405162461bcd60e51b815260040161092a9061584c565b606880546000908152606960208181526040808420546001600160a01b038781168652606a8085528387208054885286865284882080546001600160a01b0319169484169490941790935591548754875294845282862054168552909152909120555461146d90600161375a565b6068556001600160a01b038181166000818152606a6020526040808220919091556067549051631404a95d60e11b8152600481019290925261010090049091169063280952ba90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f86d1787a7c5d5a35ae49625fd6b646c884e5449312f20d0068fba244a8c657bb9350019050610a0d565b6001546001600160a01b031633146115a55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b606482015260840161092a565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b6001600160a01b0381166000908152606f602052604081205460ff161580156116bf5750816001600160a01b031663a9daaed56040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061568b565b92915050565b6117026040518060a0016040528060006001600160a01b031681526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b038084166000908152607160209081526040808320868452825291829020825160a08101909352805490931682526001830180549293929184019161174d90615915565b80601f016020809104026020016040519081016040528092919081815260200182805461177990615915565b80156117c65780601f1061179b576101008083540402835291602001916117c6565b820191906000526020600020905b8154815290600101906020018083116117a957829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b60345460ff16156118405760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561188b57600080fd5b505afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c3919061568b565b6118fc5760405162461bcd60e51b815260206004820152600a6024820152694e6f742041637469766560b01b604482015260640161092a565b61190582612789565b156119485760405162461bcd60e51b8152602060048201526013602482015272436c6f73656420666f7220646973707574657360681b604482015260640161092a565b60675460405163677755bb60e01b81526001600160a01b03848116600483015233926101009004169063677755bb9060240160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca919061549e565b6001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601760248201527f43726561746f722063616e206e6f742064697370757465000000000000000000604482015260640161092a565b611a2a336124f2565b15611a6d5760405162461bcd60e51b815260206004820152601360248201527227a19031b0b7103737ba103234b9b83aba329760691b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade91906156c3565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b64919061549e565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611ba557600080fd5b505afa158015611bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdd91906156c3565b1015611c245760405162461bcd60e51b81526020600482015260166024820152754c6f7720616d6f756e7420666f72206469737075746560501b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9591906156c3565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce357600080fd5b505afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b919061549e565b6001600160a01b031663dd62ed3e33606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061549e565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e91906156c3565b1015611e6c5760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b604482015260640161092a565b604051602001611e8790602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001611eae9190615839565b604051602081830303815290604052805190602001201415611f0b5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206469737075746520737472696e6760501b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b031663592740b26040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9191906156c3565b81511080611fa05750606e8151105b611fe45760405162461bcd60e51b81526020600482015260156024820152740a6e8e4d2dcce40caf0c6cacac8e640d8cadccee8d605b1b604482015260640161092a565b6001600160a01b0382166000908152606b6020526040902054612008906001613766565b6001600160a01b0383166000908152606b6020908152604080832093909355606e90522054612038906001613766565b6001600160a01b0383166000908152606e602090815260408083209390935560718152828220606b82528383208054845281835284842080546001600160a01b031916331790555483528152919020825161209c92600192909201918401906153af565b506001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020426003909101556068546120dc9060016158c6565b67ffffffffffffffff81111561210257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561212b578160200160208202803683370190505b506001600160a01b0383166000908152607260209081526040808320606b8352818420548452825290912082516121689391929190910190615433565b50816001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da919061568b565b612217576001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020600401805460ff191660011790555b60675460405163019e079960e61b81526001600160a01b03848116600483015233602483015261010090920490911690636781e64090604401600060405180830381600087803b15801561226a57600080fd5b505af115801561227e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152607160209081526040808320606b8352818420548452909152908190206004015490517ffd91eaa9167cff43800cbd454f3b6fb7051298a311ed47ec4f7fcf2c5a78738792506122e9918591859160ff16903390615756565b60405180910390a15050565b6001600160a01b038216600090815260726020908152604080832084845282529182902080548351818402810184019094528084526060939283018282801561235d57602002820191906000526020600020905b815481526020019060010190808311612349575b5050505050905092915050565b6071602090815260009283526040808420909152908252902080546001820180546001600160a01b0390921692916123a190615915565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd90615915565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b50505050600283015460038401546004909401549293909290915060ff1685565b60008060015b6001600160a01b03851660009081526072602090815260408083208784529091529020548110156124ea576001600160a01b038516600090815260726020908152604080832087845290915281208054839081106124af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154116124c65760006124c9565b60015b6124d69060ff16836158c6565b9150806124e281615950565b915050612441565b509392505050565b6001600160a01b03166000908152606a6020526040902054151590565b6125176136e0565b6001600160a01b0381166000908152606f602052604090205460ff1661256e5760405162461bcd60e51b815260206004820152600c60248201526b4f70656e20616c726561647960a01b604482015260640161092a565b6001600160a01b0381166000818152606f6020908152604091829020805460ff1916905590519182527fba1dc3bb562a92f019150e93749bcdeeb5d64787f37a856f4563f38a12877b0e9101610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915290206001018054606091906125f490615915565b80601f016020809104026020016040519081016040528092919081815260200182805461262090615915565b801561235d5780601f106126425761010080835404028352916020019161235d565b820191906000526020600020905b815481529060010190602001808311612650575093979650505050505050565b6126786136e0565b6001600160a01b0381166126c05760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b600154600160a81b900460ff16156127105760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b604482015260640161092a565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a0d565b6001600160a01b0381166000908152606f602052604081205460ff16806116bf5750816001600160a01b0316631897c8fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b6127ec6136e0565b6001600160a01b0381166128355760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b2323932b9b99760811b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b0316634d736d586040518163ffffffff1660e01b815260040160206040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb91906156c3565b60685411156129025760405162461bcd60e51b815260206004820152601360248201527213d0c81b595b58995c9cc8195e18d959591959606a1b604482015260640161092a565b61290b816124f2565b156129455760405162461bcd60e51b815260206004820152600a602482015269416c7265616479204f4360b01b604482015260640161092a565b606854612953906001613766565b6068818155600091825260696020908152604080842080546001600160a01b0319166001600160a01b038781169182179092559354848652606a9093529381902091909155606754905163a193687f60e01b8152600481019290925261010090049091169063a193687f90602401600060405180830381600087803b1580156129db57600080fd5b505af11580156129ef573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f7b669209e50faed123ff5edb840280b4529293d7408675dbe630eb19cc12e5bb9350019050610a0d565b6000546201000090046001600160a01b0316331480612a65575060675461010090046001600160a01b031633145b612aa65760405162461bcd60e51b815260206004820152601260248201527127b7363c9036b0b730b3b2b917b7bbb732b960711b604482015260640161092a565b6001600160a01b0381166000908152606f602052604090205460ff1615612b005760405162461bcd60e51b815260206004820152600e60248201526d436c6f73656420616c726561647960901b604482015260640161092a565b6001600160a01b0381166000818152606f60209081526040808320805460ff191660011790558051938452908301919091527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c59101610a0d565b612b626136e0565b6001600160a01b038116612baa5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f23e455350850b05998316f502175b427a275f4d5be9e2a04d530ea39239e1b6f90602001610a0d565b60675460ff1615612c495760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161092a565b6067805460ff19166001908117909155606655565b612c67336124f2565b612c835760405162461bcd60e51b815260040161092a9061584c565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015612cce57600080fd5b505afa158015612ce2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d06919061568b565b612d475760405162461bcd60e51b81526020600482015260126024820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604482015260640161092a565b612d5084612789565b15612d945760405162461bcd60e51b815260206004820152601460248201527321b637b9b2b2103337b9103234b9b83aba32b99760611b604482015260640161092a565b60008311612ddb5760405162461bcd60e51b8152602060048201526014602482015273111a5cdc1d5d19481b9bdb88195e1a5cdd195b9d60621b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206002015415612e415760405162461bcd60e51b815260206004820152600f60248201526e2234b9b83aba329031b637b9b2b21760891b604482015260640161092a565b60078211158015612e525750600082115b612e965760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103234b9b83aba329031b7b2329760591b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206004015460ff1615612f0a5760048210612f055760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21031b7b2329760991b604482015260640161092a565b612fb6565b6004821015612f5b5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f646520696e206d617475726974790000000000000000604482015260640161092a565b6001600160a01b0384166000908152606d60205260409020548311612fb65760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818d85b98d95b1b1959607a1b604482015260640161092a565b600081118015612fc65750600482145b156132a057836001600160a01b0316632486d6716040518163ffffffff1660e01b815260040160206040518083038186803b15801561300457600080fd5b505afa158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c91906156c3565b81141561309d5760405162461bcd60e51b815260206004820152602960248201527f4f432063616e206e6f7420766f746520666f7220746865207265736f6c766564604482015268103837b9b4ba34b7b760b91b606482015260840161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020548114156131105760405162461bcd60e51b815260206004820152601560248201527429b0b6b2903bb4b73734b733903837b9b4ba34b7b760591b604482015260640161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020546131c3576001600160a01b03841660008181526075602090815260408083208784528252808320338452825280832085905592825260768152828220868352815282822084835290522054613192906001613766565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020556132a0565b6001600160a01b038416600081815260766020908152604080832087845282528083209383526075825280832087845282528083203384528252808320548352929052205461321390600161375a565b6001600160a01b038516600081815260766020908152604080832088845282528083209383526075825280832088845282528083203384528252808320805484529390915280822093909355908390558281522054613273906001613766565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a909252822054815481106132ec57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115613423576001600160a01b03841660008181526073602090815260408083208784528252808320938352607282528083208784528252808320338452606a9092529091205481546133989360019390929091811061336757634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061339057634e487b7160e01b600052603260045260246000fd5b01549061375a565b6001600160a01b03851660008181526073602090815260408083208884528252808320938352607282528083208884528252808320338452606a90925290912054815481106133f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061342057634e487b7160e01b600052603260045260246000fd5b01555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a90925290912054815484929190811061347457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152607382526040808220868352909252206134cf9060019084600781106134c757634e487b7160e01b600052603260045260246000fd5b015490613766565b6001600160a01b03851660009081526073602090815260408083208784529091529020836007811061351157634e487b7160e01b600052603260045260246000fd5b0155604080516001600160a01b038616815260208101859052908101839052606081018290523360808201527fe5a4e79fc191615470d7a161db08d0e2f18b21da5df60451d35a2fcac7524a8e9060a00160405180910390a1606854613578906002613772565b6001600160a01b0385166000908152607360209081526040808320878452909152902083600781106135ba57634e487b7160e01b600052603260045260246000fd5b0154111561363557600482141561362a576000806135d8868661377e565b60685491935091506135eb906002613772565b821115613623576001600160a01b03861660009081526074602090815260408083208884529091529020819055613623868686613881565b5050613635565b613635848484613881565b50505050565b6000613646826124f2565b156136ac576001600160a01b03808516600090815260726020908152604080832087845282528083209386168352606a9091529020548154811061369a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050610afb565b6136b5826124f2565b6136d15760405162461bcd60e51b815260040161092a9061584c565b50670de0b6b3a7640000610afb565b6000546201000090046001600160a01b031633146137585760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b606482015260840161092a565b565b6000610afb82846158fe565b6000610afb82846158c6565b6000610afb82846158de565b60008060008060005b866001600160a01b031663e7702d056040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c057600080fd5b505afa1580156137d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f891906156c3565b8111613875576001600160a01b03871660009081526076602090815260408083208984528252808320848452909152902054831015613863576001600160a01b0387166000908152607660209081526040808320898452825280832084845290915290205492509050805b8061386d81615950565b915050613787565b50909590945092505050565b60016066600082825461389491906158c6565b90915550506066546001600160a01b0384166000908152607160209081526040808320868452909152902060020154156139015760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4818db1bdcd95960921b604482015260640161092a565b600082116139425760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b604482015260640161092a565b6001600160a01b03841660008181526071602090815260408083208784528252808320600201869055928252606e9052205461397f5760006139a3565b6001600160a01b0384166000908152606e60205260409020546139a390600161375a565b6001600160a01b0385166000908152606e602052604090205560038214806139cb5750600682145b15613d1757606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015613a1e57600080fd5b505afa158015613a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a56919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613ab357600080fd5b505afa158015613ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aeb919061549e565b876001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2457600080fd5b505afa158015613b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5c91906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613baa959493926067921690600401615726565b600060405180830381600087803b158015613bc457600080fd5b505af1158015613bd8573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606c60205260409020849055506006821415613c6657606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613c4d57600080fd5b505af1158015613c61573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152606e6020526040902054613ce9576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015613cd057600080fd5b505af1158015613ce4573d6000803e3d6000fd5b505050505b6000805160206159b0833981519152848484604051613d0a939291906157d4565b60405180910390a161535e565b600182141561437657606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613d6d57600080fd5b505af1158015613d81573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015613dd257600080fd5b505af1158015613de6573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b158015613e3757600080fd5b505af1158015613e4b573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b158015613eb257600080fd5b505afa158015613ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eea919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4757600080fd5b505afa158015613f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f7f919061549e565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b158015613fb857600080fd5b505afa158015613fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff091906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b16815261403e959493926065921690600401615726565b600060405180830381600087803b15801561405857600080fd5b505af115801561406c573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156140be57600080fd5b505afa1580156140d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f6919061549e565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936142809363b0092db792600480840193829003018186803b15801561415d57600080fd5b505afa158015614171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419591906156c3565b6112f78a6001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b1580156141d157600080fd5b505afa1580156141e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420991906156c3565b8b6001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b15801561424257600080fd5b505afa158015614256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427a91906156c3565b90613766565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526142ce959493926068921690600401615726565b600060405180830381600087803b1580156142e857600080fd5b505af11580156142fc573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606c6020908152604091829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591015b60405180910390a16000805160206159b0833981519152848484604051613d0a939291906157d4565b600282141561494c57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b1580156143cc57600080fd5b505af11580156143e0573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b15801561443157600080fd5b505af1158015614445573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b15801561449657600080fd5b505af11580156144aa573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b15801561451157600080fd5b505afa158015614525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614549919061549e565b60675460405163677755bb60e01b81526001600160a01b038781166004830152928316926327b153a09288926101009091049091169063677755bb9060240160206040518083038186803b1580156145a057600080fd5b505afa1580156145b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145d8919061549e565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b15801561461157600080fd5b505afa158015614625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061464991906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614697959493926065921690600401615726565b600060405180830381600087803b1580156146b157600080fd5b505af11580156146c5573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561471757600080fd5b505afa15801561472b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474f919061549e565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b1580156147b557600080fd5b505afa1580156147c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147ed91906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b16815261483b959493926067921690600401615726565b600060405180830381600087803b15801561485557600080fd5b505af1158015614869573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526071602090815260408083208b845282529182902054825163465591f960e01b815292516101009096048516975063b33e3afb96508b9594169363465591f9926004808201939291829003018186803b1580156148da57600080fd5b505afa1580156148ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491291906156c3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016142ce565b6004821415614eb857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b1580156149a257600080fd5b505af11580156149b6573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015614a0757600080fd5b505af1158015614a1b573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526074602090815260408083208b84529091529081902054905163b91f5e3560e01b81526004810192909252602482015261010090920416925063b91f5e359150604401600060405180830381600087803b158015614a8d57600080fd5b505af1158015614aa1573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614af357600080fd5b505afa158015614b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b2b919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8857600080fd5b505afa158015614b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc0919061549e565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b158015614bf957600080fd5b505afa158015614c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3191906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614c7f959493926066921690600401615726565b600060405180830381600087803b158015614c9957600080fd5b505af1158015614cad573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614cff57600080fd5b505afa158015614d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d37919061549e565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b158015614d9d57600080fd5b505afa158015614db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd591906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614e23959493926067921690600401615726565b600060405180830381600087803b158015614e3d57600080fd5b505af1158015614e51573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606f60209081526040808320805460ff19166001179055606c825291829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c5910161434d565b600582141561535e576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015614f0e57600080fd5b505af1158015614f22573d6000803e3d6000fd5b50506067546040516304268b7560e31b81526001600160a01b03888116600483015261010090920490911692506321345ba89150602401600060405180830381600087803b158015614f7357600080fd5b505af1158015614f87573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614fd957600080fd5b505afa158015614fed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190615011919061549e565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b15801561506e57600080fd5b505afa158015615082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150a6919061549e565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b1580156150df57600080fd5b505afa1580156150f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061511791906156c3565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152615165959493926066921690600401615726565b600060405180830381600087803b15801561517f57600080fd5b505af1158015615193573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156151e557600080fd5b505afa1580156151f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061521d919061549e565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936152849363b0092db792600480840193829003018186803b15801561415d57600080fd5b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526152d2959493926069921690600401615726565b600060405180830381600087803b1580156152ec57600080fd5b505af1158015615300573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606b6020908152604080832054606d835281842055606e8252808320839055606c90915290819020859055516000805160206159b08339815191529150613d0a908690869086906157d4565b60665481146136355760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161092a565b8280546153bb90615915565b90600052602060002090601f0160209004810192826153dd5760008555615423565b82601f106153f657805160ff1916838001178555615423565b82800160010185558215615423579182015b82811115615423578251825591602001919060010190615408565b5061542f92915061546d565b5090565b8280548282559060005260206000209081019282156154235791602002820182811115615423578251825591602001919060010190615408565b5b8082111561542f576000815560010161546e565b600060208284031215615493578081fd5b8135610afb81615997565b6000602082840312156154af578081fd5b8151610afb81615997565b600080604083850312156154cc578081fd5b82356154d781615997565b915060208301356154e781615997565b809150509250929050565b60008060408385031215615504578182fd5b823561550f81615997565b9150602083013567ffffffffffffffff8082111561552b578283fd5b818501915085601f83011261553e578283fd5b81358181111561555057615550615981565b604051601f8201601f19908116603f0116810190838211818310171561557857615578615981565b81604052828152886020848701011115615590578586fd5b82602086016020830137856020848301015280955050505050509250929050565b600080604083850312156155c3578182fd5b82356155ce81615997565b946020939093013593505050565b6000806000606084860312156155f0578081fd5b83356155fb81615997565b925060208401359150604084013561561281615997565b809150509250925092565b600080600060608486031215615631578283fd5b833561563c81615997565b95602085013595506040909401359392505050565b60008060008060808587031215615666578081fd5b843561567181615997565b966020860135965060408601359560600135945092505050565b60006020828403121561569c578081fd5b81518015158114610afb578182fd5b6000602082840312156156bc578081fd5b5035919050565b6000602082840312156156d4578081fd5b5051919050565b60008151808452815b81811015615700576020818501810151868301820152016156e4565b818111156157115782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b600060018060a01b0380871683526080602084015261577860808401876156db565b9415156040840152929092166060909101525092915050565b6001600160a01b038616815260a0602082018190526000906157b5908301876156db565b6040830195909552506060810192909252151560809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561582d57835183529284019291840191600101615811565b50909695505050505050565b602081526000610afb60208301846156db565b6020808252600690820152654e6f74204f4360d01b604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061589a60c08401826156db565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b600082198211156158d9576158d961596b565b500190565b6000826158f957634e487b7160e01b81526012600452602481fd5b500490565b6000828210156159105761591061596b565b500390565b600181811c9082168061592957607f821691505b6020821081141561594a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156159645761596461596b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146159ac57600080fd5b5056fe22030d24c56fdfb5edf6a4fc074d3ae64f4a1de374968f0a0871f9fa5d494c4ea26469706673582212207a2950445802c7bd067be3afc40b322ee15cef09b51c88f48d0cfd42d2e4cbc064736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading