Contract 0x81465df3c64b18b4092990eb73200a3814af75e5 1

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x0da651f7bf30aacadbf76ad860e0699331340abd7511443acbffdfa637f5191fSet Delegate358775852023-05-21 19:10:47124 days 8 hrs ago0xbc0fbcf51c1343a0704efde1f148f98b102a5bb1 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000111463302 2.528831421
0xd46e3efc3a6d2d4a8d4dc69bb52004aaa0b8901a598fe2eebf7e943597ba62b8Close Trade Mark...348701562023-04-27 0:05:07149 days 3 hrs ago0x0481ae6dcbee79c1c59fee52a7afae55a0d1585b IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.00004672425 1.953110005
0x4569bcda71271317a3de60425d2102145148a238f5137f9fc59c0dbb0ff5dbfdOpen Trade340320092023-04-06 9:18:57169 days 18 hrs ago0xa110cc27a19f6853e9aa8bb8e2c603d7b02ea2df IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000042735492 1.594905487
0x2429091452dc5d1481cfd0140d5c2aa6a05de466d0cdd55e84214e4f336345c2Open Trade339892142023-04-05 8:03:17170 days 19 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000042102752 1.572700015
0x3040caef8d2025a675f72759aa123f83e9bf019a2dd8787572aa45c7cecc05f1Open Trade339891982023-04-05 8:02:43170 days 19 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.00004203047 1.570000015
0x1d00e46a409b6a860de2a1bbfeaa6913835b6b27e4bc97d19362cd7cffda3432Open Trade339891732023-04-05 8:01:51170 days 19 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.00004122734 1.540000015
0xdb3b2d35601807fb046f62fd5bca5cc3e2ce22afc0c538c4bf986f9cab46e183Open Trade339891572023-04-05 8:01:17170 days 19 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.0000401385 1.500000015
0x08311da90a729c2f2415a1d3de145464d4c9e3142e0299423124122274003a44Open Trade339817702023-04-05 3:39:19171 days 16 mins ago0x85a9885ee3d7a4c35d4918cfc526dfce4bbd6eb0 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000234403131 8.736280087
0xc43a50d904d225da490eb841f6aaff093ece322e8fe8e7fddf59e4ef62462962Close Trade Mark...339147052023-04-03 12:04:07172 days 15 hrs ago0x2c41bf8fe2430d05bcbeaa8fea21b10915c9c8bd IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000039303014 1.641250013
0x31a04f2226c933c81ea66782f02fb7234199a721c51deb24d7ed5d29b672261fOpen Trade338079452023-03-31 21:03:01175 days 6 hrs ago0x2403b5f0ece566c71304f03bace32c780cce8668 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000054007717 2.014687127
0xd7f9bd9a3099e24021e001e87fa2a9b5246a276b353c38feffcc6089299bd2cdOpen Trade337520362023-03-30 12:02:55176 days 15 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000040670173 1.517147499
0xb5a00bb6108d4888adccb31d78669b569893c69e4b7a25bc72081ce5278233b6Open Trade337520232023-03-30 12:02:27176 days 15 hrs ago0xf59ff9c0ca00b1d3a7eef20faf40418f6a5ec3a9 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000040588991 1.514119129
0x08d3cdcb6f1a70efa4a2b4ee6253f6a11c03068faa2368bb65e6119cb09d39d2Open Trade336959772023-03-29 2:57:27178 days 57 mins ago0x42e3925b4e7b6f4d36ce300b7be0d37b0d999999 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000039295607 1.466527621
0xa77b57e1d60653228507997ca3bb3b8bea3cd42934f332800e962b983928d02fOpen Trade336959692023-03-29 2:57:11178 days 58 mins ago0x42e3925b4e7b6f4d36ce300b7be0d37b0d999999 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000039304199 1.46684827
0x022e01bde08c140b3344f3fed7acc313bef1b730a459f173cf84993bbc8f47e2Open Trade336622162023-03-28 7:01:35178 days 20 hrs ago0xbb25fc5bb18277f4e4ba0f0ba9decc76fd29411e IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000063000312 2.352250016
0x6ddedbd006a007c3ec1274af6f515879dbd834622f34ca7356630035fa072438Open Trade336621462023-03-28 6:59:07178 days 20 hrs ago0xbb25fc5bb18277f4e4ba0f0ba9decc76fd29411e IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000048838623 1.822676747
0x233abfb61b43e5b05266e40b3036151579ed726eba7712d593b11bbe9303ba94Open Trade336621002023-03-28 6:57:29178 days 20 hrs ago0x73bacf0104133629034bcd29f207149d686e2bb8 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000064977875 2.425000016
0x3b96a5b88780a094a8ad892aa9cbed7dc06c98e94f65b428633d75de54ef45a5Set Delegate336164172023-03-27 3:59:33179 days 23 hrs ago0x1190fe6831cd79c203f2bc3dca47dc1539359678 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000043830311 1.624728899
0xb09fc1faa46799f5a10be6be9d80caabf3e3e26c554dafe78959a0c2b4a0f1a5Open Trade335574982023-03-25 17:12:49181 days 10 hrs ago0xcdb6feb054efa0e788dbcb02c064a5067436176a IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000050259932 1.869858701
0x6c030c18c7044fa8f273a970125e5db7cb2178af0b4fa7e8249103dc599ba024Close Trade Mark...335441612023-03-25 9:20:29181 days 18 hrs ago0x2a96de61db058937fe3d3a47291bb16144b806da IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.0000410269051.714956552
0x7358f542253f40ee23dbd9ec318ca9579679154d3f10e7de9fee6be220ce3fb7Close Trade Mark...335441482023-03-25 9:20:01181 days 18 hrs ago0x2a96de61db058937fe3d3a47291bb16144b806da IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.00003590251.500000016
0x433958c27a2ca1abf4e73702c03c30fc2910ca0f7959a6114b523c28c0ed6115Close Trade Mark...335441302023-03-25 9:19:23181 days 18 hrs ago0x2a96de61db058937fe3d3a47291bb16144b806da IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.00003590251.500000016
0x475182eb25da8de29b56aa697f6b80675a5fca9892d57390e5f7a61426ddc93dOpen Trade335384862023-03-25 5:59:29181 days 21 hrs ago0x3b946707fea4abd17d41a4bf513e6646854827c4 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000051795691 1.933035711
0xfecdefe655899e05d4a8efcc35e57f8c5745cb49d4fa68990c8a6f49aa572c24Open Trade335291572023-03-25 0:29:05182 days 3 hrs ago0x57bde7caaaa7412dc322cec973a80ad15807b1fa IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000217986914 8.128077657
0x2f72911f00a9bbe4df54001879afac859f1b329af272bebdaec7bf59f3a59875Open Trade335205302023-03-24 19:23:33182 days 8 hrs ago0xd5b6f4e292173422ad46931e6ee022428d657f91 IN  0x81465df3c64b18b4092990eb73200a3814af75e50 MATIC0.000160790059 5.992697236
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
GNSTradingV6_2

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 125 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at PolygonScan.com on 2022-08-10
*/

// File: contracts\interfaces\UniswapRouterInterfaceV5.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

interface UniswapRouterInterfaceV5{
	function swapExactTokensForTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);

	function swapTokensForExactTokens(
		uint amountOut,
		uint amountInMax,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);
}

// File: contracts\interfaces\TokenInterfaceV5.sol

pragma solidity 0.8.15;

interface TokenInterfaceV5{
    function burn(address, uint256) external;
    function mint(address, uint256) external;
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns(bool);
    function balanceOf(address) external view returns(uint256);
    function hasRole(bytes32, address) external view returns (bool);
    function approve(address, uint256) external returns (bool);
    function allowance(address, address) external view returns (uint256);
}

// File: contracts\interfaces\NftInterfaceV5.sol

pragma solidity 0.8.15;

interface NftInterfaceV5{
    function balanceOf(address) external view returns (uint);
    function ownerOf(uint) external view returns (address);
    function transferFrom(address, address, uint) external;
    function tokenOfOwnerByIndex(address, uint) external view returns(uint);
}

// File: contracts\interfaces\VaultInterfaceV5.sol

pragma solidity 0.8.15;

interface VaultInterfaceV5{
	function sendDaiToTrader(address, uint) external;
	function receiveDaiFromTrader(address, uint, uint) external;
	function currentBalanceDai() external view returns(uint);
	function distributeRewardDai(uint) external;
}

// File: contracts\interfaces\PairsStorageInterfaceV6.sol

pragma solidity 0.8.15;

interface PairsStorageInterfaceV6{
    enum FeedCalculation { DEFAULT, INVERT, COMBINE }    // FEED 1, 1 / (FEED 1), (FEED 1)/(FEED 2)
    struct Feed{ address feed1; address feed2; FeedCalculation feedCalculation; uint maxDeviationP; } // PRECISION (%)
    function incrementCurrentOrderId() external returns(uint);
    function updateGroupCollateral(uint, uint, bool, bool) external;
    function pairJob(uint) external returns(string memory, string memory, bytes32, uint);
    function pairFeed(uint) external view returns(Feed memory);
    function pairSpreadP(uint) external view returns(uint);
    function pairMinLeverage(uint) external view returns(uint);
    function pairMaxLeverage(uint) external view returns(uint);
    function groupMaxCollateral(uint) external view returns(uint);
    function groupCollateral(uint, bool) external view returns(uint);
    function guaranteedSlEnabled(uint) external view returns(bool);
    function pairOpenFeeP(uint) external view returns(uint);
    function pairCloseFeeP(uint) external view returns(uint);
    function pairOracleFeeP(uint) external view returns(uint);
    function pairNftLimitOrderFeeP(uint) external view returns(uint);
    function pairReferralFeeP(uint) external view returns(uint);
    function pairMinLevPosDai(uint) external view returns(uint);
}

// File: contracts\interfaces\StorageInterfaceV5.sol

pragma solidity 0.8.15;

interface StorageInterfaceV5{
    enum LimitOrder { TP, SL, LIQ, OPEN }
    struct Trader{
        uint leverageUnlocked;
        address referral;
        uint referralRewardsTotal;  // 1e18
    }
    struct Trade{
        address trader;
        uint pairIndex;
        uint index;
        uint initialPosToken;       // 1e18
        uint positionSizeDai;       // 1e18
        uint openPrice;             // PRECISION
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION
        uint sl;                    // PRECISION
    }
    struct TradeInfo{
        uint tokenId;
        uint tokenPriceDai;         // PRECISION
        uint openInterestDai;       // 1e18
        uint tpLastUpdated;
        uint slLastUpdated;
        bool beingMarketClosed;
    }
    struct OpenLimitOrder{
        address trader;
        uint pairIndex;
        uint index;
        uint positionSize;          // 1e18 (DAI or GFARM2)
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION (%)
        uint sl;                    // PRECISION (%)
        uint minPrice;              // PRECISION
        uint maxPrice;              // PRECISION
        uint block;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingMarketOrder{
        Trade trade;
        uint block;
        uint wantedPrice;           // PRECISION
        uint slippageP;             // PRECISION (%)
        uint spreadReductionP;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingNftOrder{
        address nftHolder;
        uint nftId;
        address trader;
        uint pairIndex;
        uint index;
        LimitOrder orderType;
    }
    function PRECISION() external pure returns(uint);
    function gov() external view returns(address);
    function dev() external view returns(address);
    function dai() external view returns(TokenInterfaceV5);
    function token() external view returns(TokenInterfaceV5);
    function linkErc677() external view returns(TokenInterfaceV5);
    function tokenDaiRouter() external view returns(UniswapRouterInterfaceV5);
    function priceAggregator() external view returns(AggregatorInterfaceV6_2);
    function vault() external view returns(VaultInterfaceV5);
    function trading() external view returns(address);
    function callbacks() external view returns(address);
    function handleTokens(address,uint,bool) external;
    function transferDai(address, address, uint) external;
    function transferLinkToAggregator(address, uint, uint) external;
    function unregisterTrade(address, uint, uint) external;
    function unregisterPendingMarketOrder(uint, bool) external;
    function unregisterOpenLimitOrder(address, uint, uint) external;
    function hasOpenLimitOrder(address, uint, uint) external view returns(bool);
    function storePendingMarketOrder(PendingMarketOrder memory, uint, bool) external;
    function storeReferral(address, address) external;
    function openTrades(address, uint, uint) external view returns(Trade memory);
    function openTradesInfo(address, uint, uint) external view returns(TradeInfo memory);
    function updateSl(address, uint, uint, uint) external;
    function updateTp(address, uint, uint, uint) external;
    function getOpenLimitOrder(address, uint, uint) external view returns(OpenLimitOrder memory);
    function spreadReductionsP(uint) external view returns(uint);
    function positionSizeTokenDynamic(uint,uint) external view returns(uint);
    function maxSlP() external view returns(uint);
    function storeOpenLimitOrder(OpenLimitOrder memory) external;
    function reqID_pendingMarketOrder(uint) external view returns(PendingMarketOrder memory);
    function storePendingNftOrder(PendingNftOrder memory, uint) external;
    function updateOpenLimitOrder(OpenLimitOrder calldata) external;
    function firstEmptyTradeIndex(address, uint) external view returns(uint);
    function firstEmptyOpenLimitIndex(address, uint) external view returns(uint);
    function increaseNftRewards(uint, uint) external;
    function nftSuccessTimelock() external view returns(uint);
    function currentPercentProfit(uint,uint,bool,uint) external view returns(int);
    function reqID_pendingNftOrder(uint) external view returns(PendingNftOrder memory);
    function setNftLastSuccess(uint) external;
    function updateTrade(Trade memory) external;
    function nftLastSuccess(uint) external view returns(uint);
    function unregisterPendingNftOrder(uint) external;
    function handleDevGovFees(uint, uint, bool, bool) external returns(uint);
    function distributeLpRewards(uint) external;
    function getReferral(address) external view returns(address);
    function increaseReferralRewards(address, uint) external;
    function storeTrade(Trade memory, TradeInfo memory) external;
    function setLeverageUnlocked(address, uint) external;
    function getLeverageUnlocked(address) external view returns(uint);
    function openLimitOrdersCount(address, uint) external view returns(uint);
    function maxOpenLimitOrdersPerPair() external view returns(uint);
    function openTradesCount(address, uint) external view returns(uint);
    function pendingMarketOpenCount(address, uint) external view returns(uint);
    function pendingMarketCloseCount(address, uint) external view returns(uint);
    function maxTradesPerPair() external view returns(uint);
    function maxTradesPerBlock() external view returns(uint);
    function tradesPerBlock(uint) external view returns(uint);
    function pendingOrderIdsCount(address) external view returns(uint);
    function maxPendingMarketOrders() external view returns(uint);
    function maxGainP() external view returns(uint);
    function defaultLeverageUnlocked() external view returns(uint);
    function openInterestDai(uint, uint) external view returns(uint);
    function getPendingOrderIds(address) external view returns(uint[] memory);
    function traders(address) external view returns(Trader memory);
    function nfts(uint) external view returns(NftInterfaceV5);
}

interface AggregatorInterfaceV6_2{
    enum OrderType { MARKET_OPEN, MARKET_CLOSE, LIMIT_OPEN, LIMIT_CLOSE, UPDATE_SL }
    function pairsStorage() external view returns(PairsStorageInterfaceV6);
    function getPrice(uint,OrderType,uint) external returns(uint);
    function tokenPriceDai() external returns(uint);
    function linkFee(uint,uint) external view returns(uint);
    function tokenDaiReservesLp() external view returns(uint, uint);
    function pendingSlOrders(uint) external view returns(PendingSl memory);
    function storePendingSlOrder(uint orderId, PendingSl calldata p) external;
    function unregisterPendingSlOrder(uint orderId) external;
    struct PendingSl{address trader; uint pairIndex; uint index; uint openPrice; bool buy; uint newSl; }
}

interface NftRewardsInterfaceV6{
    struct TriggeredLimitId{ address trader; uint pairIndex; uint index; StorageInterfaceV5.LimitOrder order; }
    enum OpenLimitOrderType{ LEGACY, REVERSAL, MOMENTUM }
    function storeFirstToTrigger(TriggeredLimitId calldata, address) external;
    function storeTriggerSameBlock(TriggeredLimitId calldata, address) external;
    function unregisterTrigger(TriggeredLimitId calldata) external;
    function distributeNftReward(TriggeredLimitId calldata, uint) external;
    function openLimitOrderTypes(address, uint, uint) external view returns(OpenLimitOrderType);
    function setOpenLimitOrderType(address, uint, uint, OpenLimitOrderType) external;
    function triggered(TriggeredLimitId calldata) external view returns(bool);
    function timedOut(TriggeredLimitId calldata) external view returns(bool);
}

// File: contracts\interfaces\GNSPairInfosInterfaceV6.sol

pragma solidity 0.8.15;

interface GNSPairInfosInterfaceV6{
    function maxNegativePnlOnOpenP() external view returns(uint); // PRECISION (%)

    function storeTradeInitialAccFees(
        address trader,
        uint pairIndex,
        uint index,
        bool long
    ) external;

    function getTradePriceImpact(
        uint openPrice,   // PRECISION
        uint pairIndex,
        bool long,
        uint openInterest // 1e18 (DAI)
    ) external view returns(
        uint priceImpactP,      // PRECISION (%)
        uint priceAfterImpact   // PRECISION
    );

   function getTradeLiquidationPrice(
        address trader,
        uint pairIndex,
        uint index,
        uint openPrice,  // PRECISION
        bool long,
        uint collateral, // 1e18 (DAI)
        uint leverage
    ) external view returns(uint); // PRECISION

    function getTradeValue(
        address trader,
        uint pairIndex,
        uint index,
        bool long,
        uint collateral,   // 1e18 (DAI)
        uint leverage,
        int percentProfit, // PRECISION (%)
        uint closingFee    // 1e18 (DAI)
    ) external returns(uint); // 1e18 (DAI)
}

// File: contracts\interfaces\GNSReferralsInterfaceV6_2.sol

pragma solidity 0.8.15;

interface GNSReferralsInterfaceV6_2{
    function registerPotentialReferrer(address trader, address referral) external;
   	function distributePotentialReward(
        address trader,
        uint volumeDai,
        uint pairOpenFeeP,
        uint tokenPriceDai
    ) external returns(uint);
    function getPercentOfOpenFeeP(address trader) external view returns(uint);
    function getTraderReferrer(address trader) external view returns(address referrer);
}

// File: contracts\Delegatable.sol

pragma solidity 0.8.15;

abstract contract Delegatable {
    mapping (address => address) public delegations;
    address private senderOverride;

    function setDelegate(address delegate) external {
        require(tx.origin == msg.sender, "NO_CONTRACT");

        delegations[msg.sender] = delegate;
    }

    function removeDelegate() external {
        delegations[msg.sender] = address(0);
    }

    function delegatedAction(address trader, bytes calldata call_data) external returns (bytes memory) {
        require(delegations[trader] == msg.sender, "DELEGATE_NOT_APPROVED");

        senderOverride = trader;
        (bool success, bytes memory result) = address(this).delegatecall(call_data);
        if (!success) {
            // Next 5 lines from https://ethereum.stackexchange.com/a/83577 (return the original revert reason)
            if (result.length < 68) revert();
            assembly {
                result := add(result, 0x04)
            }
            revert(abi.decode(result, (string)));
        }

        senderOverride = address(0);

        return result;
    }


    function _msgSender() public view returns (address) {
        if (senderOverride == address(0)) {
            return msg.sender;
        } else {
            return senderOverride;
        }
    }
}

// File: contracts\GNSTradingV6_2.sol

pragma solidity 0.8.15;

contract GNSTradingV6_2 is Delegatable {

    // Contracts (constant)
    StorageInterfaceV5 public immutable storageT;
    NftRewardsInterfaceV6 public immutable nftRewards;
    GNSPairInfosInterfaceV6 public immutable pairInfos;
    GNSReferralsInterfaceV6_2 public immutable referrals;

    // Params (constant)
    uint constant PRECISION = 1e10;
    uint constant MAX_SL_P = 75;  // -75% PNL

    // Params (adjustable)
    uint public maxPosDai;            // 1e18 (eg. 75000 * 1e18)
    uint public limitOrdersTimelock;  // block (eg. 30)
    uint public marketOrdersTimeout;  // block (eg. 30)

    // State
    bool public isPaused;  // Prevent opening new trades
    bool public isDone;    // Prevent any interaction with the contract

    // Events
    event Done(bool done);
    event Paused(bool paused);

    event NumberUpdated(string name, uint value);

    event MarketOrderInitiated(
        uint indexed orderId,
        address indexed trader,
        uint indexed pairIndex,
        bool open
    );

    event OpenLimitPlaced(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );
    event OpenLimitUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newPrice,
        uint newTp,
        uint newSl
    );
    event OpenLimitCanceled(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );

    event TpUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newTp
    );
    event SlUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newSl
    );
    event SlUpdateInitiated(
        uint indexed orderId,
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newSl
    );

    event NftOrderInitiated(
        uint orderId,
        address indexed nftHolder,
        address indexed trader,
        uint indexed pairIndex
    );
    event NftOrderSameBlock(
        address indexed nftHolder,
        address indexed trader,
        uint indexed pairIndex
    );

    event ChainlinkCallbackTimeout(
        uint indexed orderId,
        StorageInterfaceV5.PendingMarketOrder order
    );
    event CouldNotCloseTrade(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );

    constructor(
        StorageInterfaceV5 _storageT,
        NftRewardsInterfaceV6 _nftRewards,
        GNSPairInfosInterfaceV6 _pairInfos,
        GNSReferralsInterfaceV6_2 _referrals,
        uint _maxPosDai,
        uint _limitOrdersTimelock,
        uint _marketOrdersTimeout
    ) {
        require(address(_storageT) != address(0)
            && address(_nftRewards) != address(0)
            && address(_pairInfos) != address(0)
            && address(_referrals) != address(0)
            && _maxPosDai > 0
            && _limitOrdersTimelock > 0
            && _marketOrdersTimeout > 0, "WRONG_PARAMS");

        storageT = _storageT;
        nftRewards = _nftRewards;
        pairInfos = _pairInfos;
        referrals = _referrals;

        maxPosDai = _maxPosDai;
        limitOrdersTimelock = _limitOrdersTimelock;
        marketOrdersTimeout = _marketOrdersTimeout;
    }

    // Modifiers
    modifier onlyGov(){
        require(msg.sender == storageT.gov(), "GOV_ONLY");
        _;
    }
    modifier notContract(){
        require(tx.origin == msg.sender);
        _;
    }
    modifier notDone(){
        require(!isDone, "DONE");
        _;
    }

    // Manage params
    function setMaxPosDai(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        maxPosDai = value;
        
        emit NumberUpdated("maxPosDai", value);
    }
    function setLimitOrdersTimelock(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        limitOrdersTimelock = value;
        
        emit NumberUpdated("limitOrdersTimelock", value);
    }
    function setMarketOrdersTimeout(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        marketOrdersTimeout = value;
        
        emit NumberUpdated("marketOrdersTimeout", value);
    }

    // Manage state
    function pause() external onlyGov{
        isPaused = !isPaused;

        emit Paused(isPaused);
    }
    function done() external onlyGov{
        isDone = !isDone;

        emit Done(isDone);
    }

    // Open new trade (MARKET/LIMIT)
    function openTrade(
        StorageInterfaceV5.Trade memory t,
        NftRewardsInterfaceV6.OpenLimitOrderType orderType, // LEGACY => market
        uint spreadReductionId,
        uint slippageP, // for market orders only
        address referrer
    ) external notContract notDone{

        require(!isPaused, "PAUSED");

        AggregatorInterfaceV6_2 aggregator = storageT.priceAggregator();
        PairsStorageInterfaceV6 pairsStored = aggregator.pairsStorage();

        address sender = _msgSender();

        require(storageT.openTradesCount(sender, t.pairIndex)
            + storageT.pendingMarketOpenCount(sender, t.pairIndex)
            + storageT.openLimitOrdersCount(sender, t.pairIndex)
            < storageT.maxTradesPerPair(), 
            "MAX_TRADES_PER_PAIR");

        require(storageT.pendingOrderIdsCount(sender)
            < storageT.maxPendingMarketOrders(), 
            "MAX_PENDING_ORDERS");

        require(t.positionSizeDai <= maxPosDai, "ABOVE_MAX_POS");
        require(t.positionSizeDai * t.leverage
            >= pairsStored.pairMinLevPosDai(t.pairIndex), "BELOW_MIN_POS");

        require(t.leverage > 0 && t.leverage >= pairsStored.pairMinLeverage(t.pairIndex) 
            && t.leverage <= pairsStored.pairMaxLeverage(t.pairIndex), 
            "LEVERAGE_INCORRECT");

        require(spreadReductionId == 0
            || storageT.nfts(spreadReductionId - 1).balanceOf(sender) > 0,
            "NO_CORRESPONDING_NFT_SPREAD_REDUCTION");

        require(t.tp == 0 || (t.buy ?
                t.tp > t.openPrice :
                t.tp < t.openPrice), "WRONG_TP");

        require(t.sl == 0 || (t.buy ?
                t.sl < t.openPrice :
                t.sl > t.openPrice), "WRONG_SL");

        (uint priceImpactP, ) = pairInfos.getTradePriceImpact(
            0,
            t.pairIndex,
            t.buy,
            t.positionSizeDai * t.leverage
        );

        require(priceImpactP * t.leverage
            <= pairInfos.maxNegativePnlOnOpenP(), "PRICE_IMPACT_TOO_HIGH");

        storageT.transferDai(sender, address(storageT), t.positionSizeDai);

        if(orderType != NftRewardsInterfaceV6.OpenLimitOrderType.LEGACY){
            uint index = storageT.firstEmptyOpenLimitIndex(sender, t.pairIndex);

            storageT.storeOpenLimitOrder(
                StorageInterfaceV5.OpenLimitOrder(
                    sender,
                    t.pairIndex,
                    index,
                    t.positionSizeDai,
                    spreadReductionId > 0 ?
                        storageT.spreadReductionsP(spreadReductionId - 1) :
                        0,
                    t.buy,
                    t.leverage,
                    t.tp,
                    t.sl,
                    t.openPrice,
                    t.openPrice,
                    block.number,
                    0
                )
            );

            nftRewards.setOpenLimitOrderType(sender, t.pairIndex, index, orderType);

            emit OpenLimitPlaced(
                sender,
                t.pairIndex,
                index
            );

        }else{
            uint orderId = aggregator.getPrice(
                t.pairIndex, 
                AggregatorInterfaceV6_2.OrderType.MARKET_OPEN, 
                t.positionSizeDai * t.leverage
            );

            storageT.storePendingMarketOrder(
                StorageInterfaceV5.PendingMarketOrder(
                    StorageInterfaceV5.Trade(
                        sender,
                        t.pairIndex,
                        0,
                        0,
                        t.positionSizeDai,
                        0, 
                        t.buy,
                        t.leverage,
                        t.tp,
                        t.sl
                    ),
                    0,
                    t.openPrice,
                    slippageP,
                    spreadReductionId > 0 ?
                        storageT.spreadReductionsP(spreadReductionId - 1) :
                        0,
                    0
                ), orderId, true
            );

            emit MarketOrderInitiated(
                orderId,
                sender,
                t.pairIndex,
                true
            );
        }

        referrals.registerPotentialReferrer(sender, referrer);
    }

    // Close trade (MARKET)
    function closeTradeMarket(
        uint pairIndex,
        uint index
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(storageT.pendingOrderIdsCount(sender)
            < storageT.maxPendingMarketOrders(), "MAX_PENDING_ORDERS");

        require(!i.beingMarketClosed, "ALREADY_BEING_CLOSED");
        require(t.leverage > 0, "NO_TRADE");

        uint orderId = storageT.priceAggregator().getPrice(
            pairIndex, 
            AggregatorInterfaceV6_2.OrderType.MARKET_CLOSE, 
            t.initialPosToken * i.tokenPriceDai * t.leverage / PRECISION
        );

        storageT.storePendingMarketOrder(
            StorageInterfaceV5.PendingMarketOrder(
                StorageInterfaceV5.Trade(
                    sender, pairIndex, index, 0, 0, 0, false, 0, 0, 0
                ),
                0, 0, 0, 0, 0
            ), orderId, false
        );

        emit MarketOrderInitiated(
            orderId,
            sender,
            pairIndex,
            false
        );
    }

    // Manage limit order (OPEN)
    function updateOpenLimitOrder(
        uint pairIndex, 
        uint index, 
        uint price,  // PRECISION
        uint tp,
        uint sl
    ) external notContract notDone{

        address sender = _msgSender();

        require(storageT.hasOpenLimitOrder(sender, pairIndex, index),
            "NO_LIMIT");

        StorageInterfaceV5.OpenLimitOrder memory o = storageT.getOpenLimitOrder(
            sender, pairIndex, index
        );

        require(block.number - o.block >= limitOrdersTimelock, "LIMIT_TIMELOCK");

        require(tp == 0 || (o.buy ?
            tp > price :
            tp < price), "WRONG_TP");

        require(sl == 0 || (o.buy ?
            sl < price :
            sl > price), "WRONG_SL");

        o.minPrice = price;
        o.maxPrice = price;

        o.tp = tp;
        o.sl = sl;

        storageT.updateOpenLimitOrder(o);

        emit OpenLimitUpdated(
            sender,
            pairIndex,
            index,
            price,
            tp,
            sl
        );
    }

    function cancelOpenLimitOrder(
        uint pairIndex,
        uint index
    ) external notContract notDone{

        address sender = _msgSender();

        require(storageT.hasOpenLimitOrder(sender, pairIndex, index),
            "NO_LIMIT");

        StorageInterfaceV5.OpenLimitOrder memory o = storageT.getOpenLimitOrder(
            sender, pairIndex, index
        );

        require(block.number - o.block >= limitOrdersTimelock, "LIMIT_TIMELOCK");

        storageT.unregisterOpenLimitOrder(sender, pairIndex, index);
        storageT.transferDai(address(storageT), sender, o.positionSize);

        emit OpenLimitCanceled(
            sender,
            pairIndex,
            index
        );
    }

    // Manage limit order (TP/SL)
    function updateTp(
        uint pairIndex,
        uint index,
        uint newTp
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(t.leverage > 0, "NO_TRADE");
        require(block.number - i.tpLastUpdated >= limitOrdersTimelock,
            "LIMIT_TIMELOCK");

        storageT.updateTp(sender, pairIndex, index, newTp);

        emit TpUpdated(
            sender,
            pairIndex,
            index,
            newTp
        );
    }

    function updateSl(
        uint pairIndex,
        uint index,
        uint newSl
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(t.leverage > 0, "NO_TRADE");

        uint maxSlDist = t.openPrice * MAX_SL_P / 100 / t.leverage;

        require(newSl == 0 || (t.buy ? 
            newSl >= t.openPrice - maxSlDist :
            newSl <= t.openPrice + maxSlDist), "SL_TOO_BIG");
        
        require(block.number - i.slLastUpdated >= limitOrdersTimelock,
            "LIMIT_TIMELOCK");

        AggregatorInterfaceV6_2 aggregator = storageT.priceAggregator();

        if(newSl == 0
        || !aggregator.pairsStorage().guaranteedSlEnabled(pairIndex)){

            storageT.updateSl(sender, pairIndex, index, newSl);

            emit SlUpdated(
                sender,
                pairIndex,
                index,
                newSl
            );

        }else{
            uint orderId = aggregator.getPrice(
                pairIndex,
                AggregatorInterfaceV6_2.OrderType.UPDATE_SL, 
                t.initialPosToken * i.tokenPriceDai * t.leverage / PRECISION
            );

            aggregator.storePendingSlOrder(
                orderId, 
                AggregatorInterfaceV6_2.PendingSl(
                    sender, pairIndex, index, t.openPrice, t.buy, newSl
                )
            );
            
            emit SlUpdateInitiated(
                orderId,
                sender,
                pairIndex,
                index,
                newSl
            );
        }
    }

    // Execute limit order
    function executeNftOrder(
        StorageInterfaceV5.LimitOrder orderType, 
        address trader, 
        uint pairIndex, 
        uint index,
        uint nftId, 
        uint nftType
    ) external notContract notDone{

        address sender = _msgSender();

        require(nftType >= 1 && nftType <= 5, "WRONG_NFT_TYPE");
        require(storageT.nfts(nftType - 1).ownerOf(nftId) == sender, "NO_NFT");

        require(block.number >=
            storageT.nftLastSuccess(nftId) + storageT.nftSuccessTimelock(),
            "SUCCESS_TIMELOCK");

        StorageInterfaceV5.Trade memory t;

        if(orderType == StorageInterfaceV5.LimitOrder.OPEN){
            require(storageT.hasOpenLimitOrder(trader, pairIndex, index),
                "NO_LIMIT");

        }else{
            t = storageT.openTrades(trader, pairIndex, index);

            require(t.leverage > 0, "NO_TRADE");

            if(orderType == StorageInterfaceV5.LimitOrder.LIQ){
                uint liqPrice = getTradeLiquidationPrice(t);
                
                require(t.sl == 0 || (t.buy ?
                    liqPrice > t.sl :
                    liqPrice < t.sl), "HAS_SL");

            }else{
                require(orderType != StorageInterfaceV5.LimitOrder.SL || t.sl > 0,
                    "NO_SL");
                require(orderType != StorageInterfaceV5.LimitOrder.TP || t.tp > 0,
                    "NO_TP");
            }
        }

        NftRewardsInterfaceV6.TriggeredLimitId memory triggeredLimitId =
            NftRewardsInterfaceV6.TriggeredLimitId(
                trader, pairIndex, index, orderType
            );

        if(!nftRewards.triggered(triggeredLimitId)
        || nftRewards.timedOut(triggeredLimitId)){
            
            uint leveragedPosDai;

            if(orderType == StorageInterfaceV5.LimitOrder.OPEN){

                StorageInterfaceV5.OpenLimitOrder memory l = storageT.getOpenLimitOrder(
                    trader, pairIndex, index
                );

                leveragedPosDai = l.positionSize * l.leverage;

                (uint priceImpactP, ) = pairInfos.getTradePriceImpact(
                    0,
                    l.pairIndex,
                    l.buy,
                    leveragedPosDai
                );
                
                require(priceImpactP * l.leverage <= pairInfos.maxNegativePnlOnOpenP(),
                    "PRICE_IMPACT_TOO_HIGH");

            }else{
                leveragedPosDai = t.initialPosToken * storageT.openTradesInfo(
                    trader, pairIndex, index
                ).tokenPriceDai * t.leverage / PRECISION;
            }

            storageT.transferLinkToAggregator(sender, pairIndex, leveragedPosDai);

            uint orderId = storageT.priceAggregator().getPrice(
                pairIndex, 
                orderType == StorageInterfaceV5.LimitOrder.OPEN ? 
                    AggregatorInterfaceV6_2.OrderType.LIMIT_OPEN : 
                    AggregatorInterfaceV6_2.OrderType.LIMIT_CLOSE,
                leveragedPosDai
            );

            storageT.storePendingNftOrder(
                StorageInterfaceV5.PendingNftOrder(
                    sender,
                    nftId,
                    trader,
                    pairIndex,
                    index,
                    orderType
                ), orderId
            );

            nftRewards.storeFirstToTrigger(triggeredLimitId, sender);
            
            emit NftOrderInitiated(
                orderId,
                sender,
                trader,
                pairIndex
            );

        }else{
            nftRewards.storeTriggerSameBlock(triggeredLimitId, sender);
            
            emit NftOrderSameBlock(
                sender,
                trader,
                pairIndex
            );
        }
    }
    // Avoid stack too deep error in executeNftOrder
    function getTradeLiquidationPrice(
        StorageInterfaceV5.Trade memory t
    ) private view returns(uint){
        return pairInfos.getTradeLiquidationPrice(
            t.trader,
            t.pairIndex,
            t.index,
            t.openPrice,
            t.buy,
            t.initialPosToken * storageT.openTradesInfo(
                t.trader, t.pairIndex, t.index
            ).tokenPriceDai / PRECISION,
            t.leverage
        );
    }

    // Market timeout
    function openTradeMarketTimeout(uint _order) external notContract notDone{
        address sender = _msgSender();

        StorageInterfaceV5.PendingMarketOrder memory o =
            storageT.reqID_pendingMarketOrder(_order);

        StorageInterfaceV5.Trade memory t = o.trade;

        require(o.block > 0
            && block.number >= o.block + marketOrdersTimeout, "WAIT_TIMEOUT");

        require(t.trader == sender, "NOT_YOUR_ORDER");
        require(t.leverage > 0, "WRONG_MARKET_ORDER_TYPE");

        storageT.unregisterPendingMarketOrder(_order, true);
        storageT.transferDai(address(storageT), sender, t.positionSizeDai);

        emit ChainlinkCallbackTimeout(
            _order,
            o
        );
    }
    
    function closeTradeMarketTimeout(uint _order) external notContract notDone{
        address sender = _msgSender();

        StorageInterfaceV5.PendingMarketOrder memory o =
            storageT.reqID_pendingMarketOrder(_order);

        StorageInterfaceV5.Trade memory t = o.trade;

        require(o.block > 0
            && block.number >= o.block + marketOrdersTimeout, "WAIT_TIMEOUT");

        require(t.trader == sender, "NOT_YOUR_ORDER");
        require(t.leverage == 0, "WRONG_MARKET_ORDER_TYPE");

        storageT.unregisterPendingMarketOrder(_order, false);

        (bool success, ) = address(this).delegatecall(
            abi.encodeWithSignature(
                "closeTradeMarket(uint256,uint256)",
                t.pairIndex,
                t.index
            )
        );

        if(!success){
            emit CouldNotCloseTrade(
                sender,
                t.pairIndex,
                t.index
            );
        }

        emit ChainlinkCallbackTimeout(
            _order,
            o
        );
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract StorageInterfaceV5","name":"_storageT","type":"address"},{"internalType":"contract NftRewardsInterfaceV6","name":"_nftRewards","type":"address"},{"internalType":"contract GNSPairInfosInterfaceV6","name":"_pairInfos","type":"address"},{"internalType":"contract GNSReferralsInterfaceV6_2","name":"_referrals","type":"address"},{"internalType":"uint256","name":"_maxPosDai","type":"uint256"},{"internalType":"uint256","name":"_limitOrdersTimelock","type":"uint256"},{"internalType":"uint256","name":"_marketOrdersTimeout","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"internalType":"struct StorageInterfaceV5.Trade","name":"trade","type":"tuple"},{"internalType":"uint256","name":"block","type":"uint256"},{"internalType":"uint256","name":"wantedPrice","type":"uint256"},{"internalType":"uint256","name":"slippageP","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"indexed":false,"internalType":"struct StorageInterfaceV5.PendingMarketOrder","name":"order","type":"tuple"}],"name":"ChainlinkCallbackTimeout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"CouldNotCloseTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"done","type":"bool"}],"name":"Done","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"open","type":"bool"}],"name":"MarketOrderInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"NftOrderInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"NftOrderSameBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NumberUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"OpenLimitCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"OpenLimitPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"OpenLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"SlUpdateInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"SlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTp","type":"uint256"}],"name":"TpUpdated","type":"event"},{"inputs":[],"name":"_msgSender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"cancelOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"closeTradeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"closeTradeMarketTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"bytes","name":"call_data","type":"bytes"}],"name":"delegatedAction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegations","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"done","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StorageInterfaceV5.LimitOrder","name":"orderType","type":"uint8"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"nftType","type":"uint256"}],"name":"executeNftOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitOrdersTimelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketOrdersTimeout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPosDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewards","outputs":[{"internalType":"contract NftRewardsInterfaceV6","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"internalType":"struct StorageInterfaceV5.Trade","name":"t","type":"tuple"},{"internalType":"enum NftRewardsInterfaceV6.OpenLimitOrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"spreadReductionId","type":"uint256"},{"internalType":"uint256","name":"slippageP","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"openTradeMarketTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pairInfos","outputs":[{"internalType":"contract GNSPairInfosInterfaceV6","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referrals","outputs":[{"internalType":"contract GNSReferralsInterfaceV6_2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLimitOrdersTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketOrdersTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxPosDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageT","outputs":[{"internalType":"contract StorageInterfaceV5","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"name":"updateOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"updateSl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newTp","type":"uint256"}],"name":"updateTp","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b506040516200597038038062005970833981016040819052620000359162000134565b6001600160a01b038716158015906200005657506001600160a01b03861615155b80156200006b57506001600160a01b03851615155b80156200008057506001600160a01b03841615155b80156200008d5750600083115b80156200009a5750600082115b8015620000a75750600081115b620000e75760405162461bcd60e51b815260206004820152600c60248201526b57524f4e475f504152414d5360a01b604482015260640160405180910390fd5b6001600160a01b0396871660805294861660a05292851660c052931660e052600292909255600391909155600455620001bb565b6001600160a01b03811681146200013157600080fd5b50565b600080600080600080600060e0888a0312156200015057600080fd5b87516200015d816200011b565b602089015190975062000170816200011b565b604089015190965062000183816200011b565b606089015190955062000196816200011b565b809450506080880151925060a0880151915060c0880151905092959891949750929550565b60805160a05160c05160e0516155ad620003c3600039600081816103ce01526122050152600081816101ca01528181611a0901528181611ace015281816132e601528181613355015261466801526000818161026101528181611e77015281816130cc015281816131600152818161374f01526138260152600081816101f10152818161049f0152818161054f015281816106a60152818161076d015281816108cd015281816109f501528181610a6d01528181610b1e01528181610c9d01528181610dc301528181611102015281816111f80152818161129401528181611326015281816113b801528181611487015281816115260152818161180e01528181611b8f01528181611c4001528181611cbb01528181611d3601528181611fc9015281816120a4015281816122b001528181612346015281816123d901528181612478015281816125710152818161269a015281816127f5015281816128ff01528181612abc01528181612bfa01528181612c9001528181612de001528181612e920152818161321001528181613416015281816134e6015281816135550152818161366d01528181613934015281816139e401528181613aaa01528181613b2901528181613c2801528181613cbe01528181613e4d01528181613fc5015281816142b301528181614417015281816144ad015281816145a901526146b601526155ad6000f3fe608060405234801561001057600080fd5b50600436106101845760003560e01c80639a10cc32116100d9578063b9b6573a11610087578063b9b6573a14610367578063be73fb991461037a578063bffe34861461038d578063ca5eb5e1146103b6578063d3dc7539146103c9578063d4a1caa7146103f0578063d8defd151461040357600080fd5b80639a10cc32146102e65780639aa7c0e514610306578063a2a3c0cb14610319578063ae8421e11461032c578063b187bd2614610334578063b81bfa0514610341578063b8ebd5cc1461035457600080fd5b8063410c0b7c11610136578063410c0b7c146102535780635ad9f9931461025c5780638456cb5914610283578063876d3abd1461028b5780638f0622271461029e578063934d1cf4146102c0578063990382cf146102d357600080fd5b80630890d22a14610189578063119df25f146101a55780631346b0ff146101c557806316fff074146101ec578063279a165c14610213578063318a368b1461021c57806336fb8b1514610231575b600080fd5b61019260035481565b6040519081526020015b60405180910390f35b6101ad610416565b6040516001600160a01b03909116815260200161019c565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61019260025481565b61022f61022a36600461480e565b61043e565b005b61022f33600090815260208190526040902080546001600160a01b0319169055565b61019260045481565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61022f61076b565b61022f610299366004614849565b61086b565b6005546102b090610100900460ff1681565b604051901515815260200161019c565b61022f6102ce366004614849565b610b1c565b61022f6102e1366004614849565b610c3b565b6102f96102f436600461488a565b610f53565b60405161019c919061496b565b61022f610314366004614a11565b61108e565b61022f610327366004614af0565b61226c565b61022f6127f3565b6005546102b09060ff1681565b61022f61034f366004614849565b6128fd565b61022f610362366004614b12565b612a1f565b61022f610375366004614af0565b6138dc565b61022f610388366004614b6f565b613be4565b6101ad61039b366004614b9b565b6000602081905290815260409020546001600160a01b031681565b61022f6103c4366004614b9b565b614245565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61022f6103fe366004614849565b6142b1565b61022f610411366004614b6f565b6143d3565b6001546000906001600160a01b031661042e57503390565b506001546001600160a01b031690565b32331461044a57600080fd5b600554610100900460ff161561047b5760405162461bcd60e51b815260040161047290614bb8565b60405180910390fd5b6000610485610416565b604051636e6f99cd60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a906104d89084908a908a90600401614bd6565b602060405180830381865afa1580156104f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105199190614c02565b6105355760405162461bcd60e51b815260040161047290614c1f565b604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c906105889085908b908b90600401614bd6565b6101a060405180830381865afa1580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190614c4c565b9050600354816101600151436105e09190614d15565b10156105fe5760405162461bcd60e51b815260040161047290614d2c565b83158061061b57508060a001516106175784841061061b565b8484115b6106375760405162461bcd60e51b815260040161047290614d54565b82158061065457508060a0015161065057848311610654565b8483105b6106705760405162461bcd60e51b815260040161047290614d76565b6101208101859052610140810185905260e081018490526101008101839052604051635bb3b04560e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b767608a906106db908490600401614d98565b600060405180830381600087803b1580156106f557600080fd5b505af1158015610709573d6000803e3d6000fd5b50506040805189815260208101899052908101879052606081018690528992506001600160a01b03851691507f21e15d62c2ece17c1dc11c5fa45dcefdc6f99f199aa111d1363ff242f23e1c5c9060800160405180910390a350505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190614e38565b6001600160a01b0316336001600160a01b03161461081d5760405162461bcd60e51b815260040161047290614e55565b6005805460ff8082161560ff1990921682179092556040519116151581527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a1565b32331461087757600080fd5b600554610100900460ff161561089f5760405162461bcd60e51b815260040161047290614bb8565b60006108a9610416565b60405163b66e6b0560e01b8152600481018490529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b66e6b05906024016101e060405180830381865afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190614f0a565b8051602082015191925090158015906109635750600454826020015161095f9190614f8d565b4310155b61097f5760405162461bcd60e51b815260040161047290614fa5565b826001600160a01b031681600001516001600160a01b0316146109b45760405162461bcd60e51b815260040161047290614fcb565b60008160e00151116109d85760405162461bcd60e51b815260040161047290614ff3565b604051630195728b60e71b815260048101859052600160248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cab9458090604401600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050608081015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692610aac92918891600401615024565b600060405180830381600087803b158015610ac657600080fd5b505af1158015610ada573d6000803e3d6000fd5b50505050837f3adaa586cdbe84dd24e45bd7dada6da933d7c2d1c7b4e4cd02fce033356decb183604051610b0e91906150f6565b60405180910390a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614e38565b6001600160a01b0316336001600160a01b031614610bce5760405162461bcd60e51b815260040161047290614e55565b60008111610bee5760405162461bcd60e51b815260040161047290615105565b600281905560408051818152600991810191909152686d6178506f7344616960b81b606082015260208101829052600080516020615558833981519152906080015b60405180910390a150565b323314610c4757600080fd5b600554610100900460ff1615610c6f5760405162461bcd60e51b815260040161047290614bb8565b6000610c79610416565b60405163b66e6b0560e01b8152600481018490529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b66e6b05906024016101e060405180830381865afa158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190614f0a565b805160208201519192509015801590610d3357506004548260200151610d2f9190614f8d565b4310155b610d4f5760405162461bcd60e51b815260040161047290614fa5565b826001600160a01b031681600001516001600160a01b031614610d845760405162461bcd60e51b815260040161047290614fcb565b60e081015115610da65760405162461bcd60e51b815260040161047290614ff3565b604051630195728b60e71b815260048101859052600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cab9458090604401600060405180830381600087803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b505050602082015160408084015190516024810192909252604482015260009150309060640160408051601f198184030181529181526020820180516001600160e01b031663a2a3c0cb60e01b17905251610e7e9190615126565b600060405180830381855af49150503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b5050905080610f14578160200151846001600160a01b03167f60e497734ddabcd7293fd91739aaf65cf525eb539c97be528125a235a89288d88460400151604051610f0b91815260200190565b60405180910390a35b847f3adaa586cdbe84dd24e45bd7dada6da933d7c2d1c7b4e4cd02fce033356decb184604051610f4491906150f6565b60405180910390a25050505050565b6001600160a01b03838116600090815260208190526040902054606091163314610fb75760405162461bcd60e51b81526020600482015260156024820152741111531151d0551157d393d517d054141493d59151605a1b6044820152606401610472565b600180546001600160a01b0319166001600160a01b03861617905560405160009081903090610fe99087908790615142565b600060405180830381855af49150503d8060008114611024576040519150601f19603f3d011682016040523d82523d6000602084013e611029565b606091505b5091509150816110755760448151101561104257600080fd5b6004810190508080602001905181019061105c9190615152565b60405162461bcd60e51b8152600401610472919061496b565b600180546001600160a01b031916905595945050505050565b32331461109a57600080fd5b600554610100900460ff16156110c25760405162461bcd60e51b815260040161047290614bb8565b60055460ff16156110fe5760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610472565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190614e38565b90506000816001600160a01b03166335b03c176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e89190614e38565b905060006111f4610416565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f65d9dbe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127891906151ff565b6020890151604051634bf3ccad60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916397e7995a916112c9918691600401615218565b602060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906151ff565b60208a0151604051639c8912f160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639c8912f19161135b918791600401615218565b602060405180830381865afa158015611378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139c91906151ff565b60208b01516040516307218dad60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691631c8636b4916113ed918891600401615218565b602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e91906151ff565b6114389190614f8d565b6114429190614f8d565b106114855760405162461bcd60e51b815260206004820152601360248201527226a0ac2faa2920a222a9afa822a92fa820a4a960691b6044820152606401610472565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638049fde76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150791906151ff565b60405163f7b3c6fd60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f7b3c6fd90602401602060405180830381865afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159191906151ff565b106115ae5760405162461bcd60e51b815260040161047290615231565b600254886080015111156115f45760405162461bcd60e51b815260206004820152600d60248201526c41424f56455f4d41585f504f5360981b6044820152606401610472565b602088015160405163066c581160e11b815260048101919091526001600160a01b03831690630cd8b02290602401602060405180830381865afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906151ff565b8860e001518960800151611677919061525d565b10156116b55760405162461bcd60e51b815260206004820152600d60248201526c42454c4f575f4d494e5f504f5360981b6044820152606401610472565b60008860e0015111801561173b5750602088015160405163059a992d60e41b815260048101919091526001600160a01b038316906359a992d090602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173391906151ff565b8860e0015110155b80156117b957506020880151604051630a06da4f60e21b815260048101919091526001600160a01b0383169063281b693c90602401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b191906151ff565b8860e0015111155b6117fa5760405162461bcd60e51b815260206004820152601260248201527113115591549051d157d25390d3d4949150d560721b6044820152606401610472565b85158061190b575060006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663265aa62161183e60018a614d15565b6040518263ffffffff1660e01b815260040161185c91815260200190565b602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190614e38565b6040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa1580156118e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190991906151ff565b115b6119655760405162461bcd60e51b815260206004820152602560248201527f4e4f5f434f52524553504f4e44494e475f4e46545f5350524541445f5245445560448201526421aa24a7a760d91b6064820152608401610472565b610100880151158061199957508760c0015161198c578760a0015188610100015110611999565b8760a00151886101000151115b6119b55760405162461bcd60e51b815260040161047290614d54565b61012088015115806119e957508760c001516119dc578760a00151886101200151116119e9565b8760a00151886101200151105b611a055760405162461bcd60e51b815260040161047290614d76565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637ea95f3260008b602001518c60c001518d60e001518e60800151611a56919061525d565b6040516001600160e01b031960e087901b168152600481019490945260248401929092521515604483015260648201526084016040805180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac9919061527c565b5090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380f6cfc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e91906151ff565b60e08a0151611b5d908361525d565b1115611b7b5760405162461bcd60e51b8152600401610472906152a0565b608089015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692611bcf9287929091600401615024565b600060405180830381600087803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b5060009250611c0a915050565b886002811115611c1c57611c1c6152cf565b14611f3857602089015160405163226a27ad60e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916344d44f5a91611c7691879190600401615218565b602060405180830381865afa158015611c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb791906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d3b5fe70604051806101a00160405280866001600160a01b031681526020018d6020015181526020018481526020018d60800151815260200160008c11611d2c576000611dc5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016633dae10a0611d6660018f614d15565b6040518263ffffffff1660e01b8152600401611d8491815260200190565b602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc591906151ff565b81526020018d60c00151151581526020018d60e0015181526020018d610100015181526020018d610120015181526020018d60a0015181526020018d60a00151815260200143815260200160008152506040518263ffffffff1660e01b8152600401611e319190614d98565b600060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b5050505060208a0151604051630ec5706160e41b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163ec57061091611eb891879186908f906004016152e5565b600060405180830381600087803b158015611ed257600080fd5b505af1158015611ee6573d6000803e3d6000fd5b505050508960200151836001600160a01b03167fdfabd6f206f17b7f2e1f9e0d33c40d30d1e8d7b6a4f520a03fdc1c181105934383604051611f2a91815260200190565b60405180910390a3506121de565b6000846001600160a01b031663fa8dd4988b6020015160008d60e001518e60800151611f64919061525d565b6040518463ffffffff1660e01b8152600401611f8293929190615322565b6020604051808303816000875af1158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c76faf786040518060c00160405280604051806101400160405280886001600160a01b031681526020018f60200151815260200160008152602001600081526020018f608001518152602001600081526020018f60c00151151581526020018f60e0015181526020018f610100015181526020018f61012001518152508152602001600081526020018d60a0015181526020018a815260200160008c1161209a576000612133565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016633dae10a06120d460018f614d15565b6040518263ffffffff1660e01b81526004016120f291815260200190565b602060405180830381865afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213391906151ff565b815260200160008152508360016040518463ffffffff1660e01b815260040161215e9392919061534a565b600060405180830381600087803b15801561217857600080fd5b505af115801561218c573d6000803e3d6000fd5b505050508960200151836001600160a01b0316827f3e544118c04e3bb18b669475695cd270ba0e41fb13177483f01c14222de62a8660016040516121d4911515815260200190565b60405180910390a4505b6040516326e2ada160e21b81526001600160a01b03838116600483015286811660248301527f00000000000000000000000000000000000000000000000000000000000000001690639b8ab68490604401600060405180830381600087803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050505050505050505050565b32331461227857600080fd5b600554610100900460ff16156122a05760405162461bcd60e51b815260040161047290614bb8565b60006122aa610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8386866040518463ffffffff1660e01b81526004016122fe93929190614bd6565b61014060405180830381865afa15801561231c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123409190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58487876040518463ffffffff1660e01b815260040161239493929190614bd6565b60c060405180830381865afa1580156123b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d5919061538e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638049fde76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612435573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245991906151ff565b60405163f7b3c6fd60e01b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f7b3c6fd90602401602060405180830381865afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906151ff565b106125005760405162461bcd60e51b815260040161047290615231565b8060a00151156125495760405162461bcd60e51b81526020600482015260146024820152731053149150511657d091525391d7d0d313d4d15160621b6044820152606401610472565b60008260e001511161256d5760405162461bcd60e51b81526004016104729061540e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f19190614e38565b6001600160a01b031663fa8dd4988760016402540be4008760e0015187602001518960600151612621919061525d565b61262b919061525d565b6126359190615430565b6040518463ffffffff1660e01b815260040161265393929190615322565b6020604051808303816000875af1158015612672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269691906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c76faf786040518060c00160405280604051806101400160405280896001600160a01b031681526020018b81526020018a81526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525081526020016000815260200160008152602001600081526020016000815260200160008152508360006040518463ffffffff1660e01b81526004016127719392919061534a565b600060405180830381600087803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b5050505085846001600160a01b0316827f3e544118c04e3bb18b669475695cd270ba0e41fb13177483f01c14222de62a8660006040516127e3911515815260200190565b60405180910390a4505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa158015612851573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128759190614e38565b6001600160a01b0316336001600160a01b0316146128a55760405162461bcd60e51b815260040161047290614e55565b6005805460ff610100808304821615810261ff001990931692909217928390556040517fc3a6f986261de9467c2838c6df8ef74f9107855159205600c0bc7a14cdfd3888936108619390049091161515815260200190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561295b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297f9190614e38565b6001600160a01b0316336001600160a01b0316146129af5760405162461bcd60e51b815260040161047290614e55565b600081116129cf5760405162461bcd60e51b815260040161047290615105565b600481905560408051818152601391810191909152721b585c9ad95d13dc99195c9cd51a5b595bdd5d606a1b60608201526020810182905260008051602061555883398151915290608001610c30565b323314612a2b57600080fd5b600554610100900460ff1615612a535760405162461bcd60e51b815260040161047290614bb8565b6000612a5d610416565b905060018210158015612a71575060058211155b612aae5760405162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4e46545f5459504560901b6044820152606401610472565b6001600160a01b03808216907f00000000000000000000000000000000000000000000000000000000000000001663265aa621612aec600186614d15565b6040518263ffffffff1660e01b8152600401612b0a91815260200190565b602060405180830381865afa158015612b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4b9190614e38565b6001600160a01b0316636352211e856040518263ffffffff1660e01b8152600401612b7891815260200190565b602060405180830381865afa158015612b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb99190614e38565b6001600160a01b031614612bf85760405162461bcd60e51b81526020600482015260066024820152651393d7d3919560d21b6044820152606401610472565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f8d24b486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7a91906151ff565b60405163aa3b7d7760e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063aa3b7d7790602401602060405180830381865afa158015612cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0391906151ff565b612d0d9190614f8d565b431015612d4f5760405162461bcd60e51b815260206004820152601060248201526f535543434553535f54494d454c4f434b60801b6044820152606401610472565b612db060405180610140016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b6003886003811115612dc457612dc46152cf565b03612e7b57604051636e6f99cd60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a90612e19908a908a908a90600401614bd6565b602060405180830381865afa158015612e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5a9190614c02565b612e765760405162461bcd60e51b815260040161047290614c1f565b613076565b6040516351d407ff60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a3a80ffe90612ecb908a908a908a90600401614bd6565b61014060405180830381865afa158015612ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0d9190615371565b905060008160e0015111612f335760405162461bcd60e51b81526004016104729061540e565b6002886003811115612f4757612f476152cf565b03612fc2576000612f5782614664565b905081610120015160001480612f8757508160c00151612f7e578161012001518110612f87565b81610120015181115b612fbc5760405162461bcd60e51b8152602060048201526006602482015265121054d7d4d360d21b6044820152606401610472565b50613076565b6001886003811115612fd657612fd66152cf565b141580612fe857506000816101200151115b61301c5760405162461bcd60e51b81526020600482015260056024820152641393d7d4d360da1b6044820152606401610472565b6000886003811115613030576130306152cf565b14158061304257506000816101000151115b6130765760405162461bcd60e51b815260206004820152600560248201526404e4f5f54560dc1b6044820152606401610472565b60006040518060800160405280896001600160a01b031681526020018881526020018781526020018a60038111156130b0576130b06152cf565b905260405163108c3d4960e11b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321187a929061310190849060040161549d565b602060405180830381865afa15801561311e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131429190614c02565b15806131d65750604051633f1b72bf60e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc6dcafc9061319590849060040161549d565b602060405180830381865afa1580156131b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d69190614c02565b1561380f57600060038a60038111156131f1576131f16152cf565b0361340957604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c90613249908d908d908d90600401614bd6565b6101a060405180830381865afa158015613267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328b9190614c4c565b90508060c0015181606001516132a1919061525d565b602082015160a0830151604051633f54af9960e11b81526000600482018190526024820193909352901515604482015260648101839052919350906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637ea95f32906084016040805180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613350919061527c565b5090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380f6cfc26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d591906151ff565b60c08301516133e4908361525d565b11156134025760405162461bcd60e51b8152600401610472906152a0565b50506134cf565b6402540be4008360e001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58c8c8c6040518463ffffffff1660e01b815260040161346493929190614bd6565b60c060405180830381865afa158015613481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a5919061538e565b6020015185606001516134b8919061525d565b6134c2919061525d565b6134cc9190615430565b90505b604051633348540360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636690a8069061351f9087908c908690600401614bd6565b600060405180830381600087803b15801561353957600080fd5b505af115801561354d573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d59190614e38565b6001600160a01b031663fa8dd4988a60038e60038111156135f8576135f86152cf565b14613604576003613607565b60025b856040518463ffffffff1660e01b815260040161362693929190615322565b6020604051808303816000875af1158015613645573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366991906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663817fa1a46040518060c00160405280886001600160a01b031681526020018a81526020018d6001600160a01b031681526020018c81526020018b81526020018e60038111156136e7576136e76152cf565b815250836040518363ffffffff1660e01b81526004016137089291906154ab565b600060405180830381600087803b15801561372257600080fd5b505af1158015613736573d6000803e3d6000fd5b505060405163308f221b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c23c886c9150613788908690899060040161550b565b600060405180830381600087803b1580156137a257600080fd5b505af11580156137b6573d6000803e3d6000fd5b50505050888a6001600160a01b0316866001600160a01b03167f6d87222414c5850caf1d385b1e080a771b505825b082a2162d0f4af5ffc86c008460405161380091815260200190565b60405180910390a450506138d1565b6040516346ea285b60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906346ea285b9061385d908490879060040161550b565b600060405180830381600087803b15801561387757600080fd5b505af115801561388b573d6000803e3d6000fd5b5050505086886001600160a01b0316846001600160a01b03167fde7da272dc52e28c3b33c5c74b461da89b05bd790d845e82db2f69bbf08108e760405160405180910390a45b505050505050505050565b3233146138e857600080fd5b600554610100900460ff16156139105760405162461bcd60e51b815260040161047290614bb8565b600061391a610416565b604051636e6f99cd60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a9061396d90849087908790600401614bd6565b602060405180830381865afa15801561398a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ae9190614c02565b6139ca5760405162461bcd60e51b815260040161047290614c1f565b604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c90613a1d90859088908890600401614bd6565b6101a060405180830381865afa158015613a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5f9190614c4c565b905060035481610160015143613a759190614d15565b1015613a935760405162461bcd60e51b815260040161047290614d2c565b60405163b4b0f56760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4b0f56790613ae390859088908890600401614bd6565b600060405180830381600087803b158015613afd57600080fd5b505af1158015613b11573d6000803e3d6000fd5b50505050606081015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692613b6892918791600401615024565b600060405180830381600087803b158015613b8257600080fd5b505af1158015613b96573d6000803e3d6000fd5b5050505083826001600160a01b03167ff1b38881d7f4b2b12141c5f39c5124545d6112532eb6afbe9630cdbde3ee53e985604051613bd691815260200190565b60405180910390a350505050565b323314613bf057600080fd5b600554610100900460ff1615613c185760405162461bcd60e51b815260040161047290614bb8565b6000613c22610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8387876040518463ffffffff1660e01b8152600401613c7693929190614bd6565b61014060405180830381865afa158015613c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb89190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58488886040518463ffffffff1660e01b8152600401613d0c93929190614bd6565b60c060405180830381865afa158015613d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4d919061538e565b905060008260e0015111613d735760405162461bcd60e51b81526004016104729061540e565b60008260e001516064604b8560a00151613d8d919061525d565b613d979190615430565b613da19190615430565b9050841580613de057508260c00151613dcc57808360a00151613dc49190614f8d565b851115613de0565b808360a00151613ddc9190614d15565b8510155b613e195760405162461bcd60e51b815260206004820152600a602482015269534c5f544f4f5f42494760b01b6044820152606401610472565b6003546080830151613e2b9043614d15565b1015613e495760405162461bcd60e51b815260040161047290614d2c565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ecd9190614e38565b9050851580613fa95750806001600160a01b03166335b03c176040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f399190614e38565b6001600160a01b03166324abd3fb896040518263ffffffff1660e01b8152600401613f6691815260200190565b602060405180830381865afa158015613f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa79190614c02565b155b1561407d5760405163a354418160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a3544181906140009088908c908c908c90600401615531565b600060405180830381600087803b15801561401a57600080fd5b505af115801561402e573d6000803e3d6000fd5b5050604080518a8152602081018a90528b93506001600160a01b03891692507f1fc4a6c7ffe506697979b8ed54dc4135cd1ecd26a2745f70b760a2492222b316910160405180910390a361423b565b6000816001600160a01b031663fa8dd4988a60046402540be4008960e0015189602001518b606001516140b0919061525d565b6140ba919061525d565b6140c49190615430565b6040518463ffffffff1660e01b81526004016140e293929190615322565b6020604051808303816000875af1158015614101573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412591906151ff565b6040805160c080820183526001600160a01b038a81168352602083018e81528385018e815260a0808d015160608701908152948d01511515608087019081529086018f81529651635c109dfd60e11b81526004810189905295518416602487015291516044860152516064850152915160848401529051151560a4830152915160c482015291925083169063b8213bfa9060e401600060405180830381600087803b1580156141d357600080fd5b505af11580156141e7573d6000803e3d6000fd5b5050505088866001600160a01b0316827ffdfffd671d06639f57ee329f42ea52018346eb90ed43679721e81cc12bfa10548b8b604051614231929190918252602082015260400190565b60405180910390a4505b5050505050505050565b3233146142825760405162461bcd60e51b815260206004820152600b60248201526a1393d7d0d3d395149050d560aa1b6044820152606401610472565b33600090815260208190526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561430f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143339190614e38565b6001600160a01b0316336001600160a01b0316146143635760405162461bcd60e51b815260040161047290614e55565b600081116143835760405162461bcd60e51b815260040161047290615105565b600381905560408051818152601391810191909152726c696d69744f726465727354696d656c6f636b60681b60608201526020810182905260008051602061555883398151915290608001610c30565b3233146143df57600080fd5b600554610100900460ff16156144075760405162461bcd60e51b815260040161047290614bb8565b6000614411610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8387876040518463ffffffff1660e01b815260040161446593929190614bd6565b61014060405180830381865afa158015614483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a79190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58488886040518463ffffffff1660e01b81526004016144fb93929190614bd6565b60c060405180830381865afa158015614518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453c919061538e565b905060008260e00151116145625760405162461bcd60e51b81526004016104729061540e565b60035460608201516145749043614d15565b10156145925760405162461bcd60e51b815260040161047290614d2c565b604051637fdb96f360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fdb96f3906145e49086908a908a908a90600401615531565b600060405180830381600087803b1580156145fe57600080fd5b505af1158015614612573d6000803e3d6000fd5b505060408051888152602081018890528993506001600160a01b03871692507f7e06a81c7a47891ccc7455b5ccb2ed850e32bb655ccda67eb3ebaaeed83242a4910160405180910390a3505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636bc84d598360000151846020015185604001518660a001518760c001516402540be4007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58b600001518c602001518d604001516040518463ffffffff1660e01b815260040161471093929190614bd6565b60c060405180830381865afa15801561472d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614751919061538e565b602001518a60600151614764919061525d565b61476e9190615430565b60e08a8101516040519189901b6001600160e01b03191682526001600160a01b039790971660048201526024810195909552604485019390935260648401919091521515608483015260a482015260c481019190915260e401602060405180830381865afa1580156147e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061480891906151ff565b92915050565b600080600080600060a0868803121561482657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60006020828403121561485b57600080fd5b5035919050565b6001600160a01b038116811461487757600080fd5b50565b803561488581614862565b919050565b60008060006040848603121561489f57600080fd5b83356148aa81614862565b9250602084013567ffffffffffffffff808211156148c757600080fd5b818601915086601f8301126148db57600080fd5b8135818111156148ea57600080fd5b8760208285010111156148fc57600080fd5b6020830194508093505050509250925092565b60005b8381101561492a578181015183820152602001614912565b83811115614939576000848401525b50505050565b6000815180845261495781602086016020860161490f565b601f01601f19169290920160200192915050565b60208152600061497e602083018461493f565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff811182821017156149bf576149bf614985565b60405290565b6040516101a0810167ffffffffffffffff811182821017156149bf576149bf614985565b801515811461487757600080fd5b8035614885816149e9565b80356003811061488557600080fd5b60008060008060008587036101c0811215614a2b57600080fd5b61014080821215614a3b57600080fd5b614a4361499b565b9150614a4e8861487a565b82526020880135602083015260408801356040830152606088013560608301526080880135608083015260a088013560a0830152614a8e60c089016149f7565b60c083015260e088013560e0830152610100808901358184015250610120808901358184015250819650614ac3818901614a02565b9550505061016086013592506101808601359150614ae46101a0870161487a565b90509295509295909350565b60008060408385031215614b0357600080fd5b50508035926020909101359150565b60008060008060008060c08789031215614b2b57600080fd5b863560048110614b3a57600080fd5b95506020870135614b4a81614862565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600060608486031215614b8457600080fd5b505081359360208301359350604090920135919050565b600060208284031215614bad57600080fd5b813561497e81614862565b602080825260049082015263444f4e4560e01b604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b8051614885816149e9565b600060208284031215614c1457600080fd5b815161497e816149e9565b6020808252600890820152671393d7d31253525560c21b604082015260600190565b805161488581614862565b60006101a08284031215614c5f57600080fd5b614c676149c5565b614c7083614c41565b815260208301516020820152604083015160408201526060830151606082015260808301516080820152614ca660a08401614bf7565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101608084015190820152610180928301519281019290925250919050565b634e487b7160e01b600052601160045260246000fd5b600082821015614d2757614d27614cff565b500390565b6020808252600e908201526d4c494d49545f54494d454c4f434b60901b604082015260600190565b602080825260089082015267057524f4e475f54560c41b604082015260600190565b60208082526008908201526715d493d391d7d4d360c21b604082015260600190565b81516001600160a01b031681526101a081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151614de560a084018215159052565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018092830151929091019190915290565b600060208284031215614e4a57600080fd5b815161497e81614862565b602080825260089082015267474f565f4f4e4c5960c01b604082015260600190565b60006101408284031215614e8a57600080fd5b614e9261499b565b9050614e9d82614c41565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a0820152614edd60c08301614bf7565b60c082015260e082015160e082015261010080830151818301525061012080830151818301525092915050565b60006101e08284031215614f1d57600080fd5b60405160c0810181811067ffffffffffffffff82111715614f4057614f40614985565b604052614f4d8484614e77565b81526101408301516020820152610160830151604082015261018083015160608201526101a083015160808201526101c09092015160a083015250919050565b60008219821115614fa057614fa0614cff565b500190565b6020808252600c908201526b15d0525517d512535153d55560a21b604082015260600190565b6020808252600e908201526d2727aa2faca7aaa92fa7a92222a960911b604082015260600190565b60208082526017908201527657524f4e475f4d41524b45545f4f524445525f5459504560481b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b805180516001600160a01b031683526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015161509c60c085018215159052565b5060e081810151908401526101008082015190840152610120908101519083015260208101516101408301526040810151610160830152606081015161018083015260808101516101a083015260a001516101c090910152565b6101e081016148088284615048565b602080825260079082015266056414c55455f360cc1b604082015260600190565b6000825161513881846020870161490f565b9190910192915050565b8183823760009101908152919050565b60006020828403121561516457600080fd5b815167ffffffffffffffff8082111561517c57600080fd5b818401915084601f83011261519057600080fd5b8151818111156151a2576151a2614985565b604051601f8201601f19908116603f011681019083821181831017156151ca576151ca614985565b816040528281528760208487010111156151e357600080fd5b6151f483602083016020880161490f565b979650505050505050565b60006020828403121561521157600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601290820152714d41585f50454e44494e475f4f524445525360701b604082015260600190565b600081600019048311821515161561527757615277614cff565b500290565b6000806040838503121561528f57600080fd5b505080516020909101519092909150565b6020808252601590820152740a0a492868abe929aa08286a8bea89e9ebe90928e9605b1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038516815260208101849052604081018390526080810160038310615313576153136152cf565b82606083015295945050505050565b8381526060810160058410615339576153396152cf565b602082019390935260400152919050565b61022081016153598286615048565b836101e0830152821515610200830152949350505050565b6000610140828403121561538457600080fd5b61497e8383614e77565b600060c082840312156153a057600080fd5b60405160c0810181811067ffffffffffffffff821117156153c3576153c3614985565b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a0830151615402816149e9565b60a08201529392505050565b6020808252600890820152674e4f5f545241444560c01b604082015260600190565b60008261544d57634e487b7160e01b600052601260045260246000fd5b500490565b60048110615462576154626152cf565b9052565b60018060a01b038151168252602081015160208301526040810151604083015260608101516154986060840182615452565b505050565b608081016148088284615466565b600060e08201905060018060a01b038085511683526020850151602084015280604086015116604084015250606084015160608301526080840151608083015260a08401516154fd60a0840182615452565b508260c08301529392505050565b60a081016155198285615466565b6001600160a01b039290921660809190910152919050565b6001600160a01b039490941684526020840192909252604083015260608201526080019056fe8cf3e35f6221b16e1670a3413180c9484bf5aa71787905909fa82a6a2662e9aba2646970667358221220cbcfbfdc031f4f0ee8229b2cebab7f81322a3712ae5019c1139dd57bc7533da264736f6c634300080f00330000000000000000000000004d2df485c608aa55a23d8d98dd2b4fa24ba0f2cf0000000000000000000000003982e3de77dad60373c0c2c539fcb93bd288d2f5000000000000000000000000e780bbf94b0257fedccf4eaecbc70722e6f5f574000000000000000000000000022e26d7ddad3fc311c6472949f19c99b3cb08e600000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

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

0000000000000000000000004d2df485c608aa55a23d8d98dd2b4fa24ba0f2cf0000000000000000000000003982e3de77dad60373c0c2c539fcb93bd288d2f5000000000000000000000000e780bbf94b0257fedccf4eaecbc70722e6f5f574000000000000000000000000022e26d7ddad3fc311c6472949f19c99b3cb08e600000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

-----Decoded View---------------
Arg [0] : _storageT (address): 0x4d2df485c608aa55a23d8d98dd2b4fa24ba0f2cf
Arg [1] : _nftRewards (address): 0x3982e3de77dad60373c0c2c539fcb93bd288d2f5
Arg [2] : _pairInfos (address): 0xe780bbf94b0257fedccf4eaecbc70722e6f5f574
Arg [3] : _referrals (address): 0x022e26d7ddad3fc311c6472949f19c99b3cb08e6
Arg [4] : _maxPosDai (uint256): 100000000000000000000000
Arg [5] : _limitOrdersTimelock (uint256): 30
Arg [6] : _marketOrdersTimeout (uint256): 30

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d2df485c608aa55a23d8d98dd2b4fa24ba0f2cf
Arg [1] : 0000000000000000000000003982e3de77dad60373c0c2c539fcb93bd288d2f5
Arg [2] : 000000000000000000000000e780bbf94b0257fedccf4eaecbc70722e6f5f574
Arg [3] : 000000000000000000000000022e26d7ddad3fc311c6472949f19c99b3cb08e6
Arg [4] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e


Deployed ByteCode Sourcemap

14592:21448:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15100:31;;;;;;;;;160:25:1;;;148:2;133:18;15100:31:0;;;;;;;;14315:202;;;:::i;:::-;;;-1:-1:-1;;;;;469:32:1;;;451:51;;439:2;424:18;14315:202:0;305:203:1;14776:50:0;;;;;14669:44;;;;;15034:21;;;;;;25127:1071;;;;;;:::i;:::-;;:::i;:::-;;13503:90;;13561:10;13583:1;13549:23;;;;;;;;;;:36;;-1:-1:-1;;;;;;13549:36:0;;;13503:90;15157:31;;;;;;14720:49;;;;;18987:106;;;:::i;34189:754::-;;;;;;:::i;:::-;;:::i;15288:18::-;;;;;;;;;;;;;;;2130:14:1;;2123:22;2105:41;;2093:2;2078:18;15288::0;1965:187:1;18331:185:0;;;;;;:::i;:::-;;:::i;34955:1082::-;;;;;;:::i;:::-;;:::i;13601:704::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19242:4486::-;;;;;;:::i;:::-;;:::i;23765:1320::-;;;;;;:::i;:::-;;:::i;19099:97::-;;;:::i;15230:20::-;;;;;;;;;18743:215;;;;;;:::i;:::-;;:::i;29659:3967::-;;;;;;:::i;:::-;;:::i;26206:736::-;;;;;;:::i;:::-;;:::i;27745:1878::-;;;;;;:::i;:::-;;:::i;13241:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;13241:47:0;;;13334:161;;;;;;:::i;:::-;;:::i;14833:52::-;;;;;18522:215;;;;;;:::i;:::-;;:::i;26985:752::-;;;;;;:::i;:::-;;:::i;14315:202::-;14382:14;;14358:7;;-1:-1:-1;;;;;14382:14:0;14378:132;;-1:-1:-1;14434:10:0;;14315:202::o;14378:132::-;-1:-1:-1;14484:14:0;;-1:-1:-1;;;;;14484:14:0;;14315:202::o;25127:1071::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;;;;;;;;;25324:14:::2;25341:12;:10;:12::i;:::-;25374:52;::::0;-1:-1:-1;;;25374:52:0;;25324:29;;-1:-1:-1;;;;;;25374:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;25324:29;;25409:9;;25420:5;;25374:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25366:86;;;;-1:-1:-1::0;;;25366:86:0::2;;;;;;;:::i;:::-;25510:76;::::0;-1:-1:-1;;;25510:76:0;;25465:42:::2;::::0;-1:-1:-1;;;;;25510:8:0::2;:26;::::0;::::2;::::0;:76:::2;::::0;25551:6;;25559:9;;25570:5;;25510:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25465:121;;25633:19;;25622:1;:7;;;25607:12;:22;;;;:::i;:::-;:45;;25599:72;;;;-1:-1:-1::0;;;25599:72:0::2;;;;;;;:::i;:::-;25692:7:::0;;;:70:::2;;;25704:1;:5;;;:57;;25756:5;25751:2;:10;25704:57;;;25730:5;25725:2;:10;25704:57;25684:91;;;;-1:-1:-1::0;;;25684:91:0::2;;;;;;;:::i;:::-;25796:7:::0;;;:70:::2;;;25808:1;:5;;;:57;;25860:5;25855:2;:10;25808:57;;;25834:5;25829:2;:10;25808:57;25788:91;;;;-1:-1:-1::0;;;25788:91:0::2;;;;;;;:::i;:::-;25892:10;::::0;::::2;:18:::0;;;25921:10:::2;::::0;::::2;:18:::0;;;25952:4:::2;::::0;::::2;:9:::0;;;25972:4:::2;::::0;::::2;:9:::0;;;-1:-1:-1;25994:32:0;-1:-1:-1;;;25994:32:0;;-1:-1:-1;;;;;25994:8:0::2;:29;::::0;::::2;::::0;:32:::2;::::0;25892:1;;25994:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;26044:146:0::2;::::0;;13450:25:1;;;13506:2;13491:18;;13484:34;;;13534:18;;;13527:34;;;13592:2;13577:18;;13570:34;;;26096:9:0;;-1:-1:-1;;;;;;26044:146:0;::::2;::::0;-1:-1:-1;26044:146:0::2;::::0;13437:3:1;13422:19;26044:146:0::2;;;;;;;25311:887;;25127:1071:::0;;;;;:::o;18987:106::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;19043:8:::1;::::0;;::::1;::::0;;::::1;19042:9;-1:-1:-1::0;;19031:20:0;;::::1;::::0;::::1;::::0;;;19069:16:::1;::::0;19076:8;;2130:14:1;2123:22;2105:41;;19069:16:0::1;::::0;2093:2:1;2078:18;19069:16:0::1;;;;;;;;18987:106::o:0;34189:754::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;34273:14:::2;34290:12;:10;:12::i;:::-;34377:41;::::0;-1:-1:-1;;;34377:41:0;;::::2;::::0;::::2;160:25:1::0;;;34273:29:0;;-1:-1:-1;34315:46:0::2;::::0;-1:-1:-1;;;;;34377:8:0::2;:33;::::0;::::2;::::0;133:18:1;;34377:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34467:7:::0;;34495::::2;::::0;::::2;::::0;34315:103;;-1:-1:-1;34467:7:0;34495:11;;;;:73:::2;;;34549:19;;34539:1;:7;;;:29;;;;:::i;:::-;34523:12;:45;;34495:73;34487:98;;;;-1:-1:-1::0;;;34487:98:0::2;;;;;;;:::i;:::-;34618:6;-1:-1:-1::0;;;;;34606:18:0::2;:1;:8;;;-1:-1:-1::0;;;;;34606:18:0::2;;34598:45;;;;-1:-1:-1::0;;;34598:45:0::2;;;;;;;:::i;:::-;34675:1;34662;:10;;;:14;34654:50;;;;-1:-1:-1::0;;;34654:50:0::2;;;;;;;:::i;:::-;34717:51;::::0;-1:-1:-1;;;34717:51:0;;::::2;::::0;::::2;17195:25:1::0;;;34763:4:0::2;17236:18:1::0;;;17229:50;34717:8:0::2;-1:-1:-1::0;;;;;34717:37:0::2;::::0;::::2;::::0;17168:18:1;;34717:51:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;34827:17:0::2;::::0;::::2;::::0;34779:66:::2;::::0;-1:-1:-1;;;34779:66:0;;:8:::2;-1:-1:-1::0;;;;;34779:20:0;::::2;::::0;::::2;::::0;:66:::2;::::0;:8;34819:6;;34779:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;34902:6;34863:72;34923:1;34863:72;;;;;;:::i;:::-;;;;;;;;34262:681;;;34189:754:::0;:::o;18331:185::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18408:1:::1;18400:5;:9;18392:29;;;;-1:-1:-1::0;;;18392:29:0::1;;;;;;;:::i;:::-;18432:9;:17:::0;;;18475:33:::1;::::0;;19507:21:1;;;19564:1;19544:18;;;19537:29;;;;-1:-1:-1;;;19597:2:1;19582:18;;19575:39;19681:4;19666:20;;19659:36;;;-1:-1:-1;;;;;;;;;;;18475:33:0;19646:3:1;19631:19;18475:33:0::1;;;;;;;;18331:185:::0;:::o;34955:1082::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;35040:14:::2;35057:12;:10;:12::i;:::-;35144:41;::::0;-1:-1:-1;;;35144:41:0;;::::2;::::0;::::2;160:25:1::0;;;35040:29:0;;-1:-1:-1;35082:46:0::2;::::0;-1:-1:-1;;;;;35144:8:0::2;:33;::::0;::::2;::::0;133:18:1;;35144:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35234:7:::0;;35262::::2;::::0;::::2;::::0;35082:103;;-1:-1:-1;35234:7:0;35262:11;;;;:73:::2;;;35316:19;;35306:1;:7;;;:29;;;;:::i;:::-;35290:12;:45;;35262:73;35254:98;;;;-1:-1:-1::0;;;35254:98:0::2;;;;;;;:::i;:::-;35385:6;-1:-1:-1::0;;;;;35373:18:0::2;:1;:8;;;-1:-1:-1::0;;;;;35373:18:0::2;;35365:45;;;;-1:-1:-1::0;;;35365:45:0::2;;;;;;;:::i;:::-;35429:10;::::0;::::2;::::0;:15;35421:51:::2;;;;-1:-1:-1::0;;;35421:51:0::2;;;;;;;:::i;:::-;35485:52;::::0;-1:-1:-1;;;35485:52:0;;::::2;::::0;::::2;17195:25:1::0;;;35531:5:0::2;17236:18:1::0;;;17229:50;35485:8:0::2;-1:-1:-1::0;;;;;35485:37:0::2;::::0;::::2;::::0;17168:18:1;;35485:52:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;35706:11:0::2;::::0;::::2;::::0;35736:7:::2;::::0;;::::2;::::0;35610:148;;::::2;::::0;::::2;19880:25:1::0;;;;19921:18;;;19914:34;35551:12:0::2;::::0;-1:-1:-1;35577:4:0::2;::::0;19853:18:1;;35610:148:0::2;::::0;;-1:-1:-1;;35610:148:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;35610:148:0::2;-1:-1:-1::0;;;35610:148:0::2;::::0;;35569:200;::::2;::::0;35610:148;35569:200:::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35550:219;;;35786:7;35782:158;;35876:1;:11;;;35851:6;-1:-1:-1::0;;;;;35814:114:0::2;;35906:1;:7;;;35814:114;;;;160:25:1::0;;148:2;133:18;;14:177;35814:114:0::2;;;;;;;;35782:158;35996:6;35957:72;36017:1;35957:72;;;;;;:::i;:::-;;;;;;;;35029:1008;;;;34955:1082:::0;:::o;13601:704::-;-1:-1:-1;;;;;13719:19:0;;;:11;:19;;;;;;;;;;;13686:12;;13719:19;13742:10;13719:33;13711:67;;;;-1:-1:-1;;;13711:67:0;;20440:2:1;13711:67:0;;;20422:21:1;20479:2;20459:18;;;20452:30;-1:-1:-1;;;20498:18:1;;;20491:51;20559:18;;13711:67:0;20238:345:1;13711:67:0;13791:14;:23;;-1:-1:-1;;;;;;13791:23:0;-1:-1:-1;;;;;13791:23:0;;;;;13863:37;;-1:-1:-1;;;;13871:4:0;;13863:37;;13890:9;;;;13863:37;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13825:75;;;;13916:7;13911:321;;14073:2;14057:6;:13;:18;14053:32;;;14077:8;;;14053:32;14150:4;14142:6;14138:17;14128:27;;14202:6;14191:28;;;;;;;;;;;;:::i;:::-;14184:36;;-1:-1:-1;;;14184:36:0;;;;;;;;:::i;13911:321::-;14244:14;:27;;-1:-1:-1;;;;;;14244:27:0;;;14291:6;13601:704;-1:-1:-1;;;;;13601:704:0:o;19242:4486::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;19554:8:::2;::::0;::::2;;19553:9;19545:28;;;::::0;-1:-1:-1;;;19545:28:0;;22179:2:1;19545:28:0::2;::::0;::::2;22161:21:1::0;22218:1;22198:18;;;22191:29;-1:-1:-1;;;22236:18:1;;;22229:36;22282:18;;19545:28:0::2;21977:329:1::0;19545:28:0::2;19586:34;19623:8;-1:-1:-1::0;;;;;19623:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19586:63;;19660:35;19698:10;-1:-1:-1::0;;;;;19698:23:0::2;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19660:63;;19736:14;19753:12;:10;:12::i;:::-;19736:29;;19981:8;-1:-1:-1::0;;;;;19981:25:0::2;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19953:11;::::0;::::2;::::0;19915:50:::2;::::0;-1:-1:-1;;;19915:50:0;;-1:-1:-1;;;;;19915:8:0::2;:29;::::0;::::2;::::0;:50:::2;::::0;19945:6;;19915:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19887:11;::::0;::::2;::::0;19847:52:::2;::::0;-1:-1:-1;;;19847:52:0;;-1:-1:-1;;;;;19847:8:0::2;:31;::::0;::::2;::::0;:52:::2;::::0;19879:6;;19847:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19819:11;::::0;::::2;::::0;19786:45:::2;::::0;-1:-1:-1;;;19786:45:0;;-1:-1:-1;;;;;19786:8:0::2;:24;::::0;::::2;::::0;:45:::2;::::0;19811:6;;19786:45:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:113;;;;:::i;:::-;:179;;;;:::i;:::-;:222;19778:268;;;::::0;-1:-1:-1;;;19778:268:0;;23555:2:1;19778:268:0::2;::::0;::::2;23537:21:1::0;23594:2;23574:18;;;23567:30;-1:-1:-1;;;23613:18:1;;;23606:49;23672:18;;19778:268:0::2;23353:343:1::0;19778:268:0::2;20120:8;-1:-1:-1::0;;;;;20120:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20067:37;::::0;-1:-1:-1;;;20067:37:0;;-1:-1:-1;;;;;469:32:1;;;20067:37:0::2;::::0;::::2;451:51:1::0;20067:8:0::2;:29;::::0;::::2;::::0;424:18:1;;20067:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;20059:131;;;;-1:-1:-1::0;;;20059:131:0::2;;;;;;;:::i;:::-;20232:9;;20211:1;:17;;;:30;;20203:56;;;::::0;-1:-1:-1;;;20203:56:0;;24250:2:1;20203:56:0::2;::::0;::::2;24232:21:1::0;24289:2;24269:18;;;24262:30;-1:-1:-1;;;24308:18:1;;;24301:43;24361:18;;20203:56:0::2;24048:337:1::0;20203:56:0::2;20354:11;::::0;::::2;::::0;20325:41:::2;::::0;-1:-1:-1;;;20325:41:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20325:28:0;::::2;::::0;::::2;::::0;133:18:1;;20325:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20298:1;:10;;;20278:1;:17;;;:30;;;;:::i;:::-;:88;;20270:114;;;::::0;-1:-1:-1;;;20270:114:0;;24765:2:1;20270:114:0::2;::::0;::::2;24747:21:1::0;24804:2;24784:18;;;24777:30;-1:-1:-1;;;24823:18:1;;;24816:43;24876:18;;20270:114:0::2;24563:337:1::0;20270:114:0::2;20418:1;20405;:10;;;:14;:72;;;;-1:-1:-1::0;20465:11:0::2;::::0;::::2;::::0;20437:40:::2;::::0;-1:-1:-1;;;20437:40:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20437:27:0;::::2;::::0;::::2;::::0;133:18:1;;20437:40:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20423:1;:10;;;:54;;20405:72;:144;;;;-1:-1:-1::0;20537:11:0::2;::::0;::::2;::::0;20509:40:::2;::::0;-1:-1:-1;;;20509:40:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20509:27:0;::::2;::::0;::::2;::::0;133:18:1;;20509:40:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20495:1;:10;;;:54;;20405:144;20397:189;;;::::0;-1:-1:-1;;;20397:189:0;;25107:2:1;20397:189:0::2;::::0;::::2;25089:21:1::0;25146:2;25126:18;;;25119:30;-1:-1:-1;;;25165:18:1;;;25158:48;25223:18;;20397:189:0::2;24905:342:1::0;20397:189:0::2;20607:22:::0;;;:97:::2;;-1:-1:-1::0;20703:1:0::2;-1:-1:-1::0;;;;;20646:8:0::2;:13;;20660:21;20680:1;20660:17:::0;:21:::2;:::i;:::-;20646:36;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;20646:36:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;::::0;-1:-1:-1;;;20646:54:0;;-1:-1:-1;;;;;469:32:1;;;20646:54:0::2;::::0;::::2;451:51:1::0;20646:46:0;;;::::2;::::0;::::2;::::0;424:18:1;;20646:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;20607:97;20599:160;;;::::0;-1:-1:-1;;;20599:160:0;;25732:2:1;20599:160:0::2;::::0;::::2;25714:21:1::0;25771:2;25751:18;;;25744:30;25810:34;25790:18;;;25783:62;-1:-1:-1;;;25861:18:1;;;25854:35;25906:19;;20599:160:0::2;25530:401:1::0;20599:160:0::2;20780:4;::::0;::::2;::::0;:9;;:96:::2;;;20794:1;:5;;;:81;;20864:1;:11;;;20857:1;:4;;;:18;20794:81;;;20826:1;:11;;;20819:1;:4;;;:18;20794:81;20772:117;;;;-1:-1:-1::0;;;20772:117:0::2;;;;;;;:::i;:::-;20910:4;::::0;::::2;::::0;:9;;:96:::2;;;20924:1;:5;;;:81;;20994:1;:11;;;20987:1;:4;;;:18;20924:81;;;20956:1;:11;;;20949:1;:4;;;:18;20924:81;20902:117;;;;-1:-1:-1::0;;;20902:117:0::2;;;;;;;:::i;:::-;21033:17;21056:9;-1:-1:-1::0;;;;;21056:29:0::2;;21100:1;21116;:11;;;21142:1;:5;;;21182:1;:10;;;21162:1;:17;;;:30;;;;:::i;:::-;21056:147;::::0;-1:-1:-1;;;;;;21056:147:0::2;::::0;;;;;;::::2;::::0;::::2;26169:25:1::0;;;;26210:18;;;26203:34;;;;26280:14;26273:22;26253:18;;;26246:50;26312:18;;;26305:34;26141:19;;21056:147:0::2;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21032:171;;;21266:9;-1:-1:-1::0;;;;;21266:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21239:10;::::0;::::2;::::0;21224:25:::2;::::0;:12;:25:::2;:::i;:::-;:75;;21216:109;;;;-1:-1:-1::0;;;21216:109:0::2;;;;;;;:::i;:::-;21386:17;::::0;::::2;::::0;21338:66:::2;::::0;-1:-1:-1;;;21338:66:0;;:8:::2;-1:-1:-1::0;;;;;21338:20:0;::::2;::::0;::::2;::::0;:66:::2;::::0;21359:6;;21338:8;;:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;21433:47:0::2;::::0;-1:-1:-1;21420:60:0::2;::::0;-1:-1:-1;;21420:60:0;::::2;:9;:60;;;;;;;;:::i;:::-;;21417:2238;;21551:11;::::0;::::2;::::0;21509:54:::2;::::0;-1:-1:-1;;;21509:54:0;;21496:10:::2;::::0;-1:-1:-1;;;;;21509:8:0::2;:33;::::0;::::2;::::0;:54:::2;::::0;21543:6;;21551:11;21509:54:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21496:67;;21580:8;-1:-1:-1::0;;;;;21580:28:0::2;;21627:575;;;;;;;;21683:6;-1:-1:-1::0;;;;;21627:575:0::2;;;;;21712:1;:11;;;21627:575;;;;21746:5;21627:575;;;;21774:1;:17;;;21627:575;;;;21834:1;21814:17;:21;:127;;21940:1;21814:127;;;-1:-1:-1::0;;;;;21863:8:0::2;:26;;21890:21;21910:1;21890:17:::0;:21:::2;:::i;:::-;21863:49;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;21863:49:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21627:575;;;;21964:1;:5;;;21627:575;;;;;;21992:1;:10;;;21627:575;;;;22025:1;:4;;;21627:575;;;;22052:1;:4;;;21627:575;;;;22079:1;:11;;;21627:575;;;;22113:1;:11;;;21627:575;;;;22147:12;21627:575;;;;22182:1;21627:575;;::::0;21580:637:::2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;22275:11:0::2;::::0;::::2;::::0;22234:71:::2;::::0;-1:-1:-1;;;22234:71:0;;:10:::2;-1:-1:-1::0;;;;;22234:32:0::2;::::0;::::2;::::0;:71:::2;::::0;22267:6;;22288:5;;22295:9;;22234:71:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22386:1;:11;;;22361:6;-1:-1:-1::0;;;;;22327:109:0::2;;22416:5;22327:109;;;;160:25:1::0;;148:2;133:18;;14:177;22327:109:0::2;;;;;;;;21481:969;21417:2238;;;22469:12;22484:10;-1:-1:-1::0;;;;;22484:19:0::2;;22522:1;:11;;;22553:45;22638:1;:10;;;22618:1;:17;;;:30;;;;:::i;:::-;22484:179;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22469:194;;22680:8;-1:-1:-1::0;;;;;22680:32:0::2;;22731:721;;;;;;;;22791:378;;;;;;;;22842:6;-1:-1:-1::0;;;;;22791:378:0::2;;;;;22875:1;:11;;;22791:378;;;;22913:1;22791:378;;;;22941:1;22791:378;;;;22969:1;:17;;;22791:378;;;;23013:1;22791:378;;;;23042:1;:5;;;22791:378;;;;;;23074:1;:10;;;22791:378;;;;23111:1;:4;;;22791:378;;;;23142:1;:4;;;22791:378;;::::0;22731:721:::2;;;;23192:1;22731:721;;;;23216:1;:11;;;22731:721;;;;23250:9;22731:721;;;;23302:1;23282:17;:21;:127;;23408:1;23282:127;;;-1:-1:-1::0;;;;;23331:8:0::2;:26;;23358:21;23378:1;23358:17:::0;:21:::2;:::i;:::-;23331:49;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;23331:49:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22731:721;;;;23432:1;22731:721;;::::0;23454:7:::2;23463:4;22680:802;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;23594:1;:11;;;23569:6;-1:-1:-1::0;;;;;23504:139:0::2;23543:7;23504:139;23624:4;23504:139;;;;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;23504:139:0::2;;;;;;;;22454:1201;21417:2238;23667:53;::::0;-1:-1:-1;;;23667:53:0;;-1:-1:-1;;;;;28638:15:1;;;23667:53:0::2;::::0;::::2;28620:34:1::0;28690:15;;;28670:18;;;28663:43;23667:9:0::2;:35;::::0;::::2;::::0;28555:18:1;;23667:53:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;19532:4196;;;;19242:4486:::0;;;;;:::o;23765:1320::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;23885:14:::2;23902:12;:10;:12::i;:::-;23885:29;;23927:33;23963:8;-1:-1:-1::0;;;;;23963:19:0::2;;23997:6;24005:9;24016:5;23963:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23927:105;;24045:37;24085:8;-1:-1:-1::0;;;;;24085:23:0::2;;24123:6;24131:9;24142:5;24085:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24045:113;;24232:8;-1:-1:-1::0;;;;;24232:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24179:37;::::0;-1:-1:-1;;;24179:37:0;;-1:-1:-1;;;;;469:32:1;;;24179:37:0::2;::::0;::::2;451:51:1::0;24179:8:0::2;:29;::::0;::::2;::::0;424:18:1;;24179:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;24171:117;;;;-1:-1:-1::0;;;24171:117:0::2;;;;;;;:::i;:::-;24310:1;:19;;;24309:20;24301:53;;;::::0;-1:-1:-1;;;24301:53:0;;29982:2:1;24301:53:0::2;::::0;::::2;29964:21:1::0;30021:2;30001:18;;;29994:30;-1:-1:-1;;;30040:18:1;;;30033:50;30100:18;;24301:53:0::2;29780:344:1::0;24301:53:0::2;24386:1;24373;:10;;;:14;24365:35;;;;-1:-1:-1::0;;;24365:35:0::2;;;;;;;:::i;:::-;24413:12;24428:8;-1:-1:-1::0;;;;;24428:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24428:35:0::2;;24478:9;24503:46;14946:4;24603:1;:10;;;24585:1;:15;;;24565:1;:17;;;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;24428:208;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24413:223;;24649:8;-1:-1:-1::0;;;;;24649:32:0::2;;24696:218;;;;;;;;24752:115;;;;;;;;24799:6;-1:-1:-1::0;;;;;24752:115:0::2;;;;;24807:9;24752:115;;;;24818:5;24752:115;;;;24825:1;24752:115;;;;24828:1;24752:115;;;;24831:1;24752:115;;;;24834:5;24752:115;;;;;;24841:1;24752:115;;;;24844:1;24752:115;;;;24847:1;24752:115;;::::0;24696:218:::2;;;;24886:1;24696:218;;;;24889:1;24696:218;;;;24892:1;24696:218;;;;24895:1;24696:218;;;;24898:1;24696:218;;::::0;24916:7:::2;24925:5;24649:292;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;25037:9;25016:6;-1:-1:-1::0;;;;;24959:118:0::2;24994:7;24959:118;25061:5;24959:118;;;;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;24959:118:0::2;;;;;;;;23872:1213;;;;23765:1320:::0;;:::o;19099:97::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;19152:6:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;19151:7;19142:16:::0;::::1;-1:-1:-1::0;;19142:16:0;;::::1;::::0;;;::::1;::::0;;;;19176:12:::1;::::0;::::1;::::0;::::1;::::0;19181:6;::::1;::::0;;::::1;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;18743:215:0;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18830:1:::1;18822:5;:9;18814:29;;;;-1:-1:-1::0;;;18814:29:0::1;;;;;;;:::i;:::-;18854:19;:27:::0;;;18907:43:::1;::::0;;30899:21:1;;;30956:2;30936:18;;;30929:30;;;;-1:-1:-1;;;30990:2:1;30975:18;;30968:49;31084:4;31069:20;;31062:36;;;-1:-1:-1;;;;;;;;;;;18907:43:0;31049:3:1;31034:19;18907:43:0::1;30687:417:1::0;29659:3967:0;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;29901:14:::2;29918:12;:10;:12::i;:::-;29901:29;;29962:1;29951:7;:12;;:28;;;;;29978:1;29967:7;:12;;29951:28;29943:55;;;::::0;-1:-1:-1;;;29943:55:0;;31311:2:1;29943:55:0::2;::::0;::::2;31293:21:1::0;31350:2;31330:18;;;31323:30;-1:-1:-1;;;31369:18:1;;;31362:44;31423:18;;29943:55:0::2;31109:338:1::0;29943:55:0::2;-1:-1:-1::0;;;;;30017:51:0;;::::2;::::0;:8:::2;:13;;30031:11;30041:1;30031:7:::0;:11:::2;:::i;:::-;30017:26;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;30017:26:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30017:34:0::2;;30052:5;30017:41;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;30017:41:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30017:51:0::2;;30009:70;;;::::0;-1:-1:-1;;;30009:70:0;;31654:2:1;30009:70:0::2;::::0;::::2;31636:21:1::0;31693:1;31673:18;;;31666:29;-1:-1:-1;;;31711:18:1;;;31704:36;31757:18;;30009:70:0::2;31452:329:1::0;30009:70:0::2;30162:8;-1:-1:-1::0;;;;;30162:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30129:30;::::0;-1:-1:-1;;;30129:30:0;;::::2;::::0;::::2;160:25:1::0;;;30129:8:0::2;-1:-1:-1::0;;;;;30129:23:0::2;::::0;::::2;::::0;133:18:1;;30129:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;30100:12;:91;;30092:133;;;::::0;-1:-1:-1;;;30092:133:0;;31988:2:1;30092:133:0::2;::::0;::::2;31970:21:1::0;32027:2;32007:18;;;32000:30;-1:-1:-1;;;32046:18:1;;;32039:46;32102:18;;30092:133:0::2;31786:340:1::0;30092:133:0::2;30238:33;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30238:33:0::2;30300:34;30287:9;:47;;;;;;;;:::i;:::-;::::0;30284:852:::2;;30358:52;::::0;-1:-1:-1;;;30358:52:0;;-1:-1:-1;;;;;30358:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;30385:6;;30393:9;;30404:5;;30358:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30350:90;;;;-1:-1:-1::0;;;30350:90:0::2;;;;;;;:::i;:::-;30284:852;;;30477:45;::::0;-1:-1:-1;;;30477:45:0;;-1:-1:-1;;;;;30477:8:0::2;:19;::::0;::::2;::::0;:45:::2;::::0;30497:6;;30505:9;;30516:5;;30477:45:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30473:49;;30560:1;30547;:10;;;:14;30539:35;;;;-1:-1:-1::0;;;30539:35:0::2;;;;;;;:::i;:::-;30607:33;30594:9;:46;;;;;;;;:::i;:::-;::::0;30591:534:::2;;30660:13;30676:27;30701:1;30676:24;:27::i;:::-;30660:43;;30748:1;:4;;;30756:1;30748:9;:98;;;;30762:1;:5;;;:83;;30841:1;:4;;;30830:8;:15;30762:83;;;30802:1;:4;;;30791:8;:15;30762:83;30740:117;;;::::0;-1:-1:-1;;;30740:117:0;;32333:2:1;30740:117:0::2;::::0;::::2;32315:21:1::0;32372:1;32352:18;;;32345:29;-1:-1:-1;;;32390:18:1;;;32383:36;32436:18;;30740:117:0::2;32131:329:1::0;30740:117:0::2;30641:234;30591:534;;;30919:32;30906:9;:45;;;;;;;;:::i;:::-;;;:57;;;;30962:1;30955;:4;;;:8;30906:57;30898:96;;;::::0;-1:-1:-1;;;30898:96:0;;32667:2:1;30898:96:0::2;::::0;::::2;32649:21:1::0;32706:1;32686:18;;;32679:29;-1:-1:-1;;;32724:18:1;;;32717:35;32769:18;;30898:96:0::2;32465:328:1::0;30898:96:0::2;31034:32;31021:9;:45;;;;;;;;:::i;:::-;;;:57;;;;31077:1;31070;:4;;;:8;31021:57;31013:96;;;::::0;-1:-1:-1;;;31013:96:0;;33000:2:1;31013:96:0::2;::::0;::::2;32982:21:1::0;33039:1;33019:18;;;33012:29;-1:-1:-1;;;33057:18:1;;;33050:35;33102:18;;31013:96:0::2;32798:328:1::0;31013:96:0::2;31148:62;31226:107;;;;;;;;31283:6;-1:-1:-1::0;;;;;31226:107:0::2;;;;;31291:9;31226:107;;;;31302:5;31226:107;;;;31309:9;31226:107;;;;;;;;:::i;:::-;::::0;;31350:38:::2;::::0;-1:-1:-1;;;31350:38:0;;31148:185;;-1:-1:-1;;;;;;31350:10:0::2;:20;::::0;::::2;::::0;:38:::2;::::0;31148:185;;31350:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31349:39;:89;;;-1:-1:-1::0;31401:37:0::2;::::0;-1:-1:-1;;;31401:37:0;;-1:-1:-1;;;;;31401:10:0::2;:19;::::0;::::2;::::0;:37:::2;::::0;31421:16;;31401:37:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31346:2273;;;31468:20;31521:34;31508:9;:47;;;;;;;;:::i;:::-;::::0;31505:869:::2;;31622:92;::::0;-1:-1:-1;;;31622:92:0;;31577:42:::2;::::0;-1:-1:-1;;;;;31622:8:0::2;:26;::::0;::::2;::::0;:92:::2;::::0;31671:6;;31679:9;;31690:5;;31622:92:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31577:137;;31770:1;:10;;;31753:1;:14;;;:27;;;;:::i;:::-;31901:11;::::0;::::2;::::0;31935:5:::2;::::0;::::2;::::0;31825:172:::2;::::0;-1:-1:-1;;;31825:172:0;;31802:17:::2;31825:172;::::0;::::2;26169:25:1::0;;;26210:18;;;26203:34;;;;26280:14;;26273:22;26253:18;;;26246:50;26312:18;;;26305:34;;;31735:45:0;;-1:-1:-1;31802:17:0;-1:-1:-1;;;;;31825:9:0::2;:29;::::0;::::2;::::0;26141:19:1;;31825:172:0::2;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31801:196;;;32071:9;-1:-1:-1::0;;;;;32071:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32057:10;::::0;::::2;::::0;32042:25:::2;::::0;:12;:25:::2;:::i;:::-;:62;;32034:117;;;;-1:-1:-1::0;;;32034:117:0::2;;;;;;;:::i;:::-;31556:613;;31505:869;;;14946:4;32336:1;:10;;;32230:8;-1:-1:-1::0;;;;;32230:23:0::2;;32276:6;32284:9;32295:5;32230:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:103;;;32210:1;:17;;;:123;;;;:::i;:::-;:136;;;;:::i;:::-;:148;;;;:::i;:::-;32192:166;;31505:869;32390:69;::::0;-1:-1:-1;;;32390:69:0;;-1:-1:-1;;;;;32390:8:0::2;:33;::::0;::::2;::::0;:69:::2;::::0;32424:6;;32432:9;;32443:15;;32390:69:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32476:12;32491:8;-1:-1:-1::0;;;;;32491:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32491:35:0::2;;32545:9:::0;32587:34:::2;32574:9;:47;;;;;;;;:::i;:::-;;:186;;32715:45;32574:186;;;32646:44;32574:186;32779:15;32491:318;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32476:333;;32826:8;-1:-1:-1::0;;;;;32826:29:0::2;;32874:231;;;;;;;;32931:6;-1:-1:-1::0;;;;;32874:231:0::2;;;;;32960:5;32874:231;;;;32988:6;-1:-1:-1::0;;;;;32874:231:0::2;;;;;33017:9;32874:231;;;;33049:5;32874:231;;;;33077:9;32874:231;;;;;;;;:::i;:::-;;;::::0;33107:7:::2;32826:303;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;33146:56:0::2;::::0;-1:-1:-1;;;33146:56:0;;-1:-1:-1;;;;;33146:10:0::2;:30;::::0;-1:-1:-1;33146:30:0::2;::::0;-1:-1:-1;33146:56:0::2;::::0;33177:16;;33195:6;;33146:56:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;33348:9;33323:6;-1:-1:-1::0;;;;;33236:136:0::2;33298:6;-1:-1:-1::0;;;;;33236:136:0::2;;33272:7;33236:136;;;;160:25:1::0;;148:2;133:18;;14:177;33236:136:0::2;;;;;;;;31439:1947;;31346:2273;;;33405:58;::::0;-1:-1:-1;;;33405:58:0;;-1:-1:-1;;;;;33405:10:0::2;:32;::::0;::::2;::::0;:58:::2;::::0;33438:16;;33456:6;;33405:58:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;33583:9;33558:6;-1:-1:-1::0;;;;;33497:110:0::2;33533:6;-1:-1:-1::0;;;;;33497:110:0::2;;;;;;;;;;;31346:2273;29888:3738;;;29659:3967:::0;;;;;;:::o;26206:736::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;26330:14:::2;26347:12;:10;:12::i;:::-;26380:52;::::0;-1:-1:-1;;;26380:52:0;;26330:29;;-1:-1:-1;;;;;;26380:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;26330:29;;26415:9;;26426:5;;26380:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26372:86;;;;-1:-1:-1::0;;;26372:86:0::2;;;;;;;:::i;:::-;26516:76;::::0;-1:-1:-1;;;26516:76:0;;26471:42:::2;::::0;-1:-1:-1;;;;;26516:8:0::2;:26;::::0;::::2;::::0;:76:::2;::::0;26557:6;;26565:9;;26576:5;;26516:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26471:121;;26639:19;;26628:1;:7;;;26613:12;:22;;;;:::i;:::-;:45;;26605:72;;;;-1:-1:-1::0;;;26605:72:0::2;;;;;;;:::i;:::-;26690:59;::::0;-1:-1:-1;;;26690:59:0;;-1:-1:-1;;;;;26690:8:0::2;:33;::::0;::::2;::::0;:59:::2;::::0;26724:6;;26732:9;;26743:5;;26690:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;26808:14:0::2;::::0;::::2;::::0;26760:63:::2;::::0;-1:-1:-1;;;26760:63:0;;:8:::2;-1:-1:-1::0;;;;;26760:20:0;::::2;::::0;::::2;::::0;:63:::2;::::0;:8;26800:6;;26760:63:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;26894:9;26873:6;-1:-1:-1::0;;;;;26841:93:0::2;;26918:5;26841:93;;;;160:25:1::0;;148:2;133:18;;14:177;26841:93:0::2;;;;;;;;26317:625;;26206:736:::0;;:::o;27745:1878::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;27878:14:::2;27895:12;:10;:12::i;:::-;27878:29;;27920:33;27956:8;-1:-1:-1::0;;;;;27956:19:0::2;;27990:6;27998:9;28009:5;27956:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27920:105;;28038:37;28078:8;-1:-1:-1::0;;;;;28078:23:0::2;;28116:6;28124:9;28135:5;28078:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28038:113;;28185:1;28172;:10;;;:14;28164:35;;;;-1:-1:-1::0;;;28164:35:0::2;;;;;;;:::i;:::-;28212:14;28260:1;:10;;;28254:3;14982:2;28229:1;:11;;;:22;;;;:::i;:::-;:28;;;;:::i;:::-;:41;;;;:::i;:::-;28212:58:::0;-1:-1:-1;28291:10:0;;;:118:::2;;;28306:1;:5;;;:102;;28399:9;28385:1;:11;;;:23;;;;:::i;:::-;28376:5;:32;;28306:102;;;28351:9;28337:1;:11;;;:23;;;;:::i;:::-;28328:5;:32;;28306:102;28283:141;;;::::0;-1:-1:-1;;;28283:141:0;;35250:2:1;28283:141:0::2;::::0;::::2;35232:21:1::0;35289:2;35269:18;;;35262:30;-1:-1:-1;;;35308:18:1;;;35301:40;35358:18;;28283:141:0::2;35048:334:1::0;28283:141:0::2;28487:19;::::0;28468:15:::2;::::0;::::2;::::0;28453:30:::2;::::0;:12:::2;:30;:::i;:::-;:53;;28445:93;;;;-1:-1:-1::0;;;28445:93:0::2;;;;;;;:::i;:::-;28551:34;28588:8;-1:-1:-1::0;;;;;28588:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28551:63:::0;-1:-1:-1;28630:10:0;;;:80:::2;;;28654:10;-1:-1:-1::0;;;;;28654:23:0::2;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28654:45:0::2;;28700:9;28654:56;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;28654:56:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28653:57;28630:80;28627:989;;;28728:50;::::0;-1:-1:-1;;;28728:50:0;;-1:-1:-1;;;;;28728:8:0::2;:17;::::0;::::2;::::0;:50:::2;::::0;28746:6;;28754:9;;28765:5;;28772;;28728:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;28800:125:0::2;::::0;;19880:25:1;;;19936:2;19921:18;;19914:34;;;28853:9:0;;-1:-1:-1;;;;;;28800:125:0;::::2;::::0;-1:-1:-1;28800:125:0::2;::::0;19853:18:1;28800:125:0::2;;;;;;;28627:989;;;28958:12;28973:10;-1:-1:-1::0;;;;;28973:19:0::2;;29011:9;29039:43;14946:4;29140:1;:10;;;29122:1;:15;;;29102:1;:17;;;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;28973:204;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29270:126;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;29270:126:0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;29352:11:::2;::::0;;::::2;::::0;29270:126;;;;;;29365:5;;::::2;::::0;29270:126:::2;;::::0;;;;;;;;;;;;29194:217;;-1:-1:-1;;;29194:217:0;;::::2;::::0;::::2;36036:25:1::0;;;36101:13;;36097:39;;36077:18;;;36070:67;36173:22;;36153:18;;;36146:50;36232:22;36212:18;;;36205:50;36292:22;;36271:19;;;36264:51;36366:23;;36359:31;36352:39;36331:19;;;36324:68;36429:23;;36408:19;;;36401:52;28958:219:0;;-1:-1:-1;29194:30:0;::::2;::::0;::::2;::::0;36008:19:1;;29194:217:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;29532:9;29507:6;-1:-1:-1::0;;;;;29445:159:0::2;29481:7;29445:159;29560:5;29584;29445:159;;;;;;19880:25:1::0;;;19936:2;19921:18;;19914:34;19868:2;19853:18;;19706:248;29445:159:0::2;;;;;;;;28943:673;28627:989;27865:1758;;;;;27745:1878:::0;;;:::o;13334:161::-;13401:9;13414:10;13401:23;13393:47;;;;-1:-1:-1;;;13393:47:0;;36666:2:1;13393:47:0;;;36648:21:1;36705:2;36685:18;;;36678:30;-1:-1:-1;;;36724:18:1;;;36717:41;36775:18;;13393:47:0;36464:335:1;13393:47:0;13465:10;13453:11;:23;;;;;;;;;;:34;;-1:-1:-1;;;;;;13453:34:0;-1:-1:-1;;;;;13453:34:0;;;;;;;;;;13334:161::o;18522:215::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18609:1:::1;18601:5;:9;18593:29;;;;-1:-1:-1::0;;;18593:29:0::1;;;;;;;:::i;:::-;18633:19;:27:::0;;;18686:43:::1;::::0;;37016:21:1;;;37073:2;37053:18;;;37046:30;;;;-1:-1:-1;;;37107:2:1;37092:18;;37085:49;37201:4;37186:20;;37179:36;;;-1:-1:-1;;;;;;;;;;;18686:43:0;37166:3:1;37151:19;18686:43:0::1;36804:417:1::0;26985:752:0;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;27118:14:::2;27135:12;:10;:12::i;:::-;27118:29;;27160:33;27196:8;-1:-1:-1::0;;;;;27196:19:0::2;;27230:6;27238:9;27249:5;27196:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27160:105;;27278:37;27318:8;-1:-1:-1::0;;;;;27318:23:0::2;;27356:6;27364:9;27375:5;27318:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27278:113;;27425:1;27412;:10;;;:14;27404:35;;;;-1:-1:-1::0;;;27404:35:0::2;;;;;;;:::i;:::-;27492:19;::::0;27473:15:::2;::::0;::::2;::::0;27458:30:::2;::::0;:12:::2;:30;:::i;:::-;:53;;27450:93;;;;-1:-1:-1::0;;;27450:93:0::2;;;;;;;:::i;:::-;27556:50;::::0;-1:-1:-1;;;27556:50:0;;-1:-1:-1;;;;;27556:8:0::2;:17;::::0;::::2;::::0;:50:::2;::::0;27574:6;;27582:9;;27593:5;;27600;;27556:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;27624:105:0::2;::::0;;19880:25:1;;;19936:2;19921:18;;19914:34;;;27669:9:0;;-1:-1:-1;;;;;;27624:105:0;::::2;::::0;-1:-1:-1;27624:105:0::2;::::0;19853:18:1;27624:105:0::2;;;;;;;27105:632;;;26985:752:::0;;;:::o;33686:472::-;33792:4;33815:9;-1:-1:-1;;;;;33815:34:0;;33864:1;:8;;;33887:1;:11;;;33913:1;:7;;;33935:1;:11;;;33961:1;:5;;;14946:4;34001:8;-1:-1:-1;;;;;34001:23:0;;34043:1;:8;;;34053:1;:11;;;34066:1;:7;;;34001:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;;;33981:1;:17;;;:121;;;;:::i;:::-;:133;;;;:::i;:::-;34129:10;;;;;33815:335;;;;;;-1:-1:-1;;;;;;33815:335:0;;;-1:-1:-1;;;;;37553:32:1;;;;33815:335:0;;;37535:51:1;37602:18;;;37595:34;;;;37645:18;;;37638:34;;;;37688:18;;;37681:34;;;;37759:14;37752:22;37731:19;;;37724:51;37791:19;;;37784:35;37835:19;;;37828:35;;;;37507:19;;33815:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33808:342;33686:472;-1:-1:-1;;33686:472:0:o;987:454:1:-;1082:6;1090;1098;1106;1114;1167:3;1155:9;1146:7;1142:23;1138:33;1135:53;;;1184:1;1181;1174:12;1135:53;-1:-1:-1;;1207:23:1;;;1277:2;1262:18;;1249:32;;-1:-1:-1;1328:2:1;1313:18;;1300:32;;1379:2;1364:18;;1351:32;;-1:-1:-1;1430:3:1;1415:19;1402:33;;-1:-1:-1;987:454:1;-1:-1:-1;987:454:1:o;1684:180::-;1743:6;1796:2;1784:9;1775:7;1771:23;1767:32;1764:52;;;1812:1;1809;1802:12;1764:52;-1:-1:-1;1835:23:1;;1684:180;-1:-1:-1;1684:180:1:o;2157:131::-;-1:-1:-1;;;;;2232:31:1;;2222:42;;2212:70;;2278:1;2275;2268:12;2212:70;2157:131;:::o;2293:134::-;2361:20;;2390:31;2361:20;2390:31;:::i;:::-;2293:134;;;:::o;2432:726::-;2511:6;2519;2527;2580:2;2568:9;2559:7;2555:23;2551:32;2548:52;;;2596:1;2593;2586:12;2548:52;2635:9;2622:23;2654:31;2679:5;2654:31;:::i;:::-;2704:5;-1:-1:-1;2760:2:1;2745:18;;2732:32;2783:18;2813:14;;;2810:34;;;2840:1;2837;2830:12;2810:34;2878:6;2867:9;2863:22;2853:32;;2923:7;2916:4;2912:2;2908:13;2904:27;2894:55;;2945:1;2942;2935:12;2894:55;2985:2;2972:16;3011:2;3003:6;3000:14;2997:34;;;3027:1;3024;3017:12;2997:34;3072:7;3067:2;3058:6;3054:2;3050:15;3046:24;3043:37;3040:57;;;3093:1;3090;3083:12;3040:57;3124:2;3120;3116:11;3106:21;;3146:6;3136:16;;;;;2432:726;;;;;:::o;3163:258::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3335:11;;;3329:18;3316:11;;;3309:39;3281:2;3274:10;3245:113;;;3376:6;3373:1;3370:13;3367:48;;;3411:1;3402:6;3397:3;3393:16;3386:27;3367:48;;3163:258;;;:::o;3426:257::-;3467:3;3505:5;3499:12;3532:6;3527:3;3520:19;3548:63;3604:6;3597:4;3592:3;3588:14;3581:4;3574:5;3570:16;3548:63;:::i;:::-;3665:2;3644:15;-1:-1:-1;;3640:29:1;3631:39;;;;3672:4;3627:50;;3426:257;-1:-1:-1;;3426:257:1:o;3688:217::-;3835:2;3824:9;3817:21;3798:4;3855:44;3895:2;3884:9;3880:18;3872:6;3855:44;:::i;:::-;3847:52;3688:217;-1:-1:-1;;;3688:217:1:o;3910:127::-;3971:10;3966:3;3962:20;3959:1;3952:31;4002:4;3999:1;3992:15;4026:4;4023:1;4016:15;4042:255;4114:2;4108:9;4156:6;4144:19;;4193:18;4178:34;;4214:22;;;4175:62;4172:88;;;4240:18;;:::i;:::-;4276:2;4269:22;4042:255;:::o;4302:247::-;4369:2;4363:9;4411:3;4399:16;;4445:18;4430:34;;4466:22;;;4427:62;4424:88;;;4492:18;;:::i;4554:118::-;4640:5;4633:13;4626:21;4619:5;4616:32;4606:60;;4662:1;4659;4652:12;4677:128;4742:20;;4771:28;4742:20;4771:28;:::i;4810:159::-;4894:20;;4943:1;4933:12;;4923:40;;4959:1;4956;4949:12;4974:1333;5113:6;5121;5129;5137;5145;5189:9;5180:7;5176:23;5219:3;5215:2;5211:12;5208:32;;;5236:1;5233;5226:12;5208:32;5259:6;5285:2;5281;5277:11;5274:31;;;5301:1;5298;5291:12;5274:31;5327:22;;:::i;:::-;5314:35;;5372:29;5391:9;5372:29;:::i;:::-;5365:5;5358:44;5462:2;5451:9;5447:18;5434:32;5429:2;5422:5;5418:14;5411:56;5527:2;5516:9;5512:18;5499:32;5494:2;5487:5;5483:14;5476:56;5592:2;5581:9;5577:18;5564:32;5559:2;5552:5;5548:14;5541:56;5658:3;5647:9;5643:19;5630:33;5624:3;5617:5;5613:15;5606:58;5725:3;5714:9;5710:19;5697:33;5691:3;5684:5;5680:15;5673:58;5764:36;5795:3;5784:9;5780:19;5764:36;:::i;:::-;5758:3;5751:5;5747:15;5740:61;5862:3;5851:9;5847:19;5834:33;5828:3;5821:5;5817:15;5810:58;5887:3;5950:2;5939:9;5935:18;5922:32;5917:2;5910:5;5906:14;5899:56;;5974:3;6037:2;6026:9;6022:18;6009:32;6004:2;5997:5;5993:14;5986:56;;6061:5;6051:15;;6085:54;6135:2;6124:9;6120:18;6085:54;:::i;:::-;6075:64;;;;6186:3;6175:9;6171:19;6158:33;6148:43;;6238:3;6227:9;6223:19;6210:33;6200:43;;6262:39;6296:3;6285:9;6281:19;6262:39;:::i;:::-;6252:49;;4974:1333;;;;;;;;:::o;6312:248::-;6380:6;6388;6441:2;6429:9;6420:7;6416:23;6412:32;6409:52;;;6457:1;6454;6447:12;6409:52;-1:-1:-1;;6480:23:1;;;6550:2;6535:18;;;6522:32;;-1:-1:-1;6312:248:1:o;6565:686::-;6683:6;6691;6699;6707;6715;6723;6776:3;6764:9;6755:7;6751:23;6747:33;6744:53;;;6793:1;6790;6783:12;6744:53;6832:9;6819:23;6871:1;6864:5;6861:12;6851:40;;6887:1;6884;6877:12;6851:40;6910:5;-1:-1:-1;6967:2:1;6952:18;;6939:32;6980:33;6939:32;6980:33;:::i;:::-;6565:686;;7032:7;;-1:-1:-1;;;;7086:2:1;7071:18;;7058:32;;7137:2;7122:18;;7109:32;;7188:3;7173:19;;7160:33;;-1:-1:-1;7240:3:1;7225:19;;;7212:33;;-1:-1:-1;6565:686:1:o;7256:316::-;7333:6;7341;7349;7402:2;7390:9;7381:7;7377:23;7373:32;7370:52;;;7418:1;7415;7408:12;7370:52;-1:-1:-1;;7441:23:1;;;7511:2;7496:18;;7483:32;;-1:-1:-1;7562:2:1;7547:18;;;7534:32;;7256:316;-1:-1:-1;7256:316:1:o;7577:247::-;7636:6;7689:2;7677:9;7668:7;7664:23;7660:32;7657:52;;;7705:1;7702;7695:12;7657:52;7744:9;7731:23;7763:31;7788:5;7763:31;:::i;8071:327::-;8273:2;8255:21;;;8312:1;8292:18;;;8285:29;-1:-1:-1;;;8345:2:1;8330:18;;8323:34;8389:2;8374:18;;8071:327::o;8403:345::-;-1:-1:-1;;;;;8623:32:1;;;;8605:51;;8687:2;8672:18;;8665:34;;;;8730:2;8715:18;;8708:34;8593:2;8578:18;;8403:345::o;8753:132::-;8829:13;;8851:28;8829:13;8851:28;:::i;8890:245::-;8957:6;9010:2;8998:9;8989:7;8985:23;8981:32;8978:52;;;9026:1;9023;9016:12;8978:52;9058:9;9052:16;9077:28;9099:5;9077:28;:::i;9140:331::-;9342:2;9324:21;;;9381:1;9361:18;;;9354:29;-1:-1:-1;;;9414:2:1;9399:18;;9392:38;9462:2;9447:18;;9140:331::o;9476:138::-;9555:13;;9577:31;9555:13;9577:31;:::i;9619:1143::-;9720:6;9773:3;9761:9;9752:7;9748:23;9744:33;9741:53;;;9790:1;9787;9780:12;9741:53;9816:17;;:::i;:::-;9856:40;9886:9;9856:40;:::i;:::-;9849:5;9842:55;9950:2;9939:9;9935:18;9929:25;9924:2;9917:5;9913:14;9906:49;10008:2;9997:9;9993:18;9987:25;9982:2;9975:5;9971:14;9964:49;10066:2;10055:9;10051:18;10045:25;10040:2;10033:5;10029:14;10022:49;10125:3;10114:9;10110:19;10104:26;10098:3;10091:5;10087:15;10080:51;10164:47;10206:3;10195:9;10191:19;10164:47;:::i;:::-;10158:3;10147:15;;10140:72;10266:3;10251:19;;;10245:26;10228:15;;;10221:51;10326:3;10311:19;;;10305:26;10288:15;;;10281:51;10351:3;10392:18;;;10386:25;10370:14;;;10363:49;10431:3;10472:18;;;10466:25;10450:14;;;10443:49;10511:3;10552:18;;;10546:25;10530:14;;;10523:49;10591:3;10632:18;;;10626:25;10610:14;;;10603:49;10671:3;10712:18;;;10706:25;10690:14;;;10683:49;;;;-1:-1:-1;10151:5:1;9619:1143;-1:-1:-1;9619:1143:1:o;10767:127::-;10828:10;10823:3;10819:20;10816:1;10809:31;10859:4;10856:1;10849:15;10883:4;10880:1;10873:15;10899:125;10939:4;10967:1;10964;10961:8;10958:34;;;10972:18;;:::i;:::-;-1:-1:-1;11009:9:1;;10899:125::o;11029:338::-;11231:2;11213:21;;;11270:2;11250:18;;;11243:30;-1:-1:-1;;;11304:2:1;11289:18;;11282:44;11358:2;11343:18;;11029:338::o;11372:331::-;11574:2;11556:21;;;11613:1;11593:18;;;11586:29;-1:-1:-1;;;11646:2:1;11631:18;;11624:38;11694:2;11679:18;;11372:331::o;11708:::-;11910:2;11892:21;;;11949:1;11929:18;;;11922:29;-1:-1:-1;;;11982:2:1;11967:18;;11960:38;12030:2;12015:18;;11708:331::o;12044:1170::-;12272:13;;-1:-1:-1;;;;;262:31:1;250:44;;12240:3;12225:19;;12353:4;12345:6;12341:17;12335:24;12328:4;12317:9;12313:20;12306:54;12416:4;12408:6;12404:17;12398:24;12391:4;12380:9;12376:20;12369:54;12479:4;12471:6;12467:17;12461:24;12454:4;12443:9;12439:20;12432:54;12542:4;12534:6;12530:17;12524:24;12517:4;12506:9;12502:20;12495:54;12596:4;12588:6;12584:17;12578:24;12611:51;12656:4;12645:9;12641:20;12627:12;1939:13;1932:21;1920:34;;1869:91;12611:51;-1:-1:-1;12718:4:1;12706:17;;;12700:24;12678:20;;;12671:54;12781:4;12769:17;;;12763:24;12741:20;;;12734:54;12807:6;12855:15;;;12849:22;12829:18;;;12822:50;12891:6;12939:15;;;12933:22;12913:18;;;12906:50;12975:6;13023:15;;;13017:22;12997:18;;;12990:50;13059:6;13107:15;;;13101:22;13081:18;;;13074:50;13143:6;13191:15;;;13185:22;13165:18;;;;13158:50;;;;12044:1170;:::o;13615:251::-;13685:6;13738:2;13726:9;13717:7;13713:23;13709:32;13706:52;;;13754:1;13751;13744:12;13706:52;13786:9;13780:16;13805:31;13830:5;13805:31;:::i;13871:331::-;14073:2;14055:21;;;14112:1;14092:18;;;14085:29;-1:-1:-1;;;14145:2:1;14130:18;;14123:38;14193:2;14178:18;;13871:331::o;14207:840::-;14270:5;14318:6;14306:9;14301:3;14297:19;14293:32;14290:52;;;14338:1;14335;14328:12;14290:52;14360:22;;:::i;:::-;14351:31;;14405:40;14435:9;14405:40;:::i;:::-;14398:5;14391:55;14499:2;14488:9;14484:18;14478:25;14473:2;14466:5;14462:14;14455:49;14557:2;14546:9;14542:18;14536:25;14531:2;14524:5;14520:14;14513:49;14615:2;14604:9;14600:18;14594:25;14589:2;14582:5;14578:14;14571:49;14674:3;14663:9;14659:19;14653:26;14647:3;14640:5;14636:15;14629:51;14734:3;14723:9;14719:19;14713:26;14707:3;14700:5;14696:15;14689:51;14773:47;14815:3;14804:9;14800:19;14773:47;:::i;:::-;14767:3;14760:5;14756:15;14749:72;14875:3;14864:9;14860:19;14854:26;14848:3;14841:5;14837:15;14830:51;14900:3;14956:2;14945:9;14941:18;14935:25;14930:2;14923:5;14919:14;14912:49;;14980:3;15036:2;15025:9;15021:18;15015:25;15010:2;15003:5;14999:14;14992:49;;14207:840;;;;:::o;15052:801::-;15157:6;15210:3;15198:9;15189:7;15185:23;15181:33;15178:53;;;15227:1;15224;15217:12;15178:53;15260:2;15254:9;15302:4;15294:6;15290:17;15373:6;15361:10;15358:22;15337:18;15325:10;15322:34;15319:62;15316:88;;;15384:18;;:::i;:::-;15420:2;15413:22;15459:54;15505:7;15494:9;15459:54;:::i;:::-;15444:70;;15570:3;15555:19;;15549:26;15542:4;15530:17;;15523:53;15630:3;15615:19;;15609:26;15604:2;15592:15;;15585:51;15692:3;15677:19;;15671:26;15664:4;15652:17;;15645:53;15754:3;15739:19;;15733:26;15726:4;15714:17;;15707:53;15816:3;15801:19;;;15795:26;15788:4;15776:17;;15769:53;-1:-1:-1;15451:6:1;15052:801;-1:-1:-1;15052:801:1:o;15858:128::-;15898:3;15929:1;15925:6;15922:1;15919:13;15916:39;;;15935:18;;:::i;:::-;-1:-1:-1;15971:9:1;;15858:128::o;15991:336::-;16193:2;16175:21;;;16232:2;16212:18;;;16205:30;-1:-1:-1;;;16266:2:1;16251:18;;16244:42;16318:2;16303:18;;15991:336::o;16332:338::-;16534:2;16516:21;;;16573:2;16553:18;;;16546:30;-1:-1:-1;;;16607:2:1;16592:18;;16585:44;16661:2;16646:18;;16332:338::o;16675:347::-;16877:2;16859:21;;;16916:2;16896:18;;;16889:30;-1:-1:-1;;;16950:2:1;16935:18;;16928:53;17013:2;16998:18;;16675:347::o;17290:375::-;-1:-1:-1;;;;;17548:15:1;;;17530:34;;17600:15;;;;17595:2;17580:18;;17573:43;17647:2;17632:18;;17625:34;;;;17480:2;17465:18;;17290:375::o;17670:1002::-;17752:12;;17792:9;;-1:-1:-1;;;;;262:31:1;250:44;;17853:4;17849:2;17845:13;17839:20;17832:4;17827:3;17823:14;17816:44;17906:4;17902:2;17898:13;17892:20;17885:4;17880:3;17876:14;17869:44;17959:4;17955:2;17951:13;17945:20;17938:4;17933:3;17929:14;17922:44;18012:4;18008:2;18004:13;17998:20;17991:4;17986:3;17982:14;17975:44;18065:4;18061:2;18057:13;18051:20;18044:4;18039:3;18035:14;18028:44;18115:4;18111:2;18107:13;18101:20;18130:45;18169:4;18164:3;18160:14;18146:12;1939:13;1932:21;1920:34;;1869:91;18130:45;-1:-1:-1;18221:4:1;18213:13;;;18207:20;18191:14;;;18184:44;18247:6;18289:11;;;18283:18;18269:12;;;18262:40;18321:6;18363:11;;;18357:18;18343:12;;;18336:40;18427:4;18416:16;;18410:23;18401:6;18392:16;;18385:49;18485:4;18474:16;;18468:23;18459:6;18450:16;;18443:49;18543:4;18532:16;;18526:23;18517:6;18508:16;;18501:49;18601:4;18590:16;;18584:23;18575:6;18566:16;;18559:49;18659:4;18648:16;18642:23;18633:6;18624:16;;;18617:49;17670:1002::o;18677:278::-;18881:3;18866:19;;18894:55;18870:9;18931:6;18894:55;:::i;18960:330::-;19162:2;19144:21;;;19201:1;19181:18;;;19174:29;-1:-1:-1;;;19234:2:1;19219:18;;19212:37;19281:2;19266:18;;18960:330::o;19959:274::-;20088:3;20126:6;20120:13;20142:53;20188:6;20183:3;20176:4;20168:6;20164:17;20142:53;:::i;:::-;20211:16;;;;;19959:274;-1:-1:-1;;19959:274:1:o;20588:271::-;20771:6;20763;20758:3;20745:33;20727:3;20797:16;;20822:13;;;20797:16;20588:271;-1:-1:-1;20588:271:1:o;20864:884::-;20944:6;20997:2;20985:9;20976:7;20972:23;20968:32;20965:52;;;21013:1;21010;21003:12;20965:52;21046:9;21040:16;21075:18;21116:2;21108:6;21105:14;21102:34;;;21132:1;21129;21122:12;21102:34;21170:6;21159:9;21155:22;21145:32;;21215:7;21208:4;21204:2;21200:13;21196:27;21186:55;;21237:1;21234;21227:12;21186:55;21266:2;21260:9;21288:2;21284;21281:10;21278:36;;;21294:18;;:::i;:::-;21369:2;21363:9;21337:2;21423:13;;-1:-1:-1;;21419:22:1;;;21443:2;21415:31;21411:40;21399:53;;;21467:18;;;21487:22;;;21464:46;21461:72;;;21513:18;;:::i;:::-;21553:10;21549:2;21542:22;21588:2;21580:6;21573:18;21628:7;21623:2;21618;21614;21610:11;21606:20;21603:33;21600:53;;;21649:1;21646;21639:12;21600:53;21662:55;21714:2;21709;21701:6;21697:15;21692:2;21688;21684:11;21662:55;:::i;:::-;21736:6;20864:884;-1:-1:-1;;;;;;;20864:884:1:o;22885:184::-;22955:6;23008:2;22996:9;22987:7;22983:23;22979:32;22976:52;;;23024:1;23021;23014:12;22976:52;-1:-1:-1;23047:16:1;;22885:184;-1:-1:-1;22885:184:1:o;23074:274::-;-1:-1:-1;;;;;23266:32:1;;;;23248:51;;23330:2;23315:18;;23308:34;23236:2;23221:18;;23074:274::o;23701:342::-;23903:2;23885:21;;;23942:2;23922:18;;;23915:30;-1:-1:-1;;;23976:2:1;23961:18;;23954:48;24034:2;24019:18;;23701:342::o;24390:168::-;24430:7;24496:1;24492;24488:6;24484:14;24481:1;24478:21;24473:1;24466:9;24459:17;24455:45;24452:71;;;24503:18;;:::i;:::-;-1:-1:-1;24543:9:1;;24390:168::o;26350:245::-;26429:6;26437;26490:2;26478:9;26469:7;26465:23;26461:32;26458:52;;;26506:1;26503;26496:12;26458:52;-1:-1:-1;;26529:16:1;;26585:2;26570:18;;;26564:25;26529:16;;26564:25;;-1:-1:-1;26350:245:1:o;26600:345::-;26802:2;26784:21;;;26841:2;26821:18;;;26814:30;-1:-1:-1;;;26875:2:1;26860:18;;26853:51;26936:2;26921:18;;26600:345::o;26950:127::-;27011:10;27006:3;27002:20;26999:1;26992:31;27042:4;27039:1;27032:15;27066:4;27063:1;27056:15;27082:493;-1:-1:-1;;;;;27351:32:1;;27333:51;;27415:2;27400:18;;27393:34;;;27458:2;27443:18;;27436:34;;;27320:3;27305:19;;27500:1;27489:13;;27479:47;;27506:18;;:::i;:::-;27562:6;27557:2;27546:9;27542:18;27535:34;27082:493;;;;;;;:::o;27580:386::-;27793:25;;;27781:2;27766:18;;27848:1;27837:13;;27827:47;;27854:18;;:::i;:::-;27905:2;27890:18;;27883:34;;;;27948:2;27933:18;27926:34;27580:386;;-1:-1:-1;27580:386:1:o;27971:432::-;28225:3;28210:19;;28238:55;28214:9;28275:6;28238:55;:::i;:::-;28330:6;28324:3;28313:9;28309:19;28302:35;28388:6;28381:14;28374:22;28368:3;28357:9;28353:19;28346:51;27971:432;;;;;;:::o;28717:245::-;28809:6;28862:3;28850:9;28841:7;28837:23;28833:33;28830:53;;;28879:1;28876;28869:12;28830:53;28902:54;28948:7;28937:9;28902:54;:::i;28967:808::-;29063:6;29116:3;29104:9;29095:7;29091:23;29087:33;29084:53;;;29133:1;29130;29123:12;29084:53;29166:2;29160:9;29208:3;29200:6;29196:16;29278:6;29266:10;29263:22;29242:18;29230:10;29227:34;29224:62;29221:88;;;29289:18;;:::i;:::-;29329:10;29325:2;29318:22;;29370:9;29364:16;29356:6;29349:32;29435:2;29424:9;29420:18;29414:25;29409:2;29401:6;29397:15;29390:50;29494:2;29483:9;29479:18;29473:25;29468:2;29460:6;29456:15;29449:50;29553:2;29542:9;29538:18;29532:25;29527:2;29519:6;29515:15;29508:50;29613:3;29602:9;29598:19;29592:26;29586:3;29578:6;29574:16;29567:52;29662:3;29651:9;29647:19;29641:26;29676:28;29698:5;29676:28;:::i;:::-;29732:3;29720:16;;29713:31;29724:6;28967:808;-1:-1:-1;;;28967:808:1:o;30129:331::-;30331:2;30313:21;;;30370:1;30350:18;;;30343:29;-1:-1:-1;;;30403:2:1;30388:18;;30381:38;30451:2;30436:18;;30129:331::o;30465:217::-;30505:1;30531;30521:132;;30575:10;30570:3;30566:20;30563:1;30556:31;30610:4;30607:1;30600:15;30638:4;30635:1;30628:15;30521:132;-1:-1:-1;30667:9:1;;30465:217::o;33131:141::-;33213:1;33206:5;33203:12;33193:46;;33219:18;;:::i;:::-;33248;;33131:141::o;33277:356::-;33394:1;33390;33385:3;33381:11;33377:19;33369:5;33363:12;33359:38;33354:3;33347:51;33447:4;33440:5;33436:16;33430:23;33423:4;33418:3;33414:14;33407:47;33503:4;33496:5;33492:16;33486:23;33479:4;33474:3;33470:14;33463:47;33556:4;33549:5;33545:16;33539:23;33571:56;33621:4;33616:3;33612:14;33598:12;33571:56;:::i;:::-;;33277:356;;:::o;33638:272::-;33838:3;33823:19;;33851:53;33827:9;33886:6;33851:53;:::i;33915:753::-;34099:4;34141:3;34130:9;34126:19;34118:27;;34181:1;34177;34172:3;34168:11;34164:19;34229:2;34220:6;34214:13;34210:22;34199:9;34192:41;34289:4;34281:6;34277:17;34271:24;34264:4;34253:9;34249:20;34242:54;34364:2;34356:4;34348:6;34344:17;34338:24;34334:33;34327:4;34316:9;34312:20;34305:63;;34424:4;34416:6;34412:17;34406:24;34399:4;34388:9;34384:20;34377:54;34487:4;34479:6;34475:17;34469:24;34462:4;34451:9;34447:20;34440:54;34541:4;34533:6;34529:17;34523:24;34556:62;34612:4;34601:9;34597:20;34583:12;34556:62;:::i;:::-;;34655:6;34649:3;34638:9;34634:19;34627:35;33915:753;;;;;:::o;34673:370::-;34901:3;34886:19;;34914:53;34890:9;34949:6;34914:53;:::i;:::-;-1:-1:-1;;;;;35004:32:1;;;;34998:3;34983:19;;;;34976:61;34673:370;;-1:-1:-1;34673:370:1:o;35387:417::-;-1:-1:-1;;;;;35636:32:1;;;;35618:51;;35700:2;35685:18;;35678:34;;;;35743:2;35728:18;;35721:34;35786:2;35771:18;;35764:34;35605:3;35590:19;;35387:417::o

Swarm Source

ipfs://cbcfbfdc031f4f0ee8229b2cebab7f81322a3712ae5019c1139dd57bc7533da2
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading