Contract 0xBf6527834dBB89cdC97A79FCD62E6c08B19F8ec0

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x134b1f15c659c14302f71a8ea82245b673ffe2df8829fb08528280dd334d825881964132021-06-11 6:00:441 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xf5d9e109c3a290e9f394cd92abd3a314979e03c07b7f06ab0819505a5a9295e981964122021-06-11 6:00:411 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x1a77f461410de212dea7c1795a97f88792aff679f636afc049bee85ffbf50cc481964122021-06-11 6:00:411 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x006df241d839e72ae9198fa8b630503872ec42e57270c11e0958a92b664056fc81964112021-06-11 6:00:381 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x9b1905687a37d3ffb480349135c9e3fc3602456428001bb46da9adca7ddaa3e581964102021-06-11 6:00:351 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x5ccf5fceb51cda051714990f36cd9bc40d78f48de12de481556a6b49a79b1df981964092021-06-11 6:00:321 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xd855f3bebb3e8cf834f7e0c234e55fd7b9e492c1ed67d77847b6388e69735e4581964082021-06-11 6:00:291 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xd9f8954de5728f3aaac16c03eff0e876c5a4226593862901e6bd59274bac6ddb81964072021-06-11 6:00:261 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x211fd5f170f52517a506b71887575ec186394cfa9bda491f38d32f342fa7e2bd81964062021-06-11 6:00:231 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x0bdc2132696730992d2b0277adb3dd2fe01d815ba920619c9bacafea0c2c5d9081964062021-06-11 6:00:231 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x07d461f329c3a7411b7a32aeca6716c205c7744e452507c2d74d4cc9d0dbb9df81964052021-06-11 6:00:201 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x51f86b12239449240cf57b83f2f69f217868925270bf19df1f57951f59de50a681964042021-06-11 6:00:171 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xcff19532d2a97eaeab1a219e196c3724bc4bbf2344069522d43150c4acd9b9da81964032021-06-11 6:00:141 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xbae92cd878e9dd18104567985b3b6c3857f83e19652b31c44ceba52cbd11f0d581964022021-06-11 6:00:111 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x6187aacc8526ac006dc083f97479d2d86a363dc9edfaa09410e68b6592d012f081964022021-06-11 6:00:111 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xe2bb77f0d3f2462904b1075c0ea2baf39a708b6f813a91a4422ea52cca0062ea81964012021-06-11 6:00:081 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x7ddce7f7decd3fe90d9506ab80837c0d7c554a9b05c52d7d91a1a34298a6cd9d81964002021-06-11 6:00:051 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x2f5dd5a1cc8036cb8b0bf8af0b6e52593b68537913fb770db789c8cf79b78c3581963992021-06-11 6:00:021 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x4f42970adaada8d5141473eec19c944d26030e28c089a17f5f3effe9070f077481963982021-06-11 5:59:591 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xff768e8f7ab3424dd8c9413fac8ab88dfc855af8f536224852cb8dd8955122f081963972021-06-11 5:59:561 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x5d6d11562ecf720755245c28a4ee73680b5ffdb07042371534ff18096dd5810281963962021-06-11 5:59:531 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0x283ed9d33132434707c534fb179b936299e095dacc1d392afae8055cab44715381963962021-06-11 5:59:531 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xe1e4fa7b472e9582a7b3f8ed6fe4f3cf4fbeb8cd8fbf8fc22ea089bdd6db846181963942021-06-11 5:59:471 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xeebf892ce2513ca75316c2df20676655e12acfc7ef0365cb286df7a792e6bd0381963942021-06-11 5:59:471 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
0xe5c9d60f311e8e8818767fe8897a22ef5036ce862e72186724bab0b5acc07a3081963932021-06-11 5:59:441 day 5 hrs ago0xdda47d55bcd5bb5d1893e149c09727ec36c91038 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.075 BNB0.000169545
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8b6fba856b3500d133d123da41e9459381011ff62a5a9a89ff4ee6d41e3df9f380754172021-06-07 0:53:455 days 10 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.000997 BNB
0x8b6fba856b3500d133d123da41e9459381011ff62a5a9a89ff4ee6d41e3df9f380754172021-06-07 0:53:455 days 10 hrs ago 0x432f8696f13f2f5cb2b445b155f3419e387855ae 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.001 BNB
0xe8900314583b0c60531dcaf5fd882b10f081547ce414cc5fad0b292bddb5c91378047072021-05-28 14:34:5314 days 21 hrs ago 0x8b41ba4ed214c78433829f2b8cadb887e4b17673 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.026583 BNB
0xdc26ee545a4a22c30db7b7f952b133b3e322730fbfc386a98304dc4821f65e9178042232021-05-28 14:10:3514 days 21 hrs ago 0x6e99f62beb8c2cd67d812fa749c4cf0d12eef6e0 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.084047 BNB
0x9ab1bb1feba15ca39b956a7c0c0a184b4000c9eb5e57144abe6df6206dadce8978042082021-05-28 14:09:5014 days 21 hrs ago 0x6e99f62beb8c2cd67d812fa749c4cf0d12eef6e0 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.084047 BNB
0xd5dac70538824cb53b3f20c47e57a6165acbe465bb7d419a704725a41a4fc15a78027692021-05-28 12:57:4914 days 22 hrs ago 0x6e99f62beb8c2cd67d812fa749c4cf0d12eef6e0 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.873248 BNB
0x546ef3921fa5c53dd46456649145d86d79225c7c10d6e340d03b07f300e4504077958452021-05-28 7:11:2715 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token9.837340421769056912 BNB
0x546ef3921fa5c53dd46456649145d86d79225c7c10d6e340d03b07f300e4504077958452021-05-28 7:11:2715 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec09.866941245505573633 BNB
0xe9874490dce7125da908842cae0d031160a1ec7262f5ee1f97c2adcccb5e120477958322021-05-28 7:10:4815 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token9.45606873385068089 BNB
0xe9874490dce7125da908842cae0d031160a1ec7262f5ee1f97c2adcccb5e120477958322021-05-28 7:10:4815 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec09.48452230075293971 BNB
0x0e0a5d05167a206bdef6773de7c6d4f2f91f5e283815788608af159118b2dcc377958302021-05-28 7:10:4215 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token9.847010052992160661 BNB
0x0e0a5d05167a206bdef6773de7c6d4f2f91f5e283815788608af159118b2dcc377958302021-05-28 7:10:4215 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec09.876639972910893342 BNB
0x69839ab8ca56b96bc8f1cfbc028b40c776d4236afdf17747d011b510f075fa3177958262021-05-28 7:10:3015 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.017181819230659006 BNB
0x69839ab8ca56b96bc8f1cfbc028b40c776d4236afdf17747d011b510f075fa3177958262021-05-28 7:10:3015 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.017233519790029094 BNB
0x6c5c38f70ca7f4c25992709507bbe9b14cddbfe9ea17fe432c8a5887229598d377958232021-05-28 7:10:2115 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token5.21558297183712327 BNB
0x6c5c38f70ca7f4c25992709507bbe9b14cddbfe9ea17fe432c8a5887229598d377958232021-05-28 7:10:2115 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec05.231276802243854835 BNB
0xa4d2ae0477435813d753ab4bc0a0f601e4d3b89dc53dd61685c2054c5dd574cf77958212021-05-28 7:10:1515 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token10.036118567757824467 BNB
0xa4d2ae0477435813d753ab4bc0a0f601e4d3b89dc53dd61685c2054c5dd574cf77958212021-05-28 7:10:1515 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec010.06631752031878081 BNB
0x5081aafb5a0d81a0be82187fc73118854acbece271ee7e164356ecaf83fec18a77958182021-05-28 7:10:0615 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token10.232945395193843039 BNB
0x5081aafb5a0d81a0be82187fc73118854acbece271ee7e164356ecaf83fec18a77958182021-05-28 7:10:0615 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec010.263736605008869648 BNB
0xe4597a00ea1cd06330ff607ca8c7f72daf960e8756e918da82509c508a2ea56377958012021-05-28 7:09:1515 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token10.197963242114779703 BNB
0xe4597a00ea1cd06330ff607ca8c7f72daf960e8756e918da82509c508a2ea56377958012021-05-28 7:09:1515 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec010.228649189683831197 BNB
0xc3bf6b05530d3dfd4386274d634d31269baf826658a47eb0ce346bd2c3a0eb6377957732021-05-28 7:07:5115 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token10.386139457187354936 BNB
0xc3bf6b05530d3dfd4386274d634d31269baf826658a47eb0ce346bd2c3a0eb6377957732021-05-28 7:07:5115 days 4 hrs ago 0x05d2ccb0dc5108bd11b58fb2b1bf2396fa0e82a1 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec010.417391632083605754 BNB
0x324dbb547a7ebcef8f33720516b2668b8ed266a964f04ae5bcf03dbac6e1101f77957712021-05-28 7:07:4515 days 4 hrs ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token10.386139457187354936 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DemaxPlatform

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-09-28
*/

// Dependency file: contracts/interfaces/IDemaxTransferListener.sol

// pragma solidity >=0.6.6;

interface IDemaxTransferListener {
    function transferNotify(address from, address to, address token, uint amount)  external returns (bool);
    function upgradeProdutivity(address fromPair, address toPair) external;
}
// Dependency file: contracts/modules/Ownable.sol

// pragma solidity >=0.5.16;

contract Ownable {
    address public owner;

    event OwnerChanged(address indexed _oldOwner, address indexed _newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 'Ownable: FORBIDDEN');
        _;
    }

    function changeOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), 'Ownable: INVALID_ADDRESS');
        emit OwnerChanged(owner, _newOwner);
        owner = _newOwner;
    }

}

// Dependency file: contracts/interfaces/IDemaxPool.sol

// pragma solidity >=0.5.0;

interface IDemaxPool {
    function addRewardFromPlatform(address _pair, uint _amount) external;
    function preProductivityChanged(address _pair, address _user) external;
    function postProductivityChanged(address _pair, address _user) external;
}
// Dependency file: contracts/interfaces/IDemaxPair.sol

// pragma solidity >=0.5.0;

interface IDemaxPair {
  
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function totalSupply() external view returns (uint);
    function balanceOf(address) external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address from, address to, uint amount) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address tokenA, address tokenB, address platform, address dgas) external;
    function swapFee(uint amount, address token, address to) external ;
    function queryReward() external view returns (uint rewardAmount, uint blockNumber);
    function mintReward() external returns (uint rewardAmount);
    function getDGASReserve() external view returns (uint);
}

// Dependency file: contracts/interfaces/IDemaxFactory.sol

// pragma solidity >=0.5.0;

interface IDemaxFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function contractCodeHash() external view returns (bytes32);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function isPair(address pair) external view returns (bool);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function playerPairs(address player, uint index) external view returns (address pair);
    function getPlayerPairCount(address player) external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function addPlayerPair(address player, address _pair) external returns (bool);
}

// Dependency file: contracts/interfaces/IERC20.sol

// pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

// Dependency file: contracts/interfaces/IDemaxConfig.sol

// pragma solidity >=0.5.0;

interface IDemaxConfig {
    function governor() external view returns (address);
    function dev() external view returns (address);
    function PERCENT_DENOMINATOR() external view returns (uint);
    function getConfig(bytes32 _name) external view returns (uint minValue, uint maxValue, uint maxSpan, uint value, uint enable);
    function getConfigValue(bytes32 _name) external view returns (uint);
    function changeConfigValue(bytes32 _name, uint _value) external returns (bool);
    function checkToken(address _token) external view returns(bool);
    function checkPair(address tokenA, address tokenB) external view returns (bool);
    function listToken(address _token) external returns (bool);
    function getDefaultListTokens() external returns (address[] memory);
    function platform() external view returns  (address);
    function addToken(address _token) external returns (bool);
}
// Dependency file: contracts/interfaces/IDemaxGovernance.sol

// pragma solidity >=0.5.0;

interface IDemaxGovernance {
    function addPair(address _tokenA, address _tokenB) external returns (bool);
    function addReward(uint _value) external returns (bool);
}


// Dependency file: contracts/interfaces/IWETH.sol

// pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

// Dependency file: contracts/libraries/DemaxSwapLibrary.sol

// pragma solidity >=0.5.0;

// import '../interfaces/IDemaxPair.sol';
// import '../interfaces/IDemaxFactory.sol';
// import "./SafeMath.sol";

library DemaxSwapLibrary {
    using SafeMath for uint;

    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'DemaxSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'DemaxSwapLibrary: ZERO_ADDRESS');
    }

     function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        bytes32 rawAddress = keccak256(
         abi.encodePacked(
            bytes1(0xff),
            factory,
            salt,
            IDemaxFactory(factory).contractCodeHash()
            )
        );
     return address(bytes20(rawAddress << 96));
    }

    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IDemaxPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    
    function quoteEnhance(address factory, address tokenA, address tokenB, uint amountA) internal view returns(uint amountB) {
        (uint reserveA, uint reserveB) = getReserves(factory, tokenA, tokenB);
        return quote(amountA, reserveA, reserveB);
    }

    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'DemaxSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'DemaxSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = amountIn.mul(reserveOut);
        uint denominator = reserveIn.add(amountIn);
        amountOut = numerator / denominator;
    }
    
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut);
        uint denominator = reserveOut.sub(amountOut);
        amountIn = (numerator / denominator).add(1);
    }

}
// Dependency file: contracts/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

// pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

// Dependency file: contracts/libraries/SafeMath.sol

// SPDX-License-Identifier: MIT

// pragma solidity ^0.6.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

// pragma solidity >=0.5.16;

library ConfigNames {
    bytes32 public constant PRODUCE_DGAS_RATE = bytes32('PRODUCE_DGAS_RATE');
    bytes32 public constant SWAP_FEE_PERCENT = bytes32('SWAP_FEE_PERCENT');
    bytes32 public constant LIST_DGAS_AMOUNT = bytes32('LIST_DGAS_AMOUNT');
    bytes32 public constant UNSTAKE_DURATION = bytes32('UNSTAKE_DURATION');
    bytes32 public constant REMOVE_LIQUIDITY_DURATION = bytes32('REMOVE_LIQUIDITY_DURATION');
    bytes32 public constant TOKEN_TO_DGAS_PAIR_MIN_PERCENT = bytes32('TOKEN_TO_DGAS_PAIR_MIN_PERCENT');
    bytes32 public constant LIST_TOKEN_FAILURE_BURN_PRECENT = bytes32('LIST_TOKEN_FAILURE_BURN_PRECENT');
    bytes32 public constant LIST_TOKEN_SUCCESS_BURN_PRECENT = bytes32('LIST_TOKEN_SUCCESS_BURN_PRECENT');
    bytes32 public constant PROPOSAL_DGAS_AMOUNT = bytes32('PROPOSAL_DGAS_AMOUNT');
    bytes32 public constant VOTE_DURATION = bytes32('VOTE_DURATION');
    bytes32 public constant VOTE_REWARD_PERCENT = bytes32('VOTE_REWARD_PERCENT');
    bytes32 public constant TOKEN_PENGDING_SWITCH = bytes32('TOKEN_PENGDING_SWITCH');
    bytes32 public constant TOKEN_PENGDING_TIME = bytes32('TOKEN_PENGDING_TIME');
    bytes32 public constant LIST_TOKEN_SWITCH = bytes32('LIST_TOKEN_SWITCH');
    bytes32 public constant DEV_PRECENT = bytes32('DEV_PRECENT');
    bytes32 public constant FEE_GOVERNANCE_REWARD_PERCENT = bytes32('FEE_GOVERNANCE_REWARD_PERCENT');
    bytes32 public constant FEE_LP_REWARD_PERCENT = bytes32('FEE_LP_REWARD_PERCENT');
}
pragma solidity >=0.6.6;
// import './libraries/ConfigNames.sol';
// import './libraries/SafeMath.sol';
// import './libraries/TransferHelper.sol';
// import './libraries/DemaxSwapLibrary.sol';
// import './interfaces/IWETH.sol';
// import './interfaces/IDemaxGovernance.sol';
// import './interfaces/IDemaxConfig.sol';
// import './interfaces/IERC20.sol';
// import './interfaces/IDemaxFactory.sol';
// import './interfaces/IDemaxPair.sol';
// import './interfaces/IDemaxPool.sol';
// import './modules/Ownable.sol';
// import './interfaces/IDemaxTransferListener.sol';

contract DemaxPlatform is Ownable {
    uint256 public version = 1;
    address public DGAS;
    address public CONFIG;
    address public FACTORY;
    address public WETH;
    address public GOVERNANCE;
    address public TRANSFER_LISTENER;
    address public POOL;
    uint256 public constant PERCENT_DENOMINATOR = 10000;

    bool public isPause;

    event AddLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event RemoveLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event SwapToken(
        address indexed receiver,
        address indexed fromToken,
        address indexed toToken,
        uint256 inAmount,
        uint256 outAmount
    );

    receive() external payable {
        assert(msg.sender == WETH);
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, 'DEMAX PLATFORM : EXPIRED');
        _;
    }

    function initialize(
        address _DGAS,
        address _CONFIG,
        address _FACTORY,
        address _WETH,
        address _GOVERNANCE,
        address _TRANSFER_LISTENER,
        address _POOL
    ) external onlyOwner {
        DGAS = _DGAS;
        CONFIG = _CONFIG;
        FACTORY = _FACTORY;
        WETH = _WETH;
        GOVERNANCE = _GOVERNANCE;
        TRANSFER_LISTENER = _TRANSFER_LISTENER;
        POOL = _POOL;
    }

    function pause() external onlyOwner {
        isPause = true;
    }

    function resume() external onlyOwner {
        isPause = false;
    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (IDemaxFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            IDemaxConfig(CONFIG).addToken(tokenA);
            IDemaxConfig(CONFIG).addToken(tokenB);
            IDemaxFactory(FACTORY).createPair(tokenA, tokenB);
        }
        require(
            IDemaxConfig(CONFIG).checkPair(tokenA, tokenB),
            'DEMAX PLATFORM : ADD LIQUIDITY PAIR CONFIG CHECK FAIL'
        );
        (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = DemaxSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = DemaxSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
        IDemaxFactory(FACTORY).addPlayerPair(msg.sender, IDemaxFactory(FACTORY).getPair(tokenA, tokenB));
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline
    )
        external
        ensure(deadline)
        returns (
            uint256 _amountA,
            uint256 _amountB,
            uint256 _liquidity
        )
    {
        require(!isPause, "DEMAX PAUSED");
        (_amountA, _amountB) = _addLiquidity(tokenA, tokenB, amountA, amountB, amountAMin, amountBMin);
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, _amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, _amountB);

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        _liquidity = IDemaxPair(pair).mint(msg.sender);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, tokenA, _amountA);
        _transferNotify(msg.sender, pair, tokenB, _amountB);
        emit AddLiquidity(msg.sender, tokenA, tokenB, _amountA, _amountB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        require(!isPause, "DEMAX PAUSED");
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = DemaxSwapLibrary.pairFor(FACTORY, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        liquidity = IDemaxPair(pair).mint(msg.sender);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, WETH, amountETH);
        _transferNotify(msg.sender, pair, token, amountToken);
        emit AddLiquidity(msg.sender, token, WETH, amountToken, amountETH);
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        require(!isPause, "DEMAX PAUSED");
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        uint256 _liquidity = liquidity;
        address _tokenA = tokenA;
        address _tokenB = tokenB;

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        (uint256 amount0, uint256 amount1) = IDemaxPair(pair).burn(msg.sender, to, _liquidity);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        (address token0, ) = DemaxSwapLibrary.sortTokens(_tokenA, _tokenB);
        (amountA, amountB) = _tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        _transferNotify(pair, to, _tokenA, amountA);
        _transferNotify(pair, to, _tokenB, amountB);
        require(amountA >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
        emit RemoveLiquidity(msg.sender, _tokenA, _tokenB, amountA, amountB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        require(!isPause, "DEMAX PAUSED");
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
        _transferNotify(address(this), to, token, amountToken);
        _transferNotify(address(this), to, WETH, amountETH);
    }

    function _getAmountsOut(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountOuts) {
        amountOuts = new uint256[](path.length);
        amountOuts[0] = amount;
        for (uint256 i = 0; i < path.length - 1; i++) {
            address inPath = path[i];
            address outPath = path[i + 1];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 outAmount = SafeMath.mul(amountOuts[i], SafeMath.sub(PERCENT_DENOMINATOR, percent));
            amountOuts[i + 1] = DemaxSwapLibrary.getAmountOut(outAmount / PERCENT_DENOMINATOR, reserveA, reserveB);
        }
    }

    function _getAmountsIn(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountIn) {
        amountIn = new uint256[](path.length);
        amountIn[path.length - 1] = amount;
        for (uint256 i = path.length - 1; i > 0; i--) {
            address inPath = path[i - 1];
            address outPath = path[i];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 inAmount = DemaxSwapLibrary.getAmountIn(amountIn[i], reserveA, reserveB);
            amountIn[i - 1] = SafeMath.add(
                SafeMath.mul(inAmount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent),
                1
            );
        }
        amountIn = _getAmountsOut(amountIn[0], path, percent);
    }

    function swapPrecondition(address token) public view returns (bool) {
        if (token == DGAS || token == WETH) return true;
        uint256 percent = IDemaxConfig(CONFIG).getConfigValue(ConfigNames.TOKEN_TO_DGAS_PAIR_MIN_PERCENT);
        if (!existPair(WETH, DGAS)) return false;
        if (!existPair(DGAS, token)) return false;
        if (!(IDemaxConfig(CONFIG).checkPair(DGAS, token) && IDemaxConfig(CONFIG).checkPair(WETH, token))) return false;
        if (!existPair(WETH, token)) return true;
        if (percent == 0) return true;
        (uint256 reserveDGAS, ) = DemaxSwapLibrary.getReserves(FACTORY, DGAS, token);
        (uint256 reserveWETH, ) = DemaxSwapLibrary.getReserves(FACTORY, WETH, token);
        (uint256 reserveWETH2, uint256 reserveDGAS2) = DemaxSwapLibrary.getReserves(FACTORY, WETH, DGAS);
        uint256 dgasValue = SafeMath.mul(reserveDGAS, reserveWETH2) / reserveDGAS2;
        uint256 limitValue = SafeMath.mul(SafeMath.add(dgasValue, reserveWETH), percent) / PERCENT_DENOMINATOR;
        return dgasValue >= limitValue;
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal {
        require(!isPause, "DEMAX PAUSED");
        require(swapPrecondition(path[path.length - 1]), 'DEMAX PLATFORM : CHECK DGAS/TOKEN TO VALUE FAIL');
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            require(swapPrecondition(input), 'DEMAX PLATFORM : CHECK DGAS/TOKEN VALUE FROM FAIL');
            require(IDemaxConfig(CONFIG).checkPair(input, output), 'DEMAX PLATFORM : SWAP PAIR CONFIG CHECK FAIL');
            (address token0, address token1) = DemaxSwapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? DemaxSwapLibrary.pairFor(FACTORY, output, path[i + 2]) : _to;
            IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
            if (amount0Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token0, amount0Out);
            if (amount1Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token1, amount1Out);
        }
        emit SwapToken(_to, path[0], path[path.length - 1], amounts[0], amounts[path.length - 1]);
    }

    function _swapFee(
        uint256[] memory amounts,
        address[] memory path,
        uint256 percent
    ) internal {
        address[] memory feepath = new address[](2);
        feepath[1] = DGAS;
        for (uint256 i = 0; i < path.length - 1; i++) {
            uint256 fee = SafeMath.mul(amounts[i], percent) / PERCENT_DENOMINATOR;
            address input = path[i];
            address output = path[i + 1];
            address currentPair = DemaxSwapLibrary.pairFor(FACTORY, input, output);
            if (input == DGAS) {
                IDemaxPair(currentPair).swapFee(fee, DGAS, POOL);
                _transferNotify(currentPair, POOL, DGAS, fee);
            } else {
                IDemaxPair(currentPair).swapFee(fee, input, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS));
                (uint256 reserveIn, uint256 reserveDGAS) = DemaxSwapLibrary.getReserves(FACTORY, input, DGAS);
                uint256 feeOut = DemaxSwapLibrary.getAmountOut(fee, reserveIn, reserveDGAS);
                IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS)).swapFee(feeOut, DGAS, POOL);
                _transferNotify(currentPair, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), input, fee);
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), POOL, DGAS, feeOut);
                fee = feeOut;
            }
            if (fee > 0) IDemaxPool(POOL).addRewardFromPlatform(currentPair, fee);
        }
    }

    function _getSwapFeePercent() internal view returns (uint256) {
        return IDemaxConfig(CONFIG).getConfigValue(ConfigNames.SWAP_FEE_PERCENT);
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {

        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function _innerTransferFrom(
        address token,
        address from,
        address to,
        uint256 amount
    ) internal {
        TransferHelper.safeTransferFrom(token, from, to, amount);
        _transferNotify(from, to, token, amount);
    }

    function _innerTransferWETH(address to, uint256 amount) internal {
        assert(IWETH(WETH).transfer(to, amount));
        _transferNotify(address(this), to, WETH, amount);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(msg.value, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);

        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= msg.value, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');

        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function _transferNotify(
        address from,
        address to,
        address token,
        uint256 amount
    ) internal {
        IDemaxTransferListener(TRANSFER_LISTENER).transferNotify(from, to, token, amount);
    }

    function existPair(address tokenA, address tokenB) public view returns (bool) {
        return IDemaxFactory(FACTORY).getPair(tokenA, tokenB) != address(0);
    }

    function getReserves(address tokenA, address tokenB) public view returns (uint256, uint256) {
        return DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
    }

    function pairFor(address tokenA, address tokenB) public view returns (address) {
        return DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountOut) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR;
        return DemaxSwapLibrary.getAmountOut(amount, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountIn) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = DemaxSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
        return SafeMath.mul(amount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsOut(amountIn, path, percent);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsIn(amountOut, path, percent);
    }

    function migrateLiquidity(address pair, address tokenA, address tokenB, address[] calldata users) external onlyOwner {
        if (IDemaxFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            IDemaxFactory(FACTORY).createPair(tokenA, tokenB);
        }
        address newPair = IDemaxFactory(FACTORY).getPair(tokenA, tokenB);
        for(uint i = 0; i < users.length; i++) {
            uint liquidity = IDemaxPair(pair).balanceOf(users[i]);
            if(liquidity > 0) {
                IDemaxPair(pair).burn(users[i], newPair, liquidity);
                IDemaxPair(newPair).mint(users[i]);
                IDemaxFactory(FACTORY).addPlayerPair(users[i], newPair);
            }
        }

        IDemaxTransferListener(TRANSFER_LISTENER).upgradeProdutivity(pair, newPair);
        
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"inAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"SwapToken","type":"event"},{"inputs":[],"name":"CONFIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DGAS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_LISTENER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"_amountA","type":"uint256"},{"internalType":"uint256","name":"_amountB","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"existPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_DGAS","type":"address"},{"internalType":"address","name":"_CONFIG","type":"address"},{"internalType":"address","name":"_FACTORY","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_GOVERNANCE","type":"address"},{"internalType":"address","name":"_TRANSFER_LISTENER","type":"address"},{"internalType":"address","name":"_POOL","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"}],"name":"migrateLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"swapPrecondition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260018055600080546001600160a01b031916331790556152f1806100296000396000f3fe6080604052600436106101fd5760003560e01c806385f8c2591161010d578063baa2abde116100a0578063d92e82e41161006f578063d92e82e414610b6f578063ddd377ac14610b84578063f6f1e30614610bb7578063fb3bdb4114610bf5578063ff0938a714610c7957610218565b8063baa2abde146109d3578063c2ceddfa14610a30578063d06ca61f14610a7f578063d52bb6f414610b3457610218565b806396ed28f9116100dc57806396ed28f91461093b5780639e6c295914610976578063a6f9dae11461098b578063ad5c4648146109be57610218565b806385f8c259146107be5780638803dbee146107f45780638b61ff241461088a5780638da5cb5b1461092657610218565b806338ed1739116101905780637535d2461161015f5780637535d246146106825780637ae06e58146106975780637ff36ab514610710578063822abc7c146107945780638456cb59146107a957610218565b806338ed17391461052c5780634a25d94a146105c257806354fd4d5014610658578063723c2e2d1461066d57610218565b806318cbafe5116101cc57806318cbafe5146103175780631f00ca74146103fd5780632dd31000146104b257806335876476146104c757610218565b806302751cec1461021d578063046f7da214610289578063054d50d41461029e57806314627834146102e657610218565b36610218576005546001600160a01b0316331461021657fe5b005b600080fd5b34801561022957600080fd5b50610270600480360360c081101561024057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c8e565b6040805192835260208301919091528051918290030190f35b34801561029557600080fd5b50610216610df0565b3480156102aa57600080fd5b506102d4600480360360608110156102c157600080fd5b5080359060208101359060400135610e53565b60408051918252519081900360200190f35b3480156102f257600080fd5b506102fb610e99565b604080516001600160a01b039092168252519081900360200190f35b34801561032357600080fd5b506103ad600480360360a081101561033a57600080fd5b813591602081013591810190606081016040820135600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b91935091506001600160a01b038135169060200135610ea8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103e95781810151838201526020016103d1565b505050509050019250505060405180910390f35b34801561040957600080fd5b506103ad6004803603604081101561042057600080fd5b81359190810190604081016020820135600160201b81111561044157600080fd5b82018360208201111561045357600080fd5b803590602001918460208302840111600160201b8311171561047457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611205945050505050565b3480156104be57600080fd5b506102fb611228565b3480156104d357600080fd5b50610216600480360360e08110156104ea57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c09091013516611237565b34801561053857600080fd5b506103ad600480360360a081101561054f57600080fd5b813591602081013591810190606081016040820135600160201b81111561057557600080fd5b82018360208201111561058757600080fd5b803590602001918460208302840111600160201b831117156105a857600080fd5b91935091506001600160a01b038135169060200135611309565b3480156105ce57600080fd5b506103ad600480360360a08110156105e557600080fd5b813591602081013591810190606081016040820135600160201b81111561060b57600080fd5b82018360208201111561061d57600080fd5b803590602001918460208302840111600160201b8311171561063e57600080fd5b91935091506001600160a01b038135169060200135611460565b34801561066457600080fd5b506102d4611623565b34801561067957600080fd5b506102fb611629565b34801561068e57600080fd5b506102fb611638565b3480156106a357600080fd5b506106f2600480360360e08110156106ba57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135611647565b60408051938452602084019290925282820152519081900360600190f35b6103ad6004803603608081101561072657600080fd5b81359190810190604081016020820135600160201b81111561074757600080fd5b82018360208201111561075957600080fd5b803590602001918460208302840111600160201b8311171561077a57600080fd5b91935091506001600160a01b0381351690602001356118f7565b3480156107a057600080fd5b506102fb611c41565b3480156107b557600080fd5b50610216611c50565b3480156107ca57600080fd5b506102d4600480360360608110156107e157600080fd5b5080359060208101359060400135611cb9565b34801561080057600080fd5b506103ad600480360360a081101561081757600080fd5b813591602081013591810190606081016040820135600160201b81111561083d57600080fd5b82018360208201111561084f57600080fd5b803590602001918460208302840111600160201b8311171561087057600080fd5b91935091506001600160a01b038135169060200135611cff565b34801561089657600080fd5b50610216600480360360808110156108ad57600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b8111156108e857600080fd5b8201836020820111156108fa57600080fd5b803590602001918460208302840111600160201b8311171561091b57600080fd5b509092509050611e14565b34801561093257600080fd5b506102fb61235c565b34801561094757600080fd5b506102fb6004803603604081101561095e57600080fd5b506001600160a01b038135811691602001351661236b565b34801561098257600080fd5b506102d461238c565b34801561099757600080fd5b50610216600480360360208110156109ae57600080fd5b50356001600160a01b0316612392565b3480156109ca57600080fd5b506102fb61249c565b3480156109df57600080fd5b50610270600480360360e08110156109f657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124ab565b348015610a3c57600080fd5b50610a6b60048036036040811015610a5357600080fd5b506001600160a01b0381358116916020013516612805565b604080519115158252519081900360200190f35b348015610a8b57600080fd5b506103ad60048036036040811015610aa257600080fd5b81359190810190604081016020820135600160201b811115610ac357600080fd5b820183602082011115610ad557600080fd5b803590602001918460208302840111600160201b83111715610af657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061289d945050505050565b348015610b4057600080fd5b5061027060048036036040811015610b5757600080fd5b506001600160a01b03813581169160200135166128b6565b348015610b7b57600080fd5b506102fb6128de565b348015610b9057600080fd5b50610a6b60048036036020811015610ba757600080fd5b50356001600160a01b03166128ed565b6106f2600480360360a0811015610bcd57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612c1c565b6103ad60048036036080811015610c0b57600080fd5b81359190810190604081016020820135600160201b811115610c2c57600080fd5b820183602082011115610c3e57600080fd5b803590602001918460208302840111600160201b83111715610c5f57600080fd5b91935091506001600160a01b038135169060200135612fd6565b348015610c8557600080fd5b50610a6b613334565b6000808242811015610cd5576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615610d23576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b600554610d3f908a906001600160a01b03168a8a8a308a6124ab565b9093509150610d4f898685613344565b60055460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610d9c57600080fd5b505af1158015610db0573d6000803e3d6000fd5b50505050610dbe85836134ae565b610dca30868b866135a6565b600554610de490309087906001600160a01b0316856135a6565b50965096945050505050565b6000546001600160a01b03163314610e44576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b19169055565b600080610e5e61363e565b90506000612710610e7a87610e75612710866136cd565b61370f565b81610e8157fe5b049050610e8f818686613768565b9695505050505050565b6006546001600160a01b031681565b60608142811015610eee576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b031686866000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b031614610f63576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b6000610f6d61363e565b9050610fae89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b92508783600185510381518110610fc157fe5b602002602001015110156110065760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b600454600090611055906001600160a01b03168989848161102357fe5b905060200201356001600160a01b03168a8a600181811061104057fe5b905060200201356001600160a01b0316613956565b90506110998888600081811061106757fe5b905060200201356001600160a01b0316338361271061108c8f610e756127108a6136cd565b8161109357fe5b04613aa4565b6110d884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ac2915050565b60055484516001600160a01b0390911690632e1a7d4d90869060001981019081106110ff57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b50505050611176868560018751038151811061116957fe5b60200260200101516134ae565b6111b98888600081811061118657fe5b905060200201356001600160a01b0316338361271061108c896000815181106111ab57fe5b60200260200101518861370f565b6111f884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b5050509695505050505050565b6060600061121161363e565b905061121e84848361438b565b9150505b92915050565b6004546001600160a01b031681565b6000546001600160a01b0316331461128b576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600280546001600160a01b03199081166001600160a01b03998a1617909155600380548216978916979097179096556004805487169588169590951790945560058054861693871693909317909255600680548516918616919091179055600780548416918516919091179055600880549092169216919091179055565b6060814281101561134f576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600061135961363e565b905061139a89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b925087836001855103815181106113ad57fe5b602002602001015110156113f25760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b60045460009061140f906001600160a01b03168989848161102357fe5b90506114218888600081811061106757fe5b611176848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b606081428110156114a6576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660001981018181106114c257fe5b905060200201356001600160a01b03166001600160a01b03161461151b576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b600061152561363e565b90506115668988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b9250878360008151811061157657fe5b602002602001015111156115bb5760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b6004546000906115d8906001600160a01b03168989848161102357fe5b9050611099888860008181106115ea57fe5b905060200201356001600160a01b0316338361271061108c8960008151811061160f57fe5b6020026020010151610e756127108a6136cd565b60015481565b6002546001600160a01b031681565b6008546001600160a01b031681565b60008060008342811015611690576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff16156116de576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b6116ec8b8b8b8b8b8b6144f5565b600454919550935060009061170b906001600160a01b03168d8d613956565b90506117198c3383886149e0565b6117258b3383876149e0565b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b15801561177957600080fd5b505af115801561178d573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050506040513d602081101561180357600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b15801561185b57600080fd5b505af115801561186f573d6000803e3d6000fd5b5050505061187f33828e886135a6565b61188b33828d876135a6565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd98888604051808381526020018281526020019250505060405180910390a450509750975097945050505050565b6060814281101561193d576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660008161195457fe5b905060200201356001600160a01b03166001600160a01b0316146119ad576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b60006119b761363e565b90506119f834888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b92508783600185510381518110611a0b57fe5b60200260200101511015611a505760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b600454600090611a6d906001600160a01b03168989848161102357fe5b60055485519192506001600160a01b03169063d0e30db09061271090611aac908890600090611a9857fe5b6020026020010151610e75612710886136cd565b81611ab357fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b5050505050611b1c81612710611b0f87600081518110611a9857fe5b81611b1657fe5b04614b35565b611b5b848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b60055484516001600160a01b039091169063d0e30db09061271090611b93908890600090611b8557fe5b60200260200101518661370f565b81611b9a57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b5050505050611bf681612710611b0f87600081518110611b8557fe5b611c3584898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b50505095945050505050565b6007546001600160a01b031681565b6000546001600160a01b03163314611ca4576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b1916600160a01b179055565b600080611cc461363e565b90506000611cd3868686614bdb565b9050611ce1612710836136cd565b611ced8261271061370f565b81611cf457fe5b049695505050505050565b60608142811015611d45576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6000611d4f61363e565b9050611d908988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b92508783600081518110611da057fe5b60200260200101511115611de55760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b600454600090611e02906001600160a01b03168989848161102357fe5b9050611421888860008181106115ea57fe5b6000546001600160a01b03163314611e68576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b158015611ec357600080fd5b505afa158015611ed7573d6000803e3d6000fd5b505050506040513d6020811015611eed57600080fd5b50516001600160a01b03161415611f865760048054604080516364e329cb60e11b81526001600160a01b038881169482019490945286841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b505050506040513d6020811015611f8357600080fd5b50505b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b158015611fe157600080fd5b505afa158015611ff5573d6000803e3d6000fd5b505050506040513d602081101561200b57600080fd5b5051905060005b828110156122e5576000876001600160a01b03166370a0823186868581811061203757fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561208d57600080fd5b505afa1580156120a1573d6000803e3d6000fd5b505050506040513d60208110156120b757600080fd5b5051905080156122dc57876001600160a01b031663f6b911bc8686858181106120dc57fe5b905060200201356001600160a01b031685846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200193505050506040805180830381600087803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b505050506040513d604081101561217f57600080fd5b50506001600160a01b038316636a62784286868581811061219c57fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050506040513d602081101561221e57600080fd5b50506004546001600160a01b031663c9ead25886868581811061223d57fe5b905060200201356001600160a01b0316856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050602060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b505050506040513d60208110156122d957600080fd5b50505b50600101612012565b5060075460408051636ef9a3e760e01b81526001600160a01b038981166004830152848116602483015291519190921691636ef9a3e791604480830192600092919082900301818387803b15801561233c57600080fd5b505af1158015612350573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031681565b600454600090612385906001600160a01b03168484613956565b9392505050565b61271081565b6000546001600160a01b031633146123e6576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b038116612441576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b60008082428110156124f2576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615612540576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b60045460009061255a906001600160a01b03168c8c613956565b6008546040805163555d661160e11b81526001600160a01b03808516600483015233602483015291519394508c938f938f93169163aabacc2291604480830192600092919082900301818387803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505060408051633dae446f60e21b81523360048201526001600160a01b038d81166024830152604482018890528251600095508594509089169263f6b911bc926064808201939182900301818787803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505050506040513d604081101561264e57600080fd5b508051602090910151600854604080516368a6560d60e11b81526001600160a01b038b811660048301523360248301529151949650929450169163d14cac1a9160448082019260009290919082900301818387803b1580156126af57600080fd5b505af11580156126c3573d6000803e3d6000fd5b5050505060006126d38585614ca9565b509050806001600160a01b0316856001600160a01b0316146126f65781836126f9565b82825b909a50985061270a878d878d6135a6565b612716878d868c6135a6565b8d8a10156127555760405162461bcd60e51b81526004018080602001828103825260268152602001806150fe6026913960400191505060405180910390fd5b8c8910156127945760405162461bcd60e51b81526004018080602001828103825260268152602001806151f86026913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316336001600160a01b03167fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef98d8d604051808381526020018281526020019250505060405180910390a4505050505050505097509795505050505050565b600480546040805163e6a4390560e01b81526001600160a01b0386811694820194909452848416602482015290516000938493169163e6a43905916044808301926020929190829003018186803b15801561285f57600080fd5b505afa158015612873573d6000803e3d6000fd5b505050506040513d602081101561288957600080fd5b50516001600160a01b031614159392505050565b606060006128a961363e565b905061121e848483613824565b60045460009081906128d2906001600160a01b03168585614d80565b915091505b9250929050565b6003546001600160a01b031681565b6002546000906001600160a01b038381169116148061291957506005546001600160a01b038381169116145b1561292657506001612c17565b600354604080516360ccef1960e11b81527f544f4b454e5f544f5f444741535f504149525f4d494e5f50455243454e540000600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b15801561299157600080fd5b505afa1580156129a5573d6000803e3d6000fd5b505050506040513d60208110156129bb57600080fd5b50516005546002549192506129dc916001600160a01b039182169116612805565b6129ea576000915050612c17565b600254612a00906001600160a01b031684612805565b612a0e576000915050612c17565b6003546002546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612a6657600080fd5b505afa158015612a7a573d6000803e3d6000fd5b505050506040513d6020811015612a9057600080fd5b50518015612b1e57506003546005546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612af157600080fd5b505afa158015612b05573d6000803e3d6000fd5b505050506040513d6020811015612b1b57600080fd5b50515b612b2c576000915050612c17565b600554612b42906001600160a01b031684612805565b612b50576001915050612c17565b80612b5f576001915050612c17565b600454600254600091612b7f916001600160a01b03918216911686614d80565b50600454600554919250600091612ba3916001600160a01b03908116911687614d80565b506004546005546002549293506000928392612bcf926001600160a01b03918216929082169116614d80565b91509150600081612be0868561370f565b81612be757fe5b0490506000612710612c02612bfc8488614e4e565b8961370f565b81612c0957fe5b049091101596505050505050505b919050565b60008060008342811015612c65576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615612cb3576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b600554612cce908a906001600160a01b03168a348b8b6144f5565b600454600554929650909450600091612cf5916001600160a01b03908116918d9116613956565b9050612d038a3383886149e0565b600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b50506005546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050506040513d6020811015612dea57600080fd5b5051612df257fe5b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b158015612ea657600080fd5b505af1158015612eba573d6000803e3d6000fd5b505050506040513d6020811015612ed057600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b158015612f2857600080fd5b505af1158015612f3c573d6000803e3d6000fd5b5050600554612f5a925033915083906001600160a01b0316876135a6565b612f6633828c886135a6565b600554604080518781526020810187905281516001600160a01b03938416938e169233927fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd9929081900390910190a483341115612fc957612fc9338534036134ae565b5050955095509592505050565b6060814281101561301c576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660008161303357fe5b905060200201356001600160a01b03166001600160a01b03161461308c576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b600061309661363e565b90506130d78888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b925034836000815181106130e757fe5b6020026020010151111561312c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b60055483516001600160a01b039091169063d0e30db0906127109061316a90879060009061315657fe5b6020026020010151610e75612710876136cd565b8161317157fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319d57600080fd5b505af11580156131b1573d6000803e3d6000fd5b5050600454600093506131d492506001600160a01b031690508989848161102357fe5b90506131ed81612710611b0f87600081518110611a9857fe5b61322c848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b60055484516001600160a01b039091169063d0e30db09061271090613256908890600090611b8557fe5b8161325d57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561328957600080fd5b505af115801561329d573d6000803e3d6000fd5b50505050506132b981612710611b0f87600081518110611b8557fe5b6132f884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b8360008151811061330557fe5b6020026020010151341115611c3557611c35338560008151811061332557fe5b602002602001015134036134ae565b600854600160a01b900460ff1681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133c15780518252601f1990920191602091820191016133a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613423576040519150601f19603f3d011682016040523d82523d6000602084013e613428565b606091505b5091509150818015613456575080511580613456575080806020019051602081101561345357600080fd5b50515b6134a7576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134fa5780518252601f1990920191602091820191016134db565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461355c576040519150601f19603f3d011682016040523d82523d6000602084013e613561565b606091505b50509050806135a15760405162461bcd60e51b81526004018080602001828103825260238152602001806151d56023913960400191505060405180910390fd5b505050565b60075460408051632984b7a960e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163a612dea49160848083019260209291908290030181600087803b15801561360c57600080fd5b505af1158015613620573d6000803e3d6000fd5b505050506040513d602081101561363657600080fd5b505050505050565b600354604080516360ccef1960e11b81526f14d5d05417d1915157d4115490d1539560821b600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b15801561369c57600080fd5b505afa1580156136b0573d6000803e3d6000fd5b505050506040513d60208110156136c657600080fd5b5051905090565b600061238583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ea8565b60008261371e57506000611222565b8282028284828161372b57fe5b04146123855760405162461bcd60e51b81526004018080602001828103825260218152602001806150b86021913960400191505060405180910390fd5b60008084116137a85760405162461bcd60e51b815260040180806020018281038252602b81526020018061508d602b913960400191505060405180910390fd5b6000831180156137b85750600082115b6137f35760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b6000613805858463ffffffff61370f16565b90506000613819858763ffffffff614e4e16565b9050808281611cf457fe5b6060825167ffffffffffffffff8111801561383e57600080fd5b50604051908082528060200260200182016040528015613868578160200160208202803683370190505b509050838160008151811061387957fe5b602090810291909101015260005b600184510381101561394e5760008482815181106138a157fe5b6020026020010151905060008583600101815181106138bc57fe5b602002602001015190506000806138e9600460009054906101000a90046001600160a01b03168585614d80565b9150915060006139128787815181106138fe57fe5b6020026020010151610e756127108b6136cd565b905061392361271082048484613768565b87876001018151811061393257fe5b6020908102919091010152505060019093019250613887915050565b509392505050565b60008060006139658585614ca9565b915091506000828260405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050600060ff60f81b88838a6001600160a01b0316637c7f84ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a0857600080fd5b505afa158015613a1c573d6000803e3d6000fd5b505050506040513d6020811015613a3257600080fd5b5051604080516001600160f81b03199590951660208087019190915260609490941b6bffffffffffffffffffffffff191660218601526035850192909252605580850191909152815180850390910181526075909301905281519101206001600160a01b031698975050505050505050565b613ab0848484846149e0565b613abc838386846135a6565b50505050565b600854600160a01b900460ff1615613b10576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b613b3082600184510381518110613b2357fe5b60200260200101516128ed565b613b6b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061523e602f913960400191505060405180910390fd5b60005b6001835103811015613ee057600080848381518110613b8957fe5b6020026020010151858460010181518110613ba057fe5b602002602001015191509150613bb5826128ed565b613bf05760405162461bcd60e51b81526004018080602001828103825260318152602001806151246031913960400191505060405180910390fd5b6003546040805163a9ece1b760e01b81526001600160a01b03858116600483015284811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b158015613c4557600080fd5b505afa158015613c59573d6000803e3d6000fd5b505050506040513d6020811015613c6f57600080fd5b5051613cac5760405162461bcd60e51b815260040180806020018281038252602c8152602001806151a9602c913960400191505060405180910390fd5b600080613cb98484614ca9565b915091506000888660010181518110613cce57fe5b60200260200101519050600080846001600160a01b0316876001600160a01b031614613cfc57826000613d00565b6000835b91509150600060028b51038910613d175789613d48565b6004548b51613d48916001600160a01b03169089908e9060028e01908110613d3b57fe5b6020026020010151613956565b600454909150613d62906001600160a01b03168989613956565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d9f576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613e10578181015183820152602001613df8565b50505050905090810190601f168015613e3d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b505050506000831115613ea357600454613ea390613e9b906001600160a01b03168a8a613956565b8288866135a6565b8115613ecc57600454613ecc90613ec4906001600160a01b03168a8a613956565b8287856135a6565b505060019096019550613b6e945050505050565b5081600183510381518110613ef157fe5b60200260200101516001600160a01b031682600081518110613f0f57fe5b60200260200101516001600160a01b0316826001600160a01b03167f3070708cdb5d7d3931be8443f49f7ec529e2bbe770b676e3c0cc40e158c5d03986600081518110613f5857fe5b602002602001015187600188510381518110613f7057fe5b6020026020010151604051808381526020018281526020019250505060405180910390a4505050565b6040805160028082526060808301845292602083019080368337505060025482519293506001600160a01b0316918391506001908110613fd557fe5b6001600160a01b039092166020928302919091019091015260005b60018451038110156134a7576000612710614010878481518110611b8557fe5b8161401757fe5b049050600085838151811061402857fe5b60200260200101519050600086846001018151811061404357fe5b60200260200101519050600061406f600460009054906101000a90046001600160a01b03168484613956565b6002549091506001600160a01b0384811691161415614123576002546008546040805163012d9b4160e71b8152600481018890526001600160a01b039384166024820152918316604483015251918316916396cda0809160648082019260009290919082900301818387803b1580156140e757600080fd5b505af11580156140fb573d6000803e3d6000fd5b505060085460025461411e93508492506001600160a01b039182169116876135a6565b614307565b6004546002546001600160a01b03808416926396cda080928892889261414f9290821691849116613956565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b1580156141b757600080fd5b505af11580156141cb573d6000803e3d6000fd5b5050600454600254600093508392506141f2916001600160a01b0390811691889116614d80565b915091506000614203878484613768565b600454600254919250614224916001600160a01b0391821691899116613956565b6002546008546040805163012d9b4160e71b8152600481018690526001600160a01b03938416602482015291831660448301525192909116916396cda0809160648082019260009290919082900301818387803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b50506004546002546142c793508792506142c0916001600160a01b03908116918b9116613956565b888a6135a6565b600454600254614302916142e9916001600160a01b03918216918a9116613956565b6008546002546001600160a01b039182169116846135a6565b955050505b831561437b576008546040805163e60a6a0b60e01b81526001600160a01b038481166004830152602482018890529151919092169163e60a6a0b91604480830192600092919082900301818387803b15801561436257600080fd5b505af1158015614376573d6000803e3d6000fd5b505050505b505060019092019150613ff09050565b6060825167ffffffffffffffff811180156143a557600080fd5b506040519080825280602002602001820160405280156143cf578160200160208202803683370190505b50905083816001855103815181106143e357fe5b60209081029190910101528251600019015b80156144cd57600084600183038151811061440c57fe5b60200260200101519050600085838151811061442457fe5b60200260200101519050600080614451600460009054906101000a90046001600160a01b03168585614d80565b91509150600061447587878151811061446657fe5b60200260200101518484614bdb565b90506144a16144866127108a6136cd565b6144928361271061370f565b8161449957fe5b046001614e4e565b8760018803815181106144b057fe5b6020908102919091010152505060001990930192506143f5915050565b506144ed816000815181106144de57fe5b60200260200101518484613824565b949350505050565b600480546040805163e6a4390560e01b81526001600160a01b038a811694820194909452888416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b15801561455357600080fd5b505afa158015614567573d6000803e3d6000fd5b505050506040513d602081101561457d57600080fd5b50516001600160a01b0316141561470c576003546040805163d48bfca760e01b81526001600160a01b038b811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b1580156145dd57600080fd5b505af11580156145f1573d6000803e3d6000fd5b505050506040513d602081101561460757600080fd5b50506003546040805163d48bfca760e01b81526001600160a01b038a811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b15801561465857600080fd5b505af115801561466c573d6000803e3d6000fd5b505050506040513d602081101561468257600080fd5b505060048054604080516364e329cb60e11b81526001600160a01b038c8116948201949094528a841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b1580156146df57600080fd5b505af11580156146f3573d6000803e3d6000fd5b505050506040513d602081101561470957600080fd5b50505b6003546040805163a9ece1b760e01b81526001600160a01b038b811660048301528a811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b15801561476157600080fd5b505afa158015614775573d6000803e3d6000fd5b505050506040513d602081101561478b57600080fd5b50516147c85760405162461bcd60e51b81526004018080602001828103825260358152602001806150586035913960400191505060405180910390fd5b60045460009081906147e4906001600160a01b03168b8b614d80565b915091508160001480156147f6575080155b15614806578793508692506148c6565b6000614813898484614f3f565b9050878111614866578581101561485b5760405162461bcd60e51b81526004018080602001828103825260268152602001806151f86026913960400191505060405180910390fd5b8894509250826148c4565b6000614873898486614f3f565b90508981111561487f57fe5b878110156148be5760405162461bcd60e51b81526004018080602001828103825260268152602001806150fe6026913960400191505060405180910390fd5b94508793505b505b600480546040805163e6a4390560e01b81526001600160a01b038e8116948201949094528c841660248201529051929091169163c9ead258913391849163e6a43905916044808301926020929190829003018186803b15801561492857600080fd5b505afa15801561493c573d6000803e3d6000fd5b505050506040513d602081101561495257600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156149a457600080fd5b505af11580156149b8573d6000803e3d6000fd5b505050506040513d60208110156149ce57600080fd5b50939a92995091975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310614a655780518252601f199092019160209182019101614a46565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614ac7576040519150601f19603f3d011682016040523d82523d6000602084013e614acc565b606091505b5091509150818015614afa575080511580614afa5750808060200190516020811015614af757600080fd5b50515b6136365760405162461bcd60e51b815260040180806020018281038252602481526020018061526d6024913960400191505060405180910390fd5b6005546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015614b8b57600080fd5b505af1158015614b9f573d6000803e3d6000fd5b505050506040513d6020811015614bb557600080fd5b5051614bbd57fe5b600554614bd790309084906001600160a01b0316846135a6565b5050565b6000808411614c1b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061517d602c913960400191505060405180910390fd5b600083118015614c2b5750600082115b614c665760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b6000614c78848663ffffffff61370f16565b90506000614c8c848763ffffffff6136cd16565b9050610e8f6001828481614c9c57fe5b049063ffffffff614e4e16565b600080826001600160a01b0316846001600160a01b03161415614cfd5760405162461bcd60e51b81526004018080602001828103825260258152602001806150d96025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614d1d578284614d20565b83835b90925090506001600160a01b0382166128d7576040805162461bcd60e51b815260206004820152601e60248201527f44656d6178537761704c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b6000806000614d8f8585614ca9565b509050600080614da0888888613956565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614dd857600080fd5b505afa158015614dec573d6000803e3d6000fd5b505050506040513d6060811015614e0257600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614614e3c578082614e3f565b81815b90999098509650505050505050565b600082820183811015612385576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008184841115614f375760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614efc578181015183820152602001614ee4565b50505050905090810190601f168015614f295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000808411614f7f5760405162461bcd60e51b81526004018080602001828103825260258152602001806150136025913960400191505060405180910390fd5b600083118015614f8f5750600082115b614fca5760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b82614fdb858463ffffffff61370f16565b81614fe257fe5b0494935050505056fe44454d415820504c4154464f524d203a204558434553534956455f494e5055545f414d4f554e5444656d6178537761704c6962726172793a20494e53554646494349454e545f414d4f554e5444454d415820504c4154464f524d203a2045585049524544000000000000000044454d415820504c4154464f524d203a20414444204c4951554944495459205041495220434f4e46494720434845434b204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7744656d6178537761704c6962726172793a204944454e544943414c5f41444452455353455344454d415820504c4154464f524d203a20494e53554646494349454e545f415f414d4f554e5444454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e2056414c55452046524f4d204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f4c495155494449545944656d6178537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5444454d415820504c4154464f524d203a2053574150205041495220434f4e46494720434845434b204641494c5472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f425f414d4f554e5444454d415820504c4154464f524d203a20494e56414c49445f5041544800000044454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e20544f2056414c5545204641494c5472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f4f55545055545f414d4f554e54a264697066735822122053277956602222a84aa1b322bb86cea17c655dbb8fe9ab046dabc5c6bedc9c3664736f6c63430006060033

Deployed ByteCode Sourcemap

18857:24239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19844:4;;-1:-1:-1;;;;;19844:4:0;19830:10;:18;19823:26;;;;18857:24239;;12:1:-1;9;2:12;26306:845:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26306:845:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26306:845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20542:71;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20542:71:0;;;:::i;40980:404::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40980:404:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40980:404:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19040:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19040:25:0;;;:::i;:::-;;;;-1:-1:-1;;;;;19040:25:0;;;;;;;;;;;;;;35682:1172;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35682:1172:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35682:1172:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35682:1172:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35682:1172:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35682:1172:0;;-1:-1:-1;35682:1172:0;-1:-1:-1;;;;;;35682:1172:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35682:1172:0;;;;;;;;;;;;;;;;;42036:225;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42036:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;42036:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42036:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42036:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42036:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42036:225:0;;-1:-1:-1;42036:225:0;;-1:-1:-1;;;;;42036:225:0:i;18985:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18985:22:0;;;:::i;20002:455::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20002:455:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20002:455:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33076:948::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33076:948:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33076:948:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33076:948:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33076:948:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33076:948:0;;-1:-1:-1;33076:948:0;-1:-1:-1;;;;;;33076:948:0;;;;;;;;:::i;37798:1152::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37798:1152:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37798:1152:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;37798:1152:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37798:1152:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37798:1152:0;;-1:-1:-1;37798:1152:0;-1:-1:-1;;;;;;37798:1152:0;;;;;;;;:::i;18898:26::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18898:26:0;;;:::i;18931:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18931:19:0;;;:::i;19111:::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19111:19:0;;;:::i;22352:1199::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22352:1199:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22352:1199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;34494:1180;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34494:1180:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34494:1180:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34494:1180:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34494:1180:0;;-1:-1:-1;34494:1180:0;-1:-1:-1;;;;;;34494:1180:0;;;;;;;;:::i;19072:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19072:32:0;;;:::i;20465:69::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20465:69:0;;;:::i;41392:403::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41392:403:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41392:403:0;;;;;;;;;;;;:::i;36862:928::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36862:928:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36862:928:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36862:928:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36862:928:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36862:928:0;;-1:-1:-1;36862:928:0;-1:-1:-1;;;;;;36862:928:0;;;;;;;;:::i;42269:824::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42269:824:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;42269:824:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42269:824:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42269:824:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;42269:824:0;;-1:-1:-1;42269:824:0;-1:-1:-1;42269:824:0;:::i;436:20::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;436:20:0;;;:::i;40818:154::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40818:154:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40818:154:0;;;;;;;;;;:::i;19137:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19137:51:0;;;:::i;722:210::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;722:210:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;722:210:0;-1:-1:-1;;;;;722:210:0;;:::i;19014:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19014:19:0;;;:::i;24994:1304::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24994:1304:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24994:1304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40467:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40467:164:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40467:164:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41803:225;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41803:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;41803:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;41803:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41803:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41803:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41803:225:0;;-1:-1:-1;41803:225:0;;-1:-1:-1;;;;;41803:225:0:i;40639:171::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40639:171:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40639:171:0;;;;;;;;;;:::i;18957:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18957:21:0;;;:::i;28783:1078::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28783:1078:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28783:1078:0;-1:-1:-1;;;;;28783:1078:0;;:::i;23559:1427::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23559:1427:0;;;;;;;;;;;;;;;;;;;;;;;:::i;38958:1259::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38958:1259:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;38958:1259:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38958:1259:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38958:1259:0;;-1:-1:-1;38958:1259:0;-1:-1:-1;;;;;;38958:1259:0;;;;;;;;:::i;19197:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19197:19:0;;;:::i;26306:845::-;26538:19;26559:17;26519:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;26598:7:::1;::::0;-1:-1:-1;;;26598:7:0;::::1;;;26597:8;26589:33;;;::::0;;-1:-1:-1;;;26589:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26589:33:0;;;;;;;;;;;;;::::1;;26710:4;::::0;26660:196:::1;::::0;26690:5;;-1:-1:-1;;;;;26710:4:0::1;26729:9:::0;26753:14;26782:12;26817:4:::1;26837:8:::0;26660:15:::1;:196::i;:::-;26633:223:::0;;-1:-1:-1;26633:223:0;-1:-1:-1;26867:51:0::1;26895:5:::0;26902:2;26633:223;26867:27:::1;:51::i;:::-;26935:4;::::0;26929:31:::1;::::0;;-1:-1:-1;;;26929:31:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;26935:4:0;;::::1;::::0;26929:20:::1;::::0;:31;;;;;26935:4:::1;::::0;26929:31;;;;;;;;26935:4;;26929:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26929:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26929:31:0;;;;26971:45;27002:2;27006:9;26971:30;:45::i;:::-;27027:54;27051:4;27058:2;27062:5;27069:11;27027:15;:54::i;:::-;27127:4;::::0;27092:51:::1;::::0;27116:4:::1;::::0;27123:2;;-1:-1:-1;;;;;27127:4:0::1;27133:9:::0;27092:15:::1;:51::i;:::-;26306:845:::0;;;;;;;;;;:::o;20542:71::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20590:7:::1;:15:::0;;-1:-1:-1;;;;20590:15:0::1;::::0;;20542:71::o;40980:404::-;41114:17;41144:15;41162:20;:18;:20::i;:::-;41144:38;;41193:14;19183:5;41210:66;41223:8;41233:42;19183:5;41267:7;41233:12;:42::i;:::-;41210:12;:66::i;:::-;:88;;;;;;41193:105;;41316:60;41346:6;41354:9;41365:10;41316:29;:60::i;:::-;41309:67;40980:404;-1:-1:-1;;;;;;40980:404:0:o;19040:25::-;;;-1:-1:-1;;;;;19040:25:0;;:::o;35682:1172::-;35895:24;35876:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;35965:4:::1;::::0;-1:-1:-1;;;;;35965:4:0::1;35940::::0;;-1:-1:-1;;35945:15:0;;35940:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35940:21:0::1;-1:-1:-1::0;;;;;35940:29:0::1;;35932:71;;;::::0;;-1:-1:-1;;;35932:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35932:71:0;;;;;;;;;;;;;::::1;;36014:15;36032:20;:18;:20::i;:::-;36014:38;;36073:39;36088:8;36098:4;;36073:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36104:7:0;;-1:-1:-1;36073:14:0::1;::::0;-1:-1:-1;;36073:39:0:i:1;:::-;36063:49;;36162:12;36131:7;36156:1;36139:7;:14;:18;36131:27;;;;;;;;;;;;;;:43;;36123:99;;;;-1:-1:-1::0;;;36123:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36273:7;::::0;36233:12:::1;::::0;36248:51:::1;::::0;-1:-1:-1;;;;;36273:7:0::1;36282:4:::0;;36233:12;36282:7;::::1;;;;;;;;;;-1:-1:-1::0;;;;;36282:7:0::1;36291:4;;36296:1;36291:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36291:7:0::1;36248:24;:51::i;:::-;36233:66;;36310:198;36343:4;;36348:1;36343:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36343:7:0::1;36365:10;36390:4;19183:5;36409:66;36422:8;36432:42;19183:5;36466:7;36432:12;:42::i;36409:66::-;:88;;;;;;36310:18;:198::i;:::-;36519:35;36525:7;36534:4;;36519:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36548:4:0::1;::::0;-1:-1:-1;36519:5:0::1;::::0;-1:-1:-1;;36519:35:0:i:1;:::-;36571:4;::::0;36594:14;;-1:-1:-1;;;;;36571:4:0;;::::1;::::0;36565:20:::1;::::0;36586:7;;-1:-1:-1;;36594:18:0;;;36586:27;::::1;;;;;;;;;;;36565:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36565:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36565:49:0;;;;36625:63;36656:2;36660:7;36685:1;36668:7;:14;:18;36660:27;;;;;;;;;;;;;;36625:30;:63::i;:::-;36701:102;36720:4;;36725:1;36720:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36720:7:0::1;36729:10;36741:4;19183:5;36747:33;36760:7;36768:1;36760:10;;;;;;;;;;;;;;36772:7;36747:12;:33::i;36701:102::-;36814:32;36823:7;36832:4;;36814:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36838:7:0;;-1:-1:-1;36814:8:0::1;::::0;-1:-1:-1;;36814:32:0:i:1;:::-;19985:1;;35682:1172:::0;;;;;;;;;:::o;42036:225::-;42121:24;42158:15;42176:20;:18;:20::i;:::-;42158:38;;42214:39;42228:9;42239:4;42245:7;42214:13;:39::i;:::-;42207:46;;;42036:225;;;;;:::o;18985:22::-;;;-1:-1:-1;;;;;18985:22:0;;:::o;20002:455::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20251:4:::1;:12:::0;;-1:-1:-1;;;;;;20251:12:0;;::::1;-1:-1:-1::0;;;;;20251:12:0;;::::1;;::::0;;;20274:6:::1;:16:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20301:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20330:4:::1;:12:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20353:10:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;20388:17:::1;:38:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;20437:4:::1;:12:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;20002:455::o;33076:948::-;33292:24;33273:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;33331:15:::1;33349:20;:18;:20::i;:::-;33331:38;;33390:39;33405:8;33415:4;;33390:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33421:7:0;;-1:-1:-1;33390:14:0::1;::::0;-1:-1:-1;;33390:39:0:i:1;:::-;33380:49;;33479:12;33448:7;33473:1;33456:7;:14;:18;33448:27;;;;;;;;;;;;;;:43;;33440:99;;;;-1:-1:-1::0;;;33440:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33590:7;::::0;33550:12:::1;::::0;33565:51:::1;::::0;-1:-1:-1;;;;;33590:7:0::1;33599:4:::0;;33550:12;33599:7;::::1;;;33565:51;33550:66;;33627:198;33660:4;;33665:1;33660:7;;;;;;33627:198;33836:24;33842:7;33851:4;;33836:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33857:2:0;;-1:-1:-1;33836:5:0::1;::::0;-1:-1:-1;;33836:24:0:i:1;37798:1152::-:0;38011:24;37992:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;38081:4:::1;::::0;-1:-1:-1;;;;;38081:4:0::1;38056::::0;;-1:-1:-1;;38061:15:0;;38056:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;38056:21:0::1;-1:-1:-1::0;;;;;38056:29:0::1;;38048:71;;;::::0;;-1:-1:-1;;;38048:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38048:71:0;;;;;;;;;;;;;::::1;;38130:15;38148:20;:18;:20::i;:::-;38130:38;;38189:39;38203:9;38214:4;;38189:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38220:7:0;;-1:-1:-1;38189:13:0::1;::::0;-1:-1:-1;;38189:39:0:i:1;:::-;38179:49;;38261:11;38247:7;38255:1;38247:10;;;;;;;;;;;;;;:25;;38239:77;;;;-1:-1:-1::0;;;38239:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38367:7;::::0;38327:12:::1;::::0;38342:51:::1;::::0;-1:-1:-1;;;;;38367:7:0::1;38376:4:::0;;38327:12;38376:7;::::1;;;38342:51;38327:66;;38404:200;38437:4;;38442:1;38437:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;38437:7:0::1;38459:10;38484:4;19183:5;38503:68;38516:7;38524:1;38516:10;;;;;;;;;;;;;;38528:42;19183:5;38562:7;38528:12;:42::i;18898:26::-:0;;;;:::o;18931:19::-;;;-1:-1:-1;;;;;18931:19:0;;:::o;19111:::-;;;-1:-1:-1;;;;;19111:19:0;;:::o;22352:1199::-;22644:16;22675;22706:18;22602:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;22761:7:::1;::::0;-1:-1:-1;;;22761:7:0;::::1;;;22760:8;22752:33;;;::::0;;-1:-1:-1;;;22752:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22752:33:0;;;;;;;;;;;;;::::1;;22819:71;22833:6;22841;22849:7;22858;22867:10;22879;22819:13;:71::i;:::-;22941:7;::::0;22796:94;;-1:-1:-1;22796:94:0;-1:-1:-1;22901:12:0::1;::::0;22916:49:::1;::::0;-1:-1:-1;;;;;22941:7:0::1;22950:6:::0;22958;22916:24:::1;:49::i;:::-;22901:64;;22976:67;23008:6;23016:10;23028:4;23034:8;22976:31;:67::i;:::-;23054;23086:6;23094:10;23106:4;23112:8;23054:31;:67::i;:::-;23169:4;::::0;23158:57:::1;::::0;;-1:-1:-1;;;23158:57:0;;-1:-1:-1;;;;;23158:57:0;;::::1;;::::0;::::1;::::0;23204:10:::1;23158:57:::0;;;;;;23169:4;;;::::1;::::0;23158:39:::1;::::0;:57;;;;;23169:4:::1;::::0;23158:57;;;;;;;23169:4;;23158:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23158:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;23239:33:0::1;::::0;;-1:-1:-1;;;23239:33:0;;23261:10:::1;23239:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;23239:21:0;::::1;::::0;-1:-1:-1;23239:21:0::1;::::0;-1:-1:-1;23239:33:0;;;;;::::1;::::0;;;;;;;;-1:-1:-1;23239:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23239:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23239:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23239:33:0;23294:4:::1;::::0;23283:58:::1;::::0;;-1:-1:-1;;;23283:58:0;;-1:-1:-1;;;;;23283:58:0;;::::1;;::::0;::::1;::::0;23330:10:::1;23283:58:::0;;;;;;23239:33;;-1:-1:-1;23294:4:0;::::1;::::0;23283:40:::1;::::0;:58;;;;;23294:4:::1;::::0;23283:58;;;;;;;;23294:4;;23283:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23283:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23283:58:0;;;;23354:51;23370:10;23382:4;23388:6;23396:8;23354:15;:51::i;:::-;23416;23432:10;23444:4;23450:6;23458:8;23416:15;:51::i;:::-;23516:6;-1:-1:-1::0;;;;;23483:60:0::1;23508:6;-1:-1:-1::0;;;;;23483:60:0::1;23496:10;-1:-1:-1::0;;;;;23483:60:0::1;;23524:8;23534;23483:60;;;;;;;;;;;;;;;;;;;;;;;;19985:1;22352:1199:::0;;;;;;;;;;;;:::o;34494:1180::-;34688:24;34669:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;34744:4:::1;::::0;-1:-1:-1;;;;;34744:4:0::1;34733::::0;;34744::::1;34733:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;34733:7:0::1;-1:-1:-1::0;;;;;34733:15:0::1;;34725:57;;;::::0;;-1:-1:-1;;;34725:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34725:57:0;;;;;;;;;;;;;::::1;;34793:15;34811:20;:18;:20::i;:::-;34793:38;;34852:40;34867:9;34878:4;;34852:40;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34884:7:0;;-1:-1:-1;34852:14:0::1;::::0;-1:-1:-1;;34852:40:0:i:1;:::-;34842:50;;34942:12;34911:7;34936:1;34919:7;:14;:18;34911:27;;;;;;;;;;;;;;:43;;34903:99;;;;-1:-1:-1::0;;;34903:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35053:7;::::0;35013:12:::1;::::0;35028:51:::1;::::0;-1:-1:-1;;;;;35053:7:0::1;35062:4:::0;;35013:12;35062:7;::::1;;;35028:51;35096:4;::::0;35144:10;;35013:66;;-1:-1:-1;;;;;;35096:4:0::1;::::0;35090:19:::1;::::0;19183:5:::1;::::0;35131:68:::1;::::0;35144:7;;35096:4:::1;::::0;35144:10:::1;;;;;;;;;;35156:42;19183:5;35190:7;35156:12;:42::i;35131:68::-;:90;;;;;;35090:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35090:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35090:144:0;;;;;35245:153;35278:4;19183:5;35297:68;35310:7;35318:1;35310:10;;;;;;;35297:68;:90;;;;;;35245:18;:153::i;:::-;35409:24;35415:7;35424:4;;35409:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35430:2:0;;-1:-1:-1;35409:5:0::1;::::0;-1:-1:-1;;35409:24:0:i:1;:::-;35452:4;::::0;35486:10;;-1:-1:-1;;;;;35452:4:0;;::::1;::::0;35446:19:::1;::::0;19183:5:::1;::::0;35473:33:::1;::::0;35486:7;;35452:4:::1;::::0;35486:10:::1;;;;;;;;;;35498:7;35473:12;:33::i;:::-;:55;;;;;;35446:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35446:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35446:85:0;;;;;35542:81;35561:4;19183:5;35567:33;35580:7;35588:1;35580:10;;;;;;;35542:81;35634:32;35643:7;35652:4;;35634:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35658:7:0;;-1:-1:-1;35634:8:0::1;::::0;-1:-1:-1;;35634:32:0:i:1;:::-;19985:1;;34494:1180:::0;;;;;;;;:::o;19072:32::-;;;-1:-1:-1;;;;;19072:32:0;;:::o;20465:69::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20512:7:::1;:14:::0;;-1:-1:-1;;;;20512:14:0::1;-1:-1:-1::0;;;20512:14:0::1;::::0;;20465:69::o;41392:403::-;41526:16;41555:15;41573:20;:18;:20::i;:::-;41555:38;;41604:14;41621:62;41650:9;41661;41672:10;41621:28;:62::i;:::-;41604:79;;41745:42;19183:5;41779:7;41745:12;:42::i;:::-;41701:41;41714:6;19183:5;41701:12;:41::i;:::-;:86;;;;;;;41392:403;-1:-1:-1;;;;;;41392:403:0:o;36862:928::-;37078:24;37059:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;37115:15:::1;37133:20;:18;:20::i;:::-;37115:38;;37174:39;37188:9;37199:4;;37174:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37205:7:0;;-1:-1:-1;37174:13:0::1;::::0;-1:-1:-1;;37174:39:0:i:1;:::-;37164:49;;37246:11;37232:7;37240:1;37232:10;;;;;;;;;;;;;;:25;;37224:77;;;;-1:-1:-1::0;;;37224:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37352:7;::::0;37312:12:::1;::::0;37327:51:::1;::::0;-1:-1:-1;;;;;37352:7:0::1;37361:4:::0;;37312:12;37361:7;::::1;;;37327:51;37312:66;;37391:200;37424:4;;37429:1;37424:7;;;;;;42269:824:::0;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;42415:7:::1;::::0;;42401:46:::1;::::0;;-1:-1:-1;;;42401:46:0;;-1:-1:-1;;;;;42401:46:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;-1:-1:-1;;42415:7:0;;::::1;::::0;42401:30:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;;42415:7;42401:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42401:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42401:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42401:46:0;-1:-1:-1;;;;;42401:60:0::1;;42397:142;;;42492:7;::::0;;42478:49:::1;::::0;;-1:-1:-1;;;42478:49:0;;-1:-1:-1;;;;;42478:49:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;42492:7;;;::::1;::::0;42478:33:::1;::::0;:49;;;;;::::1;::::0;;;;;;;;;42492:7:::1;::::0;42478:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42478:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42478:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42397:142:0::1;42581:7;::::0;;42567:46:::1;::::0;;-1:-1:-1;;;42567:46:0;;-1:-1:-1;;;;;42567:46:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;42549:15:::1;::::0;42581:7;;::::1;::::0;42567:30:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;;42581:7;42567:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42567:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42567:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42567:46:0;;-1:-1:-1;42628:6:0::1;42624:364;42640:16:::0;;::::1;42624:364;;;42678:14;42706:4;-1:-1:-1::0;;;;;42695:26:0::1;;42722:5;;42728:1;42722:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;42722:8:0::1;42695:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;42695:36:0::1;-1:-1:-1::0;;;;;42695:36:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42695:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42695:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42695:36:0;;-1:-1:-1;42749:13:0;;42746:231:::1;;42794:4;-1:-1:-1::0;;;;;42783:21:0::1;;42805:5;;42811:1;42805:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;42805:8:0::1;42815:7;42824:9;42783:51;;;;;;;;;;;;;-1:-1:-1::0;;;;;42783:51:0::1;-1:-1:-1::0;;;;;42783:51:0::1;;;;;;-1:-1:-1::0;;;;;42783:51:0::1;-1:-1:-1::0;;;;;42783:51:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42783:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42783:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;;;;;;42853:24:0;::::1;;42878:5:::0;;42884:1;42878:8;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;42878:8:0::1;42853:34;;;;;;;;;;;;;-1:-1:-1::0;;;;;42853:34:0::1;-1:-1:-1::0;;;;;42853:34:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42853:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42853:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42920:7:0::1;::::0;-1:-1:-1;;;;;42920:7:0::1;42906:36;42943:5:::0;;42949:1;42943:8;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;42943:8:0::1;42953:7;42906:55;;;;;;;;;;;;;-1:-1:-1::0;;;;;42906:55:0::1;-1:-1:-1::0;;;;;42906:55:0::1;;;;;;-1:-1:-1::0;;;;;42906:55:0::1;-1:-1:-1::0;;;;;42906:55:0::1;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42906:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42906:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42746:231:0::1;-1:-1:-1::0;42658:3:0::1;;42624:364;;;-1:-1:-1::0;43023:17:0::1;::::0;43000:75:::1;::::0;;-1:-1:-1;;;43000:75:0;;-1:-1:-1;;;;;43000:75:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;43023:17;;;::::1;::::0;43000:60:::1;::::0;:75;;;;;43023:17:::1;::::0;43000:75;;;;;;;43023:17;;43000:75;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43000:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43000:75:0;;;;705:1;42269:824:::0;;;;;:::o;436:20::-;;;-1:-1:-1;;;;;436:20:0;;:::o;40818:154::-;40940:7;;40888;;40915:49;;-1:-1:-1;;;;;40940:7:0;40949:6;40957;40915:24;:49::i;:::-;40908:56;40818:154;-1:-1:-1;;;40818:154:0:o;19137:51::-;19183:5;19137:51;:::o;722:210::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;798:23:0;::::1;790:60;;;::::0;;-1:-1:-1;;;790:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;879:5;::::0;;866:30:::1;::::0;-1:-1:-1;;;;;866:30:0;;::::1;::::0;879:5;::::1;::::0;866:30:::1;::::0;::::1;907:5;:17:::0;;-1:-1:-1;;;;;;907:17:0::1;-1:-1:-1::0;;;;;907:17:0;;;::::1;::::0;;;::::1;::::0;;722:210::o;19014:19::-;;;-1:-1:-1;;;;;19014:19:0;;:::o;24994:1304::-;25243:15;25260;25224:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;25297:7:::1;::::0;-1:-1:-1;;;25297:7:0;::::1;;;25296:8;25288:33;;;::::0;;-1:-1:-1;;;25288:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25288:33:0;;;;;;;;;;;;;::::1;;25372:7;::::0;25332:12:::1;::::0;25347:49:::1;::::0;-1:-1:-1;;;;;25372:7:0::1;25381:6:::0;25389;25347:24:::1;:49::i;:::-;25555:4;::::0;25544:57:::1;::::0;;-1:-1:-1;;;25544:57:0;;-1:-1:-1;;;;;25544:57:0;;::::1;;::::0;::::1;::::0;25590:10:::1;25544:57:::0;;;;;;25332:64;;-1:-1:-1;25428:9:0;;25466:6;;25501;;25555:4:::1;::::0;25544:39:::1;::::0;:57;;;;;25407:18:::1;::::0;25544:57;;;;;;;25407:18;25555:4;25544:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25544:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;25649:49:0::1;::::0;;-1:-1:-1;;;25649:49:0;;25671:10:::1;25649:49;::::0;::::1;::::0;-1:-1:-1;;;;;25649:49:0;;::::1;::::0;;;;;;;;;;;;25613:15:::1;::::0;-1:-1:-1;25613:15:0;;-1:-1:-1;25649:21:0;;::::1;::::0;::::1;::::0;:49;;;;;;;;;;;25613:15;25649:21;:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25649:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25649:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25649:49:0;;::::1;::::0;;::::1;::::0;25720:4:::1;::::0;25649:49;25709:58;;-1:-1:-1;;;25709:58:0;;-1:-1:-1;;;;;25709:58:0;;::::1;;::::0;::::1;::::0;25756:10:::1;25709:58:::0;;;;;;25649:49;;-1:-1:-1;25649:49:0;;-1:-1:-1;25720:4:0::1;::::0;25709:40:::1;::::0;:58;;;;;25720:4:::1;::::0;25709:58;;;;;;;;25720:4;;25709:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25709:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25709:58:0;;;;25781:14;25801:45;25829:7;25838;25801:27;:45::i;:::-;25780:66;;;25889:6;-1:-1:-1::0;;;;;25878:17:0::1;:7;-1:-1:-1::0;;;;;25878:17:0::1;;:59;;25920:7;25929;25878:59;;;25899:7;25908;25878:59;25857:80:::0;;-1:-1:-1;25857:80:0;-1:-1:-1;25948:43:0::1;25964:4:::0;25970:2;25974:7;25857:80;25948:15:::1;:43::i;:::-;26002;26018:4;26024:2;26028:7;26037;26002:15;:43::i;:::-;26075:10;26064:7;:21;;26056:72;;;;-1:-1:-1::0;;;26056:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26158:10;26147:7;:21;;26139:72;;;;-1:-1:-1::0;;;26139:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26264:7;-1:-1:-1::0;;;;;26227:63:0::1;26255:7;-1:-1:-1::0;;;;;26227:63:0::1;26243:10;-1:-1:-1::0;;;;;26227:63:0::1;;26273:7;26282;26227:63;;;;;;;;;;;;;;;;;;;;;;;;19985:1;;;;;;;24994:1304:::0;;;;;;;;;;;:::o;40467:164::-;40577:7;;;40563:46;;;-1:-1:-1;;;40563:46:0;;-1:-1:-1;;;;;40563:46:0;;;;;;;;;;;;;;;;;;;40539:4;;;;40577:7;;40563:30;;:46;;;;;;;;;;;;;;40577:7;40563:46;;;2:2:-1;;;;27:1;24;17:12;2:2;40563:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40563:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40563:46:0;-1:-1:-1;;;;;40563:60:0;;;;40467:164;-1:-1:-1;;;40467:164:0:o;41803:225::-;41888:24;41925:15;41943:20;:18;:20::i;:::-;41925:38;;41981:39;41996:8;42006:4;42012:7;41981:14;:39::i;40639:171::-;40778:7;;40713;;;;40749:53;;-1:-1:-1;;;;;40778:7:0;40787:6;40795;40749:28;:53::i;:::-;40742:60;;;;40639:171;;;;;;:::o;18957:21::-;;;-1:-1:-1;;;;;18957:21:0;;:::o;28783:1078::-;28875:4;;28845;;-1:-1:-1;;;;;28866:13:0;;;28875:4;;28866:13;;:30;;-1:-1:-1;28892:4:0;;-1:-1:-1;;;;;28883:13:0;;;28892:4;;28883:13;28866:30;28862:47;;;-1:-1:-1;28905:4:0;28898:11;;28862:47;28951:6;;28938:79;;;-1:-1:-1;;;28938:79:0;;17264:41;28938:79;;;;;;28920:15;;-1:-1:-1;;;;;28951:6:0;;28938:35;;:79;;;;;;;;;;;;;;28951:6;28938:79;;;2:2:-1;;;;27:1;24;17:12;2:2;28938:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28938:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28938:79:0;29043:4;;29049;;28938:79;;-1:-1:-1;29033:21:0;;-1:-1:-1;;;;;29043:4:0;;;;29049;29033:9;:21::i;:::-;29028:40;;29063:5;29056:12;;;;;29028:40;29094:4;;29084:22;;-1:-1:-1;;;;;29094:4:0;29100:5;29084:9;:22::i;:::-;29079:41;;29115:5;29108:12;;;;;29079:41;29150:6;;29168:4;;29137:43;;;-1:-1:-1;;;29137:43:0;;-1:-1:-1;;;;;29168:4:0;;;29137:43;;;;;;;;;;;;;29150:6;;;;;29137:30;;:43;;;;;;;;;;;;;;29150:6;29137:43;;;2:2:-1;;;;27:1;24;17:12;2:2;29137:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29137:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29137:43:0;:90;;;;-1:-1:-1;29197:6:0;;29215:4;;29184:43;;;-1:-1:-1;;;29184:43:0;;-1:-1:-1;;;;;29215:4:0;;;29184:43;;;;;;;;;;;;;29197:6;;;;;29184:30;;:43;;;;;;;;;;;;;;29197:6;29184:43;;;2:2:-1;;;;27:1;24;17:12;2:2;29184:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29184:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29184:43:0;29137:90;29131:111;;29237:5;29230:12;;;;;29131:111;29268:4;;29258:22;;-1:-1:-1;;;;;29268:4:0;29274:5;29258:9;:22::i;:::-;29253:40;;29289:4;29282:11;;;;;29253:40;29308:12;29304:29;;29329:4;29322:11;;;;;29304:29;29399:7;;29408:4;;29345:19;;29370:50;;-1:-1:-1;;;;;29399:7:0;;;;29408:4;29414:5;29370:28;:50::i;:::-;-1:-1:-1;29486:7:0;;29495:4;;29344:76;;-1:-1:-1;29432:19:0;;29457:50;;-1:-1:-1;;;;;29486:7:0;;;;29495:4;29501:5;29457:28;:50::i;:::-;-1:-1:-1;29594:7:0;;29603:4;;29609;;29431:76;;-1:-1:-1;29519:20:0;;;;29565:49;;-1:-1:-1;;;;;29594:7:0;;;;29603:4;;;;29609;29565:28;:49::i;:::-;29518:96;;;;29625:17;29687:12;29645:39;29658:11;29671:12;29645;:39::i;:::-;:54;;;;;;29625:74;;29710:18;19183:5;29731:59;29744:36;29757:9;29768:11;29744:12;:36::i;:::-;29782:7;29731:12;:59::i;:::-;:81;;;;;;29830:23;;;;;-1:-1:-1;;;;;;;28783:1078:0;;;;:::o;23559:1427::-;23836:19;23870:17;23902;23794:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;23956:7:::1;::::0;-1:-1:-1;;;23956:7:0;::::1;;;23955:8;23947:33;;;::::0;;-1:-1:-1;;;23947:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23947:33:0;;;;;;;;;;;;;::::1;;24066:4;::::0;24018:176:::1;::::0;24046:5;;-1:-1:-1;;;;;24066:4:0::1;24085:18:::0;24118:9:::1;24142:14:::0;24171:12;24018:13:::1;:176::i;:::-;24245:7;::::0;24261:4:::1;::::0;23991:203;;-1:-1:-1;23991:203:0;;-1:-1:-1;24205:12:0::1;::::0;24220:46:::1;::::0;-1:-1:-1;;;;;24245:7:0;;::::1;::::0;24254:5;;24261:4:::1;24220:24;:46::i;:::-;24205:61;;24277:69;24309:5;24316:10;24328:4;24334:11;24277:31;:69::i;:::-;24363:4;;;;;;;;;-1:-1:-1::0;;;;;24363:4:0::1;-1:-1:-1::0;;;;;24357:19:0::1;;24384:9;24357:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24357:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24420:4:0::1;::::0;24414:37:::1;::::0;;-1:-1:-1;;;24414:37:0;;-1:-1:-1;;;;;24414:37:0;;::::1;;::::0;::::1;::::0;;;;;;;;;24420:4;;;::::1;::::0;-1:-1:-1;24414:20:0::1;::::0;-1:-1:-1;24414:37:0;;;;;-1:-1:-1;24414:37:0::1;::::0;;;;;;24420:4:::1;::::0;24414:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24414:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24414:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24414:37:0;24407:45:::1;;;;24500:4;::::0;24489:57:::1;::::0;;-1:-1:-1;;;24489:57:0;;-1:-1:-1;;;;;24489:57:0;;::::1;;::::0;::::1;::::0;24535:10:::1;24489:57:::0;;;;;;24500:4;;;::::1;::::0;24489:39:::1;::::0;:57;;;;;24500:4:::1;::::0;24489:57;;;;;;;24500:4;;24489:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24489:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24569:33:0::1;::::0;;-1:-1:-1;;;24569:33:0;;24591:10:::1;24569:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;24569:21:0;::::1;::::0;-1:-1:-1;24569:21:0::1;::::0;-1:-1:-1;24569:33:0;;;;;::::1;::::0;;;;;;;;-1:-1:-1;24569:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24569:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24569:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24569:33:0;24624:4:::1;::::0;24613:58:::1;::::0;;-1:-1:-1;;;24613:58:0;;-1:-1:-1;;;;;24613:58:0;;::::1;;::::0;::::1;::::0;24660:10:::1;24613:58:::0;;;;;;24569:33;;-1:-1:-1;24624:4:0;::::1;::::0;24613:40:::1;::::0;:58;;;;;24624:4:::1;::::0;24613:58;;;;;;;;24624:4;;24613:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24613:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24718:4:0::1;::::0;24684:50:::1;::::0;-1:-1:-1;24700:10:0::1;::::0;-1:-1:-1;24712:4:0;;-1:-1:-1;;;;;24718:4:0::1;24724:9:::0;24684:15:::1;:50::i;:::-;24745:53;24761:10;24773:4;24779:5;24786:11;24745:15;:53::i;:::-;24846:4;::::0;24814:61:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24846:4:0;;::::1;::::0;24814:61;::::1;::::0;24827:10:::1;::::0;24814:61:::1;::::0;;;;;;;;;::::1;24902:9;24890;:21;24886:92;;;24913:65;24944:10;24968:9;24956;:21;24913:30;:65::i;:::-;19985:1;23559:1427:::0;;;;;;;;;;:::o;38958:1259::-;39149:24;39130:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;39205:4:::1;::::0;-1:-1:-1;;;;;39205:4:0::1;39194::::0;;39205::::1;39194:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;39194:7:0::1;-1:-1:-1::0;;;;;39194:15:0::1;;39186:57;;;::::0;;-1:-1:-1;;;39186:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;39186:57:0;;;;;;;;;;;;;::::1;;39254:15;39272:20;:18;:20::i;:::-;39254:38;;39313:39;39327:9;39338:4;;39313:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39344:7:0;;-1:-1:-1;39313:13:0::1;::::0;-1:-1:-1;;39313:39:0:i:1;:::-;39303:49;;39385:9;39371:7;39379:1;39371:10;;;;;;;;;;;;;;:23;;39363:75;;;;-1:-1:-1::0;;;39363:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39457:4;::::0;39505:10;;-1:-1:-1;;;;;39457:4:0;;::::1;::::0;39451:19:::1;::::0;19183:5:::1;::::0;39492:68:::1;::::0;39505:7;;39457:4:::1;::::0;39505:10:::1;;;;;;;;;;39517:42;19183:5;39551:7;39517:12;:42::i;39492:68::-;:90;;;;;;39451:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39451:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;39646:7:0::1;::::0;39606:12:::1;::::0;-1:-1:-1;39621:51:0::1;::::0;-1:-1:-1;;;;;;39646:7:0::1;::::0;-1:-1:-1;39655:4:0;;39606:12;39655:7;::::1;;;39621:51;39606:66;;39683:153;39716:4;19183:5;39735:68;39748:7;39756:1;39748:10;;;;;;;39683:153;39847:24;39853:7;39862:4;;39847:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39868:2:0;;-1:-1:-1;39847:5:0::1;::::0;-1:-1:-1;;39847:24:0:i:1;:::-;39890:4;::::0;39924:10;;-1:-1:-1;;;;;39890:4:0;;::::1;::::0;39884:19:::1;::::0;19183:5:::1;::::0;39911:33:::1;::::0;39924:7;;39890:4:::1;::::0;39924:10:::1;;;39911:33;:55;;;;;;39884:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39884:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39884:85:0;;;;;39980:81;39999:4;19183:5;40005:33;40018:7;40026:1;40018:10;;;;;;;39980:81;40072:32;40081:7;40090:4;;40072:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;40096:7:0;;-1:-1:-1;40072:8:0::1;::::0;-1:-1:-1;;40072:32:0:i:1;:::-;40131:7;40139:1;40131:10;;;;;;;;;;;;;;40119:9;:22;40115:94;;;40143:66;40174:10;40198:7;40206:1;40198:10;;;;;;;;;;;;;;40186:9;:22;40143:30;:66::i;19197:19::-:0;;;-1:-1:-1;;;19197:19:0;;;;;:::o;10284:361::-;10479:45;;;-1:-1:-1;;;;;10479:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10479:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10468:57:0;;;;10433:12;;10447:17;;10468:10;;;;10479:45;10468:57;;;25:18:-1;10468:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10468:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10432:93:0;;;;10544:7;:57;;;;-1:-1:-1;10556:11:0;;:16;;:44;;;10587:4;10576:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10576:24:0;10556:44;10536:101;;;;;-1:-1:-1;;;10536:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10284:361;;;;;:::o;11063:195::-;11171:12;;;11133;11171;;;;;;;;;-1:-1:-1;;;;;11150:7:0;;;11164:5;;11150:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11150:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;11132:52:0;;;11203:7;11195:55;;;;-1:-1:-1;;;11195:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11063:195;;;:::o;40225:234::-;40393:17;;40370:81;;;-1:-1:-1;;;40370:81:0;;-1:-1:-1;;;;;40370:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40393:17;;;;;40370:56;;:81;;;;;;;;;;;;;;40393:17;;40370:81;;;2:2:-1;;;;27:1;24;17:12;2:2;40370:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40370:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40225:234:0:o;32915:153::-;33008:6;;32995:65;;;-1:-1:-1;;;32995:65:0;;-1:-1:-1;;;32995:65:0;;;;;;32968:7;;-1:-1:-1;;;;;33008:6:0;;32995:35;;:65;;;;;;;;;;;;;;33008:6;32995:65;;;2:2:-1;;;;27:1;24;17:12;2:2;32995:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32995:65:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32995:65:0;;-1:-1:-1;32915:153:0;:::o;12690:136::-;12748:7;12775:43;12779:1;12782;12775:43;;;;;;;;;;;;;;;;;:3;:43::i;13580:471::-;13638:7;13883:6;13879:47;;-1:-1:-1;13913:1:0;13906:8;;13879:47;13950:5;;;13954:1;13950;:5;:1;13974:5;;;;;:10;13966:56;;;;-1:-1:-1;;;13966:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8721:442;8814:14;8860:1;8849:8;:12;8841:68;;;;-1:-1:-1;;;8841:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8940:1;8928:9;:13;:31;;;;;8958:1;8945:10;:14;8928:31;8920:84;;;;-1:-1:-1;;;8920:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9015:14;9032:24;:8;9045:10;9032:24;:12;:24;:::i;:::-;9015:41;-1:-1:-1;9067:16:0;9086:23;:9;9100:8;9086:23;:13;:23;:::i;:::-;9067:42;;9144:11;9132:9;:23;;;;27159:739;27296:27;27363:4;:11;27349:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27349:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;27349:26:0;;27336:39;;27402:6;27386:10;27397:1;27386:13;;;;;;;;;;;;;;;;;:22;27424:9;27419:472;27457:1;27443:4;:11;:15;27439:1;:19;27419:472;;;27480:14;27497:4;27502:1;27497:7;;;;;;;;;;;;;;27480:24;;27519:15;27537:4;27542:1;27546;27542:5;27537:11;;;;;;;;;;;;;;27519:29;;27564:16;27582;27602:54;27631:7;;;;;;;;;-1:-1:-1;;;;;27631:7:0;27640:6;27648:7;27602:28;:54::i;:::-;27563:93;;;;27671:17;27691:71;27704:10;27715:1;27704:13;;;;;;;;;;;;;;27719:42;19183:5;27753:7;27719:12;:42::i;27691:71::-;27671:91;-1:-1:-1;27797:82:0;19183:5;27671:91;27827:31;27860:8;27870;27797:29;:82::i;:::-;27777:10;27788:1;27792;27788:5;27777:17;;;;;;;;;;;;;;;;;:102;-1:-1:-1;;27460:3:0;;;;;-1:-1:-1;27419:472:0;;-1:-1:-1;;27419:472:0;;;27159:739;;;;;:::o;7196:520::-;7285:12;7311:14;7327;7345:26;7356:6;7364;7345:10;:26::i;:::-;7310:61;;;;7382:12;7424:6;7432;7407:32;;;;;;-1:-1:-1;;;;;7407:32:0;-1:-1:-1;;;;;7407:32:0;;;;;;;;-1:-1:-1;;;;;7407:32:0;-1:-1:-1;;;;;7407:32:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7407:32:0;;;7397:43;;;;;;7382:58;;7451:18;7531:4;7524:12;;7551:7;7573:4;7606:7;-1:-1:-1;;;;;7592:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7592:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7592:41:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7592:41:0;7493:155;;;-1:-1:-1;;;;;;7493:155:0;;;;7592:41;7493:155;;;;;;;;;;;;-1:-1:-1;;7493:155:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7493:155:0;;;;;;7472:187;;;;;-1:-1:-1;;;;;7674:34:0;;7196:520;-1:-1:-1;;;;;;;;7196:520:0:o;34032:263::-;34180:56;34212:5;34219:4;34225:2;34229:6;34180:31;:56::i;:::-;34247:40;34263:4;34269:2;34273:5;34280:6;34247:15;:40::i;:::-;34032:263;;;;:::o;29869:1548::-;30009:7;;-1:-1:-1;;;30009:7:0;;;;30008:8;30000:33;;;;;-1:-1:-1;;;30000:33:0;;;;;;;;;;;;-1:-1:-1;;;30000:33:0;;;;;;;;;;;;;;;30052:39;30069:4;30088:1;30074:4;:11;:15;30069:21;;;;;;;;;;;;;;30052:16;:39::i;:::-;30044:99;;;;-1:-1:-1;;;30044:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30159:9;30154:1156;30188:1;30174:4;:11;:15;30170:1;:19;30154:1156;;;30212:13;30227:14;30246:4;30251:1;30246:7;;;;;;;;;;;;;;30255:4;30260:1;30264;30260:5;30255:11;;;;;;;;;;;;;;30211:56;;;;30290:23;30307:5;30290:16;:23::i;:::-;30282:85;;;;-1:-1:-1;;;30282:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30403:6;;30390:45;;;-1:-1:-1;;;30390:45:0;;-1:-1:-1;;;;;30390:45:0;;;;;;;;;;;;;;;;30403:6;;;;;30390:30;;:45;;;;;;;;;;;;;;30403:6;30390:45;;;2:2:-1;;;;27:1;24;17:12;2:2;30390:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30390:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30390:45:0;30382:102;;;;-1:-1:-1;;;30382:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30500:14;30516;30534:42;30562:5;30569:6;30534:27;:42::i;:::-;30499:77;;;;30591:17;30611:7;30619:1;30623;30619:5;30611:14;;;;;;;;;;;;;;30591:34;;30641:18;30661;30692:6;-1:-1:-1;;;;;30683:15:0;:5;-1:-1:-1;;;;;30683:15:0;;:101;;30762:9;30781:1;30683:101;;;30727:1;30731:9;30683:101;30640:144;;;;30799:10;30830:1;30816:4;:11;:15;30812:1;:19;:82;;30891:3;30812:82;;;30859:7;;30876:11;;30834:54;;-1:-1:-1;;;;;30859:7:0;;30868:6;;30876:4;;30885:1;30881:5;;;30876:11;;;;;;;;;;;;30834:24;:54::i;:::-;30945:7;;30799:95;;-1:-1:-1;30920:48:0;;-1:-1:-1;;;;;30945:7:0;30954:5;30961:6;30920:24;:48::i;:::-;-1:-1:-1;;;;;30909:65:0;;30975:10;30987;30999:2;31013:1;31003:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;31003:12:0;87:42:-1;143:17;;-1:-1;31003:12:0;;30909:107;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30909:107:0;-1:-1:-1;;;;;30909:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30909:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30909:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30909:107:0;;;;31048:1;31035:10;:14;31031:126;;;31109:7;;31068:89;;31084:48;;-1:-1:-1;;;;;31109:7:0;31118:5;31125:6;31084:24;:48::i;:::-;31134:2;31138:6;31146:10;31068:15;:89::i;:::-;31176:14;;31172:126;;31250:7;;31209:89;;31225:48;;-1:-1:-1;;;;;31250:7:0;31259:5;31266:6;31225:24;:48::i;:::-;31275:2;31279:6;31287:10;31209:15;:89::i;:::-;-1:-1:-1;;30191:3:0;;;;;-1:-1:-1;30154:1156:0;;-1:-1:-1;;;;;30154:1156:0;;;31349:4;31368:1;31354:4;:11;:15;31349:21;;;;;;;;;;;;;;-1:-1:-1;;;;;31325:84:0;31340:4;31345:1;31340:7;;;;;;;;;;;;;;-1:-1:-1;;;;;31325:84:0;31335:3;-1:-1:-1;;;;;31325:84:0;;31372:7;31380:1;31372:10;;;;;;;;;;;;;;31384:7;31406:1;31392:4;:11;:15;31384:24;;;;;;;;;;;;;;31325:84;;;;;;;;;;;;;;;;;;;;;;;;29869:1548;;;:::o;31425:1482::-;31590:16;;;31604:1;31590:16;;;31563:24;31590:16;;;;;31563:24;31590:16;;;;;109:14:-1;31590:16:0;88:42:-1;-1:-1;;31630:4:0;;31617:10;;;;-1:-1:-1;;;;;;31630:4:0;;31617:10;;-1:-1:-1;31630:4:0;;31617:10;;;;;;-1:-1:-1;;;;;31617:17:0;;;:10;;;;;;;;;;;:17;31650:9;31645:1255;31683:1;31669:4;:11;:15;31665:1;:19;31645:1255;;;31706:11;19183:5;31720:33;31733:7;31741:1;31733:10;;;;;;;31720:33;:55;;;;;;31706:69;;31790:13;31806:4;31811:1;31806:7;;;;;;;;;;;;;;31790:23;;31828:14;31845:4;31850:1;31854;31850:5;31845:11;;;;;;;;;;;;;;31828:28;;31871:19;31893:48;31918:7;;;;;;;;;-1:-1:-1;;;;;31918:7:0;31927:5;31934:6;31893:24;:48::i;:::-;31969:4;;31871:70;;-1:-1:-1;;;;;;31960:13:0;;;31969:4;;31960:13;31956:849;;;32031:4;;32037;;31994:48;;;-1:-1:-1;;;31994:48:0;;;;;;;;-1:-1:-1;;;;;32031:4:0;;;31994:48;;;;32037:4;;;31994:48;;;;;:31;;;;;;:48;;;;;32031:4;;31994:48;;;;;;;;32031:4;31994:31;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;31994:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32090:4:0;;32096;;32061:45;;-1:-1:-1;32077:11:0;;-1:-1:-1;;;;;;32090:4:0;;;;32096;32102:3;32061:15;:45::i;:::-;31956:849;;;32216:7;;32232:4;;-1:-1:-1;;;;;32147:31:0;;;;;;32179:3;;32184:5;;32191:46;;32216:7;;;;32184:5;;32232:4;32191:24;:46::i;:::-;32147:91;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32147:91:0;-1:-1:-1;;;;;32147:91:0;;;;;;-1:-1:-1;;;;;32147:91:0;-1:-1:-1;;;;;32147:91:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32147:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32329:7:0;;32345:4;;32258:17;;-1:-1:-1;32258:17:0;;-1:-1:-1;32300:50:0;;-1:-1:-1;;;;;32329:7:0;;;;32338:5;;32345:4;32300:28;:50::i;:::-;32257:93;;;;32369:14;32386:58;32416:3;32421:9;32432:11;32386:29;:58::i;:::-;32499:7;;32515:4;;32369:75;;-1:-1:-1;32474:46:0;;-1:-1:-1;;;;;32499:7:0;;;;32508:5;;32515:4;32474:24;:46::i;:::-;32538:4;;32544;;32463:86;;;-1:-1:-1;;;32463:86:0;;;;;;;;-1:-1:-1;;;;;32538:4:0;;;32463:86;;;;32544:4;;;32463:86;;;;;:66;;;;;;;:86;;;;;32538:4;;32463:86;;;;;;;;32538:4;32463:66;:86;;;2:2:-1;;;;27:1;24;17:12;2:2;32463:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32622:7:0;;32638:4;;32568:88;;-1:-1:-1;32584:11:0;;-1:-1:-1;32597:46:0;;-1:-1:-1;;;;;32622:7:0;;;;32631:5;;32638:4;32597:24;:46::i;:::-;32645:5;32652:3;32568:15;:88::i;:::-;32716:7;;32732:4;;32675:83;;32691:46;;-1:-1:-1;;;;;32716:7:0;;;;32725:5;;32732:4;32691:24;:46::i;:::-;32739:4;;32745;;-1:-1:-1;;;;;32739:4:0;;;;32745;32751:6;32675:15;:83::i;:::-;32783:6;-1:-1:-1;;;31956:849:0;32823:7;;32819:69;;32843:4;;32832:56;;;-1:-1:-1;;;32832:56:0;;-1:-1:-1;;;;;32832:56:0;;;;;;;;;;;;;;;32843:4;;;;;32832:38;;:56;;;;;32843:4;;32832:56;;;;;;;32843:4;;32832:56;;;2:2:-1;;;;27:1;24;17:12;2:2;32832:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32832:56:0;;;;32819:69;-1:-1:-1;;31686:3:0;;;;;-1:-1:-1;31645:1255:0;;-1:-1:-1;31645:1255:0;27906:869;28042:25;28105:4;:11;28091:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28091:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;28091:26:0;;28080:37;;28156:6;28128:8;28151:1;28137:4;:11;:15;28128:25;;;;;;;;;;;;;;;;;:34;28190:11;;-1:-1:-1;;28190:15:0;28173:531;28207:5;;28173:531;;28234:14;28251:4;28260:1;28256;:5;28251:11;;;;;;;;;;;;;;28234:28;;28277:15;28295:4;28300:1;28295:7;;;;;;;;;;;;;;28277:25;;28318:16;28336;28356:54;28385:7;;;;;;;;;-1:-1:-1;;;;;28385:7:0;28394:6;28402:7;28356:28;:54::i;:::-;28317:93;;;;28425:16;28444:61;28473:8;28482:1;28473:11;;;;;;;;;;;;;;28486:8;28496;28444:28;:61::i;:::-;28425:80;;28538:154;28615:42;19183:5;28649:7;28615:12;:42::i;:::-;28569:43;28582:8;19183:5;28569:12;:43::i;:::-;:88;;;;;;28676:1;28538:12;:154::i;:::-;28520:8;28533:1;28529;:5;28520:15;;;;;;;;;;;;;;;;;:172;-1:-1:-1;;;;28214:3:0;;;;-1:-1:-1;28173:531:0;;-1:-1:-1;;28173:531:0;;;28725:42;28740:8;28749:1;28740:11;;;;;;;;;;;;;;28753:4;28759:7;28725:14;:42::i;:::-;28714:53;27906:869;-1:-1:-1;;;;27906:869:0:o;20621:1723::-;20906:7;;;20892:46;;;-1:-1:-1;;;20892:46:0;;-1:-1:-1;;;;;20892:46:0;;;;;;;;;;;;;;;;;;;20843:15;;;;;;20906:7;;;20892:30;;:46;;;;;;;;;;;;;;;20906:7;20892:46;;;2:2:-1;;;;27:1;24;17:12;2:2;20892:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20892:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20892:46:0;-1:-1:-1;;;;;20892:60:0;;20888:246;;;20982:6;;20969:37;;;-1:-1:-1;;;20969:37:0;;-1:-1:-1;;;;;20969:37:0;;;;;;;;;20982:6;;;;;20969:29;;:37;;;;;;;;;;;;;;20982:6;;20969:37;;;2:2:-1;;;;27:1;24;17:12;2:2;20969:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20969:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21034:6:0;;21021:37;;;-1:-1:-1;;;21021:37:0;;-1:-1:-1;;;;;21021:37:0;;;;;;;;;21034:6;;;;;21021:29;;:37;;;;;20969;;21021;;;;;;;21034:6;;21021:37;;;2:2:-1;;;;27:1;24;17:12;2:2;21021:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21021:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21087:7:0;;;21073:49;;;-1:-1:-1;;;21073:49:0;;-1:-1:-1;;;;;21073:49:0;;;;;;;;;;;;;;;;;;;21087:7;;;;;21073:33;;:49;;;;;21021:37;;21073:49;;;;;;;;21087:7;;21073:49;;;2:2:-1;;;;27:1;24;17:12;2:2;21073:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21073:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20888:246:0;21179:6;;21166:46;;;-1:-1:-1;;;21166:46:0;;-1:-1:-1;;;;;21166:46:0;;;;;;;;;;;;;;;;21179:6;;;;;21166:30;;:46;;;;;;;;;;;;;;21179:6;21166:46;;;2:2:-1;;;;27:1;24;17:12;2:2;21166:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21166:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21166:46:0;21144:149;;;;-1:-1:-1;;;21144:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21372:7;;21305:16;;;;21343:53;;-1:-1:-1;;;;;21372:7:0;21381:6;21389;21343:28;:53::i;:::-;21304:92;;;;21411:8;21423:1;21411:13;:30;;;;-1:-1:-1;21428:13:0;;21411:30;21407:823;;;21480:14;;-1:-1:-1;21496:14:0;;-1:-1:-1;21407:823:0;;;21544:22;21569:58;21592:14;21608:8;21618;21569:22;:58::i;:::-;21544:83;;21664:14;21646;:32;21642:577;;21725:10;21707:14;:28;;21699:79;;;;-1:-1:-1;;;21699:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21819:14;;-1:-1:-1;21835:14:0;-1:-1:-1;21835:14:0;21642:577;;;21891:22;21916:58;21939:14;21955:8;21965;21916:22;:58::i;:::-;21891:83;;22018:14;22000;:32;;21993:40;;;;22078:10;22060:14;:28;;22052:79;;;;-1:-1:-1;;;22052:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22172:14;-1:-1:-1;22188:14:0;;-1:-1:-1;21642:577:0;21407:823;;22254:7;;;22289:46;;;-1:-1:-1;;;22289:46:0;;-1:-1:-1;;;;;22289:46:0;;;;;;;;;;;;;;;;;;;22254:7;;;;;22240:36;;22277:10;;22254:7;;22289:30;;:46;;;;;;;;;;;;;;22254:7;22289:46;;;2:2:-1;;;;27:1;24;17:12;2:2;22289:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22289:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22289:46:0;22240:96;;;-1:-1:-1;;;;;;22240:96:0;;;;;;;-1:-1:-1;;;;;22240:96:0;;;;;;;;;;;;;;;;;;;;;22289:46;;22240:96;;;;;;;-1:-1:-1;22240:96:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;22240:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22240:96:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20621:1723:0;;;;-1:-1:-1;20621:1723:0;;-1:-1:-1;;;;;;;;20621:1723:0:o;10653:402::-;10878:51;;;-1:-1:-1;;;;;10878:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10878:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10867:63:0;;;;10832:12;;10846:17;;10867:10;;;;10878:51;10867:63;;;25:18:-1;10867:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10867:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;10831:99:0;;;;10949:7;:57;;;;-1:-1:-1;10961:11:0;;:16;;:44;;;10992:4;10981:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10981:24:0;10961:44;10941:106;;;;-1:-1:-1;;;10941:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34303:183;34392:4;;34386:32;;;-1:-1:-1;;;34386:32:0;;-1:-1:-1;;;;;34386:32:0;;;;;;;;;;;;;;;34392:4;;;;;34386:20;;:32;;;;;;;;;;;;;;34392:4;;34386:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34386:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34386:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34386:32:0;34379:40;;;;34465:4;;34430:48;;34454:4;;34461:2;;-1:-1:-1;;;;;34465:4:0;34471:6;34430:15;:48::i;:::-;34303:183;;:::o;9175:453::-;9268:13;9314:1;9302:9;:13;9294:70;;;;-1:-1:-1;;;9294:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9395:1;9383:9;:13;:31;;;;;9413:1;9400:10;:14;9383:31;9375:84;;;;-1:-1:-1;;;9375:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9470:14;9487:24;:9;9501;9487:24;:13;:24;:::i;:::-;9470:41;-1:-1:-1;9522:16:0;9541:25;:10;9556:9;9541:25;:14;:25;:::i;:::-;9522:44;;9588:32;9618:1;9601:11;9589:9;:23;;;;;;;9588:32;:29;:32;:::i;6838:349::-;6913:14;6929;6974:6;-1:-1:-1;;;;;6964:16:0;:6;-1:-1:-1;;;;;6964:16:0;;;6956:66;;;;-1:-1:-1;;;6956:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7061:6;-1:-1:-1;;;;;7052:15:0;:6;-1:-1:-1;;;;;7052:15:0;;:53;;7090:6;7098;7052:53;;;7071:6;7079;7052:53;7033:72;;-1:-1:-1;7033:72:0;-1:-1:-1;;;;;;7124:20:0;;7116:63;;;;;-1:-1:-1;;;7116:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7724:387;7817:13;7832;7859:14;7878:26;7889:6;7897;7878:10;:26::i;:::-;7858:46;;;7916:13;7931;7960:32;7968:7;7977:6;7985;7960:7;:32::i;:::-;-1:-1:-1;;;;;7949:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7949:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7949:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7949:58:0;;;;;;;7915:92;;;;;-1:-1:-1;7915:92:0;;-1:-1:-1;;;;;;8041:16:0;;;;;;;:62;;8084:8;8094;8041:62;;;8061:8;8071;8041:62;8018:85;;;;-1:-1:-1;7724:387:0;-1:-1:-1;;;;;;;7724:387:0:o;12226:181::-;12284:7;12316:5;;;12340:6;;;;12332:46;;;;;-1:-1:-1;;;12332:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13129:192;13215:7;13251:12;13243:6;;;;13235:29;;;;-1:-1:-1;;;13235:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13235:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13287:5:0;;;13129:192::o;8392:321::-;8474:12;8517:1;8507:7;:11;8499:61;;;;-1:-1:-1;;;8499:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8590:1;8579:8;:12;:28;;;;;8606:1;8595:8;:12;8579:28;8571:81;;;;-1:-1:-1;;;8571:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8697:8;8673:21;:7;8685:8;8673:21;:11;:21;:::i;:::-;:32;;;;;;;8392:321;-1:-1:-1;;;;8392:321:0:o

Swarm Source

ipfs://53277956602222a84aa1b322bb86cea17c655dbb8fe9ab046dabc5c6bedc9c36
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.