Contract 0x68FaC8a95d04b69bdbF66CA554F47A8193D0E5b6 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7bc08cd67f0f9dd2add72788f808629c2a29c0ed83d4678bb32c6e7b32e4b9ceSplit Trades121399942021-10-27 16:34:491 min ago0xf060b5ee9a71bba2b6bc4c682976f050509d3832 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00355504
0x9f6f4299b1550514ad23362d82766e2a03445cd881b9f3996f8d4b3e1f647c3bTrade Strategies121399762021-10-27 16:33:552 mins ago0x99f60d88492bbe5bf0d0f6ea9dc07f6b7cd5aff3 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b623 BNB0.00139793
0x246e4e2a032277470b67d1c2052ccd7238731d5edcfd61801b6e2a6b48393ff3Split Trades121399532021-10-27 16:32:463 mins ago0x2b33bea74c0bd29d06f99798ce761da13713353e IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.004373665
0xc866f1463c6b6c9e6b79ad51daccace1e011c277dae4d1badab2d57ef628ec24Trade Strategies121399532021-10-27 16:32:463 mins ago0xdf34cbf2f4ad330fb227c5af039803775b345c4b IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.002455585
0x4d95dcb8c302205c3ac82457111ea8ab2e08bb826c26ccb055c755f04a0eb47bSplit Trades121399302021-10-27 16:31:375 mins ago0xecce532c92969a4363ee3cf70f95a94da348c989 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00547758
0xe6185021924c6596d383b963c00b4b5392c1355bae136b89871bd8faa43bf1adTrade Strategies121398812021-10-27 16:29:107 mins ago0x1162d6089551dca5bf1100e571b3d9c199b27ff3 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.55 BNB0.002779935
0x388002e84d472bfe269d9c1dd15ae26dbe68cbadba0c5ad9a36cc36e9da02b7dTrade Strategies121398502021-10-27 16:27:379 mins ago0x4f39feb5f40e8e4890c24ed0e1ce9c2dcb77e4e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.002515185
0x06f0e8fba0f39bb9c564cb4107b3a31ac14eece82bcf6921559c9507a26465deTrade Strategies121398472021-10-27 16:27:289 mins ago0x9fc65a99faaa09707861e3b12b0deb04790af404 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00236578
0x0e47f3c1f5f53f2252f7e5e6229cf442e571bad0bb10155672a01f426e676b8eTrade Strategies121397522021-10-27 16:22:4314 mins ago0x93841af6c91b1ea98916b90c256b3420bf61d996 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.54100425401613 BNB0.00113367
0xa66d974b09d2a98b577161e11d68e2b3fde9be52e620d06aa1298ad2595f7d8dTrade Strategies121397032021-10-27 16:20:1616 mins ago0xc2855837c1193bdc3378c7d78dda949d373bd14c IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.002826105
0x4dada681270576542debfbaeffd7bc897bdd26be81a64f5cea58ec2cbfbbf555Split Trades121396772021-10-27 16:18:5817 mins ago0xd1ee79d27d5426d815ef42424328a062eb4056e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b61.25 BNB0.00274593
0x86a10b13375a9def0bf84e64de5d0d556643e97969dc54e5ac44ec6e1927a6baTrade Strategies121396732021-10-27 16:18:4617 mins ago0x39f7200a7d644acce2ea78fcb8560cc8b1188217 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00321967
0x1d9ed6901f27b95efc8909f1075ce41a398b283edcdd5e849f0fa5bea9e35bdcSplit Trades121396682021-10-27 16:18:3118 mins ago0xd1ee79d27d5426d815ef42424328a062eb4056e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.0025083
0xe0eb3047e80db3d15ceeef89d87a18dea278f12dcc440189e425123db79464ccTrade Strategies121396642021-10-27 16:18:1918 mins ago0x39f7200a7d644acce2ea78fcb8560cc8b1188217 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00246655
0xe0340e7dbdf2774ba3804dbb05b8e11731611ed8cd52f1350cee9d89738a3decTrade Strategies121396622021-10-27 16:18:1318 mins ago0xd1ee79d27d5426d815ef42424328a062eb4056e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00216852
0x6768089c5148be88135bb9302b8ef9100d2a23fc35ed004171785d13b7d3b08bTrade Strategies121396562021-10-27 16:17:5518 mins ago0xd1ee79d27d5426d815ef42424328a062eb4056e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00239784
0xd568de3bec45f153a7aefd24b5836ec64e57eea5c61aab085a61e3d55383a6caSplit Trades121396522021-10-27 16:17:4319 mins ago0xd1ee79d27d5426d815ef42424328a062eb4056e2 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.004664955
0xbc44668fbaf9256242add874c5c765651ebc0b5b8daef87840e98a5849535ed1Split Trades121396372021-10-27 16:16:5819 mins ago0x39f7200a7d644acce2ea78fcb8560cc8b1188217 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00365256
0xe7ba88056c2932ffe3e48fe1818d7348d57480af02da29a0234f76fd9fbbec88Trade Strategies121395692021-10-27 16:13:3423 mins ago0xa8e0a88c5878dffd3c8e880828dc7e895f15a4d4 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.2 BNB0.002183215
0xe8892dad62d512478166dfea785495f8dfde25fb7180aad479f0ad9dede6d4c8Trade Strategies121395232021-10-27 16:11:1625 mins ago0xb7861db927d8f6fd6dc832482e47ca854ffbcd23 IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00293166
0x1e21ef9926b7ce712deb2459d570b02aa199286d7205537a79df399ff09323deTrade Strategies121394962021-10-27 16:09:5526 mins ago0x5ccbe75e7ff8c93978beff708f9dc087388cbeea IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.001629805
0xeb0f0d8971e5159724146a0bdd3fbab608e695672eea4e8262fa7ea4c97adb6eTrade Strategies121394712021-10-27 16:08:4028 mins ago0xa5cec1c90147190c16351ec395df3af01554d04b IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00242119
0xe3277c0e55b0271e196eef9ba1013673458c171c2ac911d5c95121982f957516Trade Weth To Et...121394622021-10-27 16:08:1328 mins ago0xfd8954dd670f438264ae8a46cc95726b1349953b IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.000242395
0x5eb70f7ef6140ff63d321be7c72c719c80598499ab98c8f45802c057d986fcb7Trade Strategies121394472021-10-27 16:07:2829 mins ago0x6b86aba423a730c16ae8b1c3aed2dc7f68efea1e IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.003444725
0x101b61aa7d43d093444713ad906283dbd58b3f86ca05d3cb83d0f46b1823daa9Trade Strategies121394332021-10-27 16:06:4629 mins ago0x2b33bea74c0bd29d06f99798ce761da13713353e IN  0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60 BNB0.00261897
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7bc08cd67f0f9dd2add72788f808629c2a29c0ed83d4678bb32c6e7b32e4b9ce121399942021-10-27 16:34:491 min ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xf060b5ee9a71bba2b6bc4c682976f050509d38325.580099656690276068 BNB
0x7bc08cd67f0f9dd2add72788f808629c2a29c0ed83d4678bb32c6e7b32e4b9ce121399942021-10-27 16:34:491 min ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.005585685342032308 BNB
0x7bc08cd67f0f9dd2add72788f808629c2a29c0ed83d4678bb32c6e7b32e4b9ce121399942021-10-27 16:34:491 min ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b65.585685342032308376 BNB
0x9f6f4299b1550514ad23362d82766e2a03445cd881b9f3996f8d4b3e1f647c3b121399762021-10-27 16:33:552 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token23 BNB
0xc866f1463c6b6c9e6b79ad51daccace1e011c277dae4d1badab2d57ef628ec24121399532021-10-27 16:32:463 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xdf34cbf2f4ad330fb227c5af039803775b345c4b0.044197052391697358 BNB
0xc866f1463c6b6c9e6b79ad51daccace1e011c277dae4d1badab2d57ef628ec24121399532021-10-27 16:32:463 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.000044241293685382 BNB
0xc866f1463c6b6c9e6b79ad51daccace1e011c277dae4d1badab2d57ef628ec24121399532021-10-27 16:32:463 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.04424129368538274 BNB
0x4d95dcb8c302205c3ac82457111ea8ab2e08bb826c26ccb055c755f04a0eb47b121399302021-10-27 16:31:375 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xecce532c92969a4363ee3cf70f95a94da348c9891.696643948242867797 BNB
0x4d95dcb8c302205c3ac82457111ea8ab2e08bb826c26ccb055c755f04a0eb47b121399302021-10-27 16:31:375 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.00144337422409692 BNB
0x4d95dcb8c302205c3ac82457111ea8ab2e08bb826c26ccb055c755f04a0eb47b121399302021-10-27 16:31:375 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b61.698087322466964717 BNB
0xe6185021924c6596d383b963c00b4b5392c1355bae136b89871bd8faa43bf1ad121398812021-10-27 16:29:107 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token0.55 BNB
0x0e47f3c1f5f53f2252f7e5e6229cf442e571bad0bb10155672a01f426e676b8e121397522021-10-27 16:22:4314 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token0.541004254016130986 BNB
0x4dada681270576542debfbaeffd7bc897bdd26be81a64f5cea58ec2cbfbbf555121396772021-10-27 16:18:5817 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token1.25 BNB
0xe7ba88056c2932ffe3e48fe1818d7348d57480af02da29a0234f76fd9fbbec88121395692021-10-27 16:13:3423 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token0.2 BNB
0xeb0f0d8971e5159724146a0bdd3fbab608e695672eea4e8262fa7ea4c97adb6e121394712021-10-27 16:08:4028 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xa5cec1c90147190c16351ec395df3af01554d04b0.043606568772172427 BNB
0xeb0f0d8971e5159724146a0bdd3fbab608e695672eea4e8262fa7ea4c97adb6e121394712021-10-27 16:08:4028 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.000043650218991163 BNB
0xeb0f0d8971e5159724146a0bdd3fbab608e695672eea4e8262fa7ea4c97adb6e121394712021-10-27 16:08:4028 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.04365021899116359 BNB
0xe3277c0e55b0271e196eef9ba1013673458c171c2ac911d5c95121982f957516121394622021-10-27 16:08:1328 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xfd8954dd670f438264ae8a46cc95726b1349953b0.004268816593655236 BNB
0xe3277c0e55b0271e196eef9ba1013673458c171c2ac911d5c95121982f957516121394622021-10-27 16:08:1328 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.004268816593655236 BNB
0x8359401b3fb7a87e5c91c931d6c67729c477c3ba2efdc32a4a7a072f143e831c121394182021-10-27 16:06:0130 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b6 Binance: WBNB Token0.165834025 BNB
0x46748d91c92d6e7ad8f882b75171a43675ebec4154a708d3da3bf0406603222a121393502021-10-27 16:02:3734 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60x04fe9096961894121b93c89d1ecd33e583e7dec91.17002496137096993 BNB
0x46748d91c92d6e7ad8f882b75171a43675ebec4154a708d3da3bf0406603222a121393502021-10-27 16:02:3734 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.001053971039169125 BNB
0x46748d91c92d6e7ad8f882b75171a43675ebec4154a708d3da3bf0406603222a121393502021-10-27 16:02:3734 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b61.171078932410139055 BNB
0x039c58df745224bb813e087d59c713196dc0d47aeda413d99f06f703f515604a121393092021-10-27 16:00:3436 mins ago 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60xc146a672c85b408a9a7bc00f74ad567b7684134c0.000951177612061499 BNB
0x039c58df745224bb813e087d59c713196dc0d47aeda413d99f06f703f515604a121393092021-10-27 16:00:3436 mins ago Binance: WBNB Token 0x68fac8a95d04b69bdbf66ca554f47a8193d0e5b60.951177612061499719 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WardenSwap1_5_Aegis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-08-25
*/

// SPDX-License-Identifier: MIT

// ((/*,                                                                    ,*((/,.
// &&@@&&%#/*.                                                        .*(#&&@@@@%. 
// &&@@@@@@@&%(.                                                    ,#%&@@@@@@@@%. 
// &&@@@@@@@@@&&(,                                                ,#&@@@@@@@@@@@%. 
// &&@@@@@@@@@@@&&/.                                            .(&&@@@@@@@@@@@@%. 
// %&@@@@@@@@@@@@@&(,                                          *#&@@@@@@@@@@@@@@%. 
// #&@@@@@@@@@@@@@@&#*                                       .*#@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@#.                                      ,%&@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@%(,                                    ,(&@@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@&&/                                   .(%&@@@@@@@@@@@@@@@@&#. 
// #%@@@@@@@@@@@@@@@@@@(.               ,(/,.              .#&@@@@@@@@@@@@@@@@@&#. 
// (%@@@@@@@@@@@@@@@@@@#*.            ./%&&&/.            .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#*.           *#&@@@@&%*.          .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.         ./#@@@@@@@@%(.         ./%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.        ./&@@@@@@@@@@&(*        ,/%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@%/.       ,#&@@@@@@@@@@@@&#,.      ,/%@@@@@@@@@@@@@@@@@@%(. 
// /%@@@@@@@@@@@@@@@@@@#/.      *(&@@@@@@@@@@@@@@&&*      ./%@@@@@@@@@@@@@@@@@&%(. 
// /%@@@@@@@@@@@@@@@@@@#/.     .(&@@@@@@@@@@@@@@@@@#*.    ,/%@@@@@@@@@@@@@@@@@&#/. 
// ,#@@@@@@@@@@@@@@@@@@#/.    ./%@@@@@@@@@@@@@@@@@@&#,    ,/%@@@@@@@@@@@@@@@@@&(,  
//  /%&@@@@@@@@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@&*    ,/%@@@@@@@@@@@@@@@@&%*   
//  .*#&@@@@@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/.   ,/%@@@@@@@@@@@@@@@@#*.   
//    ,(&@@@@@@@@@@@@@@#/.    /@@@@@@@@@@@@@@@@@@@@@&(,   ,/%@@@@@@@@@@@@@@%(,     
//     .*(&&@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/,   ,/%@@@@@@@@@@@&%/,       
//        ./%&@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@%*    ,/%@@@@@@@@@&%*          
//           ,/#%&&@@@@#/.     ,#&@@@@@@@@@@@@@@@@@#/.    ,/%@@@@&&%(/,            
//               ./#&@@%/.      ,/&@@@@@@@@@@@@@@%(,      ,/%@@%#*.                
//                   .,,,         ,/%&@@@@@@@@&%(*        .,,,.                    
//                                   ,/%&@@@%(*.                                   
//  .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**((/*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
//                                                                                                                                                                                                                                                                                                            
//                                                                                             

pragma solidity ^0.8.0;

// File: wx/interface/IWardenPostTrade.sol


interface IWardenPostTrade {
    function postTradeAndFee(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        address     _trader,
        address     _receiver,
        bool        _isSplit
    )
        external
        returns (
            uint256 _fee,
            address _collector
        );
}

// File: wx/libraries/IWETH.sol



pragma solidity ^0.8.0;


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

// File: wx/interface/IWardenCosmicBrain0_8.sol

pragma solidity ^0.8.0;


interface IWardenCosmicBrain {
    function train(
        uint256[]   calldata _subRoutes,
        IERC20[]    calldata _correspondentTokens
    )
        external
        returns (uint256 _learnedId);
    
    function trainTradingPair(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        uint256     _learnedId
    )
        external
        returns (bool _isAlreadyLearned);
    
    function learnedHashes(
        uint256 _index
    )
        external
        returns (bytes32);
    
    function learnedFetchAllRoutes(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256[] memory);
    
    function learnedFetchAllTokens(
        bytes32 _learnedHash
    )
        external
        view
        returns (IERC20[] memory);
    
    function hasLearned(
        bytes32 _learnedHash
    )
        external
        view
        returns (bool);

    function learnedIds(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256);

    function learnedRoutesLength(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256);
    
    function learnedRoutes(
        bytes32 _learnedHash
    )
        external
        view
        returns (uint256[] memory);
}

// File: wx/libraries/IWardenTradingRoute0_8.sol

pragma solidity ^0.8.0;


/**
 * @title Warden Trading Route
 * @dev The Warden trading route interface has an standard functions and event
 * for other smart contract to implement to join Warden Swap as Market Maker.
 */
interface IWardenTradingRoute {
    /**
    * @dev when new trade occure (and success), this event will be boardcast.
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest   Destination token
    * @param _destAmount: amount of actual destination tokens
    */
    event Trade(
        IERC20 indexed _src,
        uint256 _srcAmount,
        IERC20 indexed _dest,
        uint256 _destAmount
    );

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token
    * @param _src Source token
    * @param _dest   Destination token
    * @param _srcAmount amount of source tokens
    ** @return _destAmount: amount of actual destination tokens
    */
    function trade(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount,
        address receiver
    )
        external
        payable
        returns(uint256 _destAmount);

    /**
    * @dev provide destinationm token amount for given source amount
    * @param _src Source token
    * @param _dest Destination token
    * @param _srcAmount Amount of source tokens
    ** @return _destAmount: amount of expected destination tokens
    */
    function getDestinationReturnAmount(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount
    )
        external
        returns(uint256 _destAmount);

    function getDepositAddress(
        IERC20 _src,
        IERC20 _dest
    )
        external
        view
        returns(address _target);
}

// File: wx/interface/IWardenCosmoCore0_8.sol

pragma solidity ^0.8.0;


interface IWardenCosmoCore {
    /**
    * @dev Struct of trading route
    * @param name Name of trading route.
    * @param enable The flag of trading route to check is trading route enable.
    * @param route The address of trading route.
    */
    struct Route {
      string name;
      bool enable;
      IWardenTradingRoute route;
    }

    event AddedTradingRoute(
        address indexed addedBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );
    
    event UpdatedTradingRoute(
        address indexed updatedBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event EnabledTradingRoute(
        address indexed enabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event DisabledTradingRoute(
        address indexed disabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );
    
    function tradingRoutes(uint256 _index) external view returns (Route memory);
    function allRoutesLength() external view returns (uint256);
    function isTradingRouteEnabled(uint256 _index) external view returns (bool);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/utils/SafeERC20.sol



pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: wx/WardenSwap1_5.sol

pragma solidity ^0.8.0;








contract WardenSwap1_5_Aegis is Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;
    
    IWETH private immutable weth;
    IERC20 private constant ETHER_ERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    
    IWardenCosmoCore public routingManagement;
    IWardenCosmicBrain public learner;
    IWardenPostTrade public postTrade;
    
    event UpdatedRoutingManagement(
        IWardenCosmoCore indexed routingManagement
    );
    
    event UpdatedWardenLearner(
        IWardenCosmicBrain indexed learner
    );
    
    event UpdatedWardenPostTrade(
        IWardenPostTrade indexed postTrade
    );
    
    /**
    * @dev when new trade occur (and success), this event will be boardcast.
    * @param srcAsset Source token
    * @param srcAmount amount of source token
    * @param destAsset Destination token
    * @param destAmount amount of destination token
    * @param trader user address
    */
    event Trade(
        address indexed srcAsset, // Source
        uint256         srcAmount,
        address indexed destAsset, // Destination
        uint256         destAmount,
        address indexed trader, // User
        address         receiver, // User / Merchant
        bool            cacheHit,
        bool            hasSplitted
    );
    
    event CollectFee(
      IERC20  indexed   token,
      address indexed   wallet,
      uint256           amount
    );
    
    constructor(
        IWardenCosmoCore _routingManagement,
        IWardenCosmicBrain _learner,
        IWardenPostTrade _postTrade,
        IWETH _weth
    ) {
        routingManagement = _routingManagement;
        learner = _learner;
        postTrade = _postTrade;
        weth = _weth;
        
        emit UpdatedRoutingManagement(_routingManagement);
        emit UpdatedWardenLearner(_learner);
        emit UpdatedWardenPostTrade(_postTrade);
    }
    
    function updateRoutingManagement(
        IWardenCosmoCore _routingManagement
    )
        external
        onlyOwner
    {
        routingManagement = _routingManagement;
        emit UpdatedRoutingManagement(_routingManagement);
    }
    
    function updateWardenLearner(
        IWardenCosmicBrain _learner
    )
        external
        onlyOwner
    {
        learner = _learner;
        emit UpdatedWardenLearner(_learner);
    }
    
    function updateWardenPostTrade(
        IWardenPostTrade _postTrade
    )
        external
        onlyOwner
    {
        postTrade = _postTrade;
        emit UpdatedWardenPostTrade(_postTrade);
    }

    /**
    * @dev makes a trade between token to token by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @param fromAddress address of trader
    * @param toAddress destination address
    * @return amount of actual destination tokens
    */
    function _tradeTokenToToken(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest,
        address fromAddress,
        address toAddress
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = routingManagement.tradingRoutes(tradingRouteIndex).route;
        
        // Deposit to target
        address depositAddress = tradingRoute.getDepositAddress(src, dest);
        if (fromAddress == address(this)) {
            src.safeTransfer(depositAddress, srcAmount);
        } else if (fromAddress != 0x0000000000000000000000000000000000000000) {
            src.safeTransferFrom(fromAddress, depositAddress, srcAmount);
        }

        // Trade to route
        uint256 destAmount = tradingRoute.trade(
            src,
            dest,
            srcAmount,
            toAddress
        );
        return destAmount;
    }
    
    function _tradeStrategies(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256[]   memory _subRoutes,
        IERC20[]    memory _correspondentTokens,
        address     _fromAddress
    )
        private
        returns(uint256 _destAmount)
    {
        IERC20 src;
        IERC20 dest;
        _destAmount = _srcAmount;
        uint256 routersLen = _subRoutes.length;
        for (uint i = 0; i < routersLen; i++) {
            src = i == 0 ? _src : _correspondentTokens[i - 1];
            dest = i == routersLen - 1 ? _dest : _correspondentTokens[i];
            
            uint256 routeIndex = _subRoutes[i];
            address fromAddress = i == 0 ? _fromAddress : 0x0000000000000000000000000000000000000000;
            address toAddress;
            
            // Advanced fetching next market address
            if (i == routersLen - 1) {
                toAddress = address(this);
            } else {
                IWardenTradingRoute tradingRoute = routingManagement.tradingRoutes(_subRoutes[i + 1]).route;
                IERC20 nextDest = i + 1 == routersLen - 1 ? _dest : _correspondentTokens[i + 1];
                toAddress = tradingRoute.getDepositAddress(dest, nextDest);
            }

            _destAmount = _tradeTokenToToken(routeIndex, src, _destAmount, dest, fromAddress, toAddress);
        }
    }
    
    /**
    * @dev makes a trade by providing trading strategy
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _subRoutes trading routers
    * @param _correspondentTokens intermediate tokens
    * @param _receiver receiver address
    * @param _learnedId previous learning id
    * @return _destAmount amount of actual destination tokens
    */
    function _tradeStrategiesWithSafeGuard(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256     _minDestAmount,
        uint256[]   memory _subRoutes,
        IERC20[]    memory _correspondentTokens,
        address     _receiver,
        uint256     _learnedId
    )
        private
        returns(uint256 _destAmount)
    {
        {
            IERC20 adjustedSrc;
            IERC20 adjustedDest = ETHER_ERC20 == _dest ? IERC20(address(weth)) : _dest;
            address fromAddress;
            
            // Wrap ETH
            if (ETHER_ERC20 == _src) {
                require(msg.value == _srcAmount, "WardenSwap: Ether source amount mismatched");
                weth.deposit{value: _srcAmount}();
                
                adjustedSrc = IERC20(address(weth));
                fromAddress = address(this);
            } else {
                adjustedSrc = _src;
                fromAddress = msg.sender;
            }
        
            // Record src/dest asset for later consistency check.
            uint256 srcAmountBefore = adjustedSrc.balanceOf(fromAddress);
            uint256 destAmountBefore = adjustedDest.balanceOf(address(this));
            
            _destAmount = _tradeStrategies(
                adjustedSrc,
                _srcAmount,
                adjustedDest,
                _subRoutes,
                _correspondentTokens,
                fromAddress
            );
            
            // Sanity check
            // Recheck if src/dest amount correct
            require(adjustedSrc.balanceOf(fromAddress) == srcAmountBefore - _srcAmount, "WardenSwap: source amount mismatched after trade");
            require(adjustedDest.balanceOf(address(this)) == destAmountBefore + _destAmount, "WardenSwap: destination amount mismatched after trade");
        }

        
        // Unwrap ETH
        if (ETHER_ERC20 == _dest) {
            weth.withdraw(_destAmount);
        }
        
        // Collect fee
        _destAmount = _postTradeAndCollectFee(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            msg.sender,
            _receiver,
            false
        );

        // Throw exception if destination amount doesn't meet user requirement.
        require(_destAmount >= _minDestAmount, "WardenSwap: destination amount is too low.");
        if (ETHER_ERC20 == _dest) {
            (bool success, ) = _receiver.call{value: _destAmount}(""); // Send back ether to sender
            require(success, "WardenSwap: Transfer ether back to caller failed.");
        } else { // Send back token to sender
            _dest.safeTransfer(_receiver, _destAmount);
        }
        
        uint256 learnedId = _learnedId;
        if (0 == _learnedId) {
            learnedId = learner.train(_subRoutes, _correspondentTokens);
        }
        learner.trainTradingPair(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            learnedId
        );

        emit Trade(address(_src), _srcAmount, address(_dest), _destAmount, msg.sender, _receiver, 0 != _learnedId, false);
    }
    
    /**
    * @dev makes a trade by providing trading strategy
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _subRoutes trading routers
    * @param _correspondentTokens intermediate tokens
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeStrategies(
        IERC20      _src,
        uint256     _srcAmount,
        IERC20      _dest,
        uint256     _minDestAmount,
        uint256[]   calldata _subRoutes,
        IERC20[]    calldata _correspondentTokens,
        address     _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        _destAmount = _tradeStrategiesWithSafeGuard(
            _src,
            _srcAmount,
            _dest,
            _minDestAmount,
            _subRoutes,
            _correspondentTokens,
            _receiver,
            0
        );
    }
    
    /**
    * @dev makes a trade by providing learned id
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _learnedId unique id
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeWithLearned(
        IERC20    _src,
        uint256   _srcAmount,
        IERC20    _dest,
        uint256   _minDestAmount,
        uint256   _learnedId,
        address   _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        bytes32 learnedHash = learner.learnedHashes(_learnedId);
        
        _destAmount = _tradeStrategiesWithSafeGuard(
            _src,
            _srcAmount,
            _dest,
            _minDestAmount,
            learner.learnedFetchAllRoutes(learnedHash),
            learner.learnedFetchAllTokens(learnedHash),
            _receiver,
            _learnedId
        );
    }
    
    function _split2(
        uint256[]   calldata _learnedIds,
        uint256[]   calldata _volumns,
        IERC20      _src,
        uint256     _totalSrcAmount,
        IERC20      _dest,
        address     _fromAddress
    )
        private
        returns (
            uint256 _destAmount
        )
    {
        // Trade with routes
        uint256 amountRemain = _totalSrcAmount;
        for (uint i = 0; i < _learnedIds.length; i++) {
            uint256 amountForThisRound;
            if (i == _learnedIds.length - 1) {
                amountForThisRound = amountRemain;
            } else {
                amountForThisRound = _totalSrcAmount * _volumns[i] / 100;
                amountRemain = amountRemain - amountForThisRound;
            }
            
            bytes32 learnedHash = learner.learnedHashes(_learnedIds[i]);
            _destAmount = _destAmount +
                _tradeStrategies(
                    _src,
                    amountForThisRound,
                    _dest,
                    learner.learnedFetchAllRoutes(learnedHash),
                    learner.learnedFetchAllTokens(learnedHash),
                    _fromAddress
                )
            ;
        }
    }
    
    function _splitTradesWithSafeGuard(
        uint256[] calldata  _learnedIds,
        uint256[] calldata  _volumns,
        IERC20              _src,
        uint256             _totalSrcAmount,
        IERC20              _dest
    )
        private
        returns(uint256 _destAmount)
    {
        IERC20 adjustedSrc;
        IERC20 adjustedDest = ETHER_ERC20 == _dest ? IERC20(address(weth)) : _dest;
        address fromAddress;
        
        // Wrap ETH
        if (ETHER_ERC20 == _src) {
            require(msg.value == _totalSrcAmount, "WardenSwap: Ether source amount mismatched");
            weth.deposit{value: _totalSrcAmount}();
            
            adjustedSrc = IERC20(address(weth));
            fromAddress = address(this);
        } else {
            adjustedSrc = _src;
            fromAddress = msg.sender;
        }
        
        // Record src/dest asset for later consistency check.
        uint256 srcAmountBefore = adjustedSrc.balanceOf(fromAddress);
        uint256 destAmountBefore = adjustedDest.balanceOf(address(this));
        
        _destAmount = _split2(
            _learnedIds,
            _volumns,
            adjustedSrc,
            _totalSrcAmount,
            adjustedDest,
            fromAddress
        );
        
        // Sanity check
        // Recheck if src/dest amount correct
        require(adjustedSrc.balanceOf(fromAddress) == srcAmountBefore - _totalSrcAmount, "WardenSwap: source amount mismatched after trade");
        require(adjustedDest.balanceOf(address(this)) == destAmountBefore + _destAmount, "WardenSwap: destination amount mismatched after trade");

        
        // Unwrap ETH
        if (ETHER_ERC20 == _dest) {
            weth.withdraw(_destAmount);
        }
    }

    /**
    * @dev makes a trade by splitting volumes
    * @param _learnedIds unique ids
    * @param _volumns volume percentages
    * @param _src Source token
    * @param _totalSrcAmount amount of source tokens
    * @param _dest Destination token
    * @param _minDestAmount minimum of destination token amount
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function splitTrades(
        uint256[] calldata  _learnedIds,
        uint256[] calldata  _volumns,
        IERC20              _src,
        uint256             _totalSrcAmount,
        IERC20              _dest,
        uint256             _minDestAmount,
        address             _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        require(_learnedIds.length > 0, "WardenSwap: learnedIds can not be empty");
        require(_learnedIds.length == _volumns.length, "WardenSwap: learnedIds and volumns lengths mismatched");
        
        _destAmount = _splitTradesWithSafeGuard(
            _learnedIds,
            _volumns,
            _src,
            _totalSrcAmount,
            _dest
        );
        
        // Collect fee
        _destAmount = _postTradeAndCollectFee(
            _src,
            _dest,
            _totalSrcAmount,
            _destAmount,
            msg.sender,
            _receiver,
            true
        );

        // Throw exception if destination amount doesn't meet user requirement.
        require(_destAmount >= _minDestAmount, "WardenSwap: destination amount is too low.");
        if (ETHER_ERC20 == _dest) {
            (bool success, ) = _receiver.call{value: _destAmount}(""); // Send back ether to sender
            require(success, "WardenSwap: Transfer ether back to caller failed.");
        } else { // Send back token to sender
            _dest.safeTransfer(_receiver, _destAmount);
        }

        emit Trade(address(_src), _totalSrcAmount, address(_dest), _destAmount, msg.sender, _receiver, true, true);
    }
    
    /**
    * @dev makes a trade ETH -> WETH
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeEthToWeth(
        address     _receiver
    )
        external
        payable
        nonReentrant
        returns(uint256 _destAmount)
    {
        weth.deposit{value: msg.value}();
        IERC20(address(weth)).safeTransfer(_receiver, msg.value);
        _destAmount = msg.value;
        emit Trade(address(ETHER_ERC20), msg.value, address(weth), _destAmount, msg.sender, _receiver, false, false);
    }
    
    /**
    * @dev makes a trade WETH -> ETH
    * @param _srcAmount amount of source tokens
    * @param _receiver receiver address
    * @return _destAmount amount of actual destination tokens
    */
    function tradeWethToEth(
        uint256     _srcAmount,
        address     _receiver
    )
        external
        nonReentrant
        returns(uint256 _destAmount)
    {
        IERC20(address(weth)).safeTransferFrom(msg.sender, address(this), _srcAmount);
        weth.withdraw(_srcAmount);
        (bool success, ) = _receiver.call{value: _srcAmount}(""); // Send back ether to sender
        require(success, "WardenSwap: Transfer ether back to caller failed.");
        _destAmount = _srcAmount;
        emit Trade(address(weth), _srcAmount, address(ETHER_ERC20), _destAmount, msg.sender, _receiver, false, false);
    }

    // In case of an expected and unexpected event that has some token amounts remain in this contract, owner can call to collect them.
    function collectRemainingToken(
        IERC20  _token,
        uint256 _amount
    )
      external
      onlyOwner
    {
        _token.safeTransfer(msg.sender, _amount);
    }

    // In case of an expected and unexpected event that has some ether amounts remain in this contract, owner can call to collect them.
    function collectRemainingEther(
        uint256 _amount
    )
      external
      onlyOwner
    {
        (bool success, ) = msg.sender.call{value: _amount}(""); // Send back ether to sender
        require(success, "WardenSwap: Transfer ether back to caller failed.");
    }
    
    // Receive ETH in case of trade Token -> ETH
    receive() external payable {}
    
    function _postTradeAndCollectFee(
        IERC20      _src,
        IERC20      _dest,
        uint256     _srcAmount,
        uint256     _destAmount,
        address     _trader,
        address     _receiver,
        bool        _isSplit
    )
        private
        returns (uint256 _newDestAmount)
    {
        // Collect fee
        (uint256 fee, address feeWallet) = postTrade.postTradeAndFee(
            _src,
            _dest,
            _srcAmount,
            _destAmount,
            _trader,
            _receiver,
            _isSplit
        );
        if (fee > 0) {
            _collectFee(
                _dest,
                fee,
                feeWallet
            );
        }
        return _destAmount - fee;
    }
    
    function _collectFee(
        IERC20  _token,
        uint256 _fee,
        address _feeWallet
    )
        private
    {
        if (ETHER_ERC20 == _token) {
            (bool success, ) = payable(_feeWallet).call{value: _fee}(""); // Send back ether to sender
            require(success, "Transfer fee of ether failed.");
        } else {
            _token.safeTransfer(_feeWallet, _fee);
        }
        emit CollectFee(_token, _feeWallet, _fee);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IWardenCosmoCore","name":"_routingManagement","type":"address"},{"internalType":"contract IWardenCosmicBrain","name":"_learner","type":"address"},{"internalType":"contract IWardenPostTrade","name":"_postTrade","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollectFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bool","name":"cacheHit","type":"bool"},{"indexed":false,"internalType":"bool","name":"hasSplitted","type":"bool"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenCosmoCore","name":"routingManagement","type":"address"}],"name":"UpdatedRoutingManagement","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenCosmicBrain","name":"learner","type":"address"}],"name":"UpdatedWardenLearner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWardenPostTrade","name":"postTrade","type":"address"}],"name":"UpdatedWardenPostTrade","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"learner","outputs":[{"internalType":"contract IWardenCosmicBrain","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postTrade","outputs":[{"internalType":"contract IWardenPostTrade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routingManagement","outputs":[{"internalType":"contract IWardenCosmoCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_learnedIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_volumns","type":"uint256[]"},{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_totalSrcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"splitTrades","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeEthToWeth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"uint256[]","name":"_subRoutes","type":"uint256[]"},{"internalType":"contract IERC20[]","name":"_correspondentTokens","type":"address[]"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeStrategies","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWethToEth","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_src","type":"address"},{"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_dest","type":"address"},{"internalType":"uint256","name":"_minDestAmount","type":"uint256"},{"internalType":"uint256","name":"_learnedId","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"tradeWithLearned","outputs":[{"internalType":"uint256","name":"_destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenCosmoCore","name":"_routingManagement","type":"address"}],"name":"updateRoutingManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenCosmicBrain","name":"_learner","type":"address"}],"name":"updateWardenLearner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWardenPostTrade","name":"_postTrade","type":"address"}],"name":"updateWardenPostTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604051620042603803806200426083398101604081905262000034916200017b565b6200003f336200012b565b60018055600280546001600160a01b038087166001600160a01b031992831681179093556003805487831690841617905560048054918616919092161790556001600160601b0319606083901b166080526040517f4158d6fb30ce3bc59f79f1e62ec86e3141b1db83ff2adbd93404b9d017615aee90600090a26040516001600160a01b038416907f28ad9ca1082b4a5d88ea02df921da4ca5c95e220ef1e855c1fb06fbd5e67d15990600090a26040516001600160a01b038316907ff3809f73f1bea6bcad288beb0538a25e1b98b4388cc422d087050ff52f7cbf8790600090a250505050620001fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080608085870312156200019257600080fd5b84516200019f81620001e3565b6020860151909450620001b281620001e3565b6040860151909350620001c581620001e3565b6060860151909250620001d881620001e3565b939692955090935050565b6001600160a01b0381168114620001f957600080fd5b50565b60805160601c613fea6200027660003960008181610964015281816109bb01528181610b73015281816113cd01528181611465015281816114d2015281816116ac015281816117930152818161181401528181611c6801528181611fe2015281816120c90152818161214a01526125b70152613fea6000f3fe6080604052600436106100f75760003560e01c8063715018a61161008a57806397ad9f861161005957806397ad9f86146102bd578063c8a7c7e5146102ea578063dca489e0146102fd578063f2fde38b1461031057600080fd5b8063715018a61461024a57806378fc6db01461025f5780638da5cb5b146102725780638f64d73a1461029d57600080fd5b80634912dd14116100c65780634912dd14146101ca578063629e1425146101ea57806366f7c9561461020a5780636d16ecee1461022a57600080fd5b806310b8e70f1461010357806327d2f16c14610125578063356890111461017c5780633d0652ac1461019d57600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061012361011e36600461375c565b610330565b005b34801561013157600080fd5b506004546101529073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61018f61018a36600461383c565b610425565b604051908152602001610173565b3480156101a957600080fd5b506002546101529073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101d657600080fd5b506101236101e53660046139b7565b610830565b3480156101f657600080fd5b5061018f610205366004613c0a565b6108d6565b34801561021657600080fd5b5061012361022536600461375c565b610bcb565b34801561023657600080fd5b5061012361024536600461375c565b610cbb565b34801561025657600080fd5b50610123610dab565b61018f61026d3660046139e3565b610e38565b34801561027e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610152565b3480156102a957600080fd5b506101236102b8366004613bf1565b610f34565b3480156102c957600080fd5b506003546101529073ffffffffffffffffffffffffffffffffffffffff1681565b61018f6102f8366004613a8d565b61108d565b61018f61030b36600461375c565b611354565b34801561031c57600080fd5b5061012361032b36600461375c565b61153f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517ff3809f73f1bea6bcad288beb0538a25e1b98b4388cc422d087050ff52f7cbf8790600090a250565b600060026001541415610494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103ad565b600260015588610526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f57617264656e537761703a206c6561726e65644964732063616e206e6f74206260448201527f6520656d7074790000000000000000000000000000000000000000000000000060648201526084016103ad565b8887146105b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f57617264656e537761703a206c6561726e656449647320616e6420766f6c756d60448201527f6e73206c656e67746873206d69736d617463686564000000000000000000000060648201526084016103ad565b6105c48a8a8a8a8a8a8a61166f565b90506105d68685878433876001611cea565b905082811015610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206960448201527f7320746f6f206c6f772e0000000000000000000000000000000000000000000060648201526084016103ad565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff851614156107905760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146106f4576040519150601f19603f3d011682016040523d82523d6000602084013e6106f9565b606091505b505090508061078a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f57617264656e537761703a205472616e73666572206574686572206261636b2060448201527f746f2063616c6c6572206661696c65642e00000000000000000000000000000060648201526084016103ad565b506107b1565b6107b173ffffffffffffffffffffffffffffffffffffffff85168383611df3565b604080518681526020810183905273ffffffffffffffffffffffffffffffffffffffff8481168284015260016060830181905260808301529151339287811692908a16917f7acb84937815db1a71622c24a8f03661982c6ac39f087563b5033ab1c9d2cbbd9181900360a00190a4600180559998505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b6108d273ffffffffffffffffffffffffffffffffffffffff83163383611df3565b5050565b600060026001541415610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103ad565b600260015561098c73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333086611ecc565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015610a1457600080fd5b505af1158015610a28573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d8060008114610a86576040519150601f19603f3d011682016040523d82523d6000602084013e610a8b565b606091505b5050905080610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f57617264656e537761703a205472616e73666572206574686572206261636b2060448201527f746f2063616c6c6572206661696c65642e00000000000000000000000000000060648201526084016103ad565b604080518581526020810186905273ffffffffffffffffffffffffffffffffffffffff8581168284015260006060830181905260808301529151869450339273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927f0000000000000000000000000000000000000000000000000000000000000000909116917f7acb84937815db1a71622c24a8f03661982c6ac39f087563b5033ab1c9d2cbbd9181900360a00190a4506001805592915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f28ad9ca1082b4a5d88ea02df921da4ca5c95e220ef1e855c1fb06fbd5e67d15990600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4158d6fb30ce3bc59f79f1e62ec86e3141b1db83ff2adbd93404b9d017615aee90600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b610e366000611f30565b565b600060026001541415610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103ad565b6002600181905550610f228a8a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c91829185019084908082843760009201829052508c93509150611fa59050565b600180559a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b604051600090339083908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b50509050806108d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f57617264656e537761703a205472616e73666572206574686572206261636b2060448201527f746f2063616c6c6572206661696c65642e00000000000000000000000000000060648201526084016103ad565b6000600260015414156110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103ad565b60026001556003546040517f972f41430000000000000000000000000000000000000000000000000000000081526004810185905260009173ffffffffffffffffffffffffffffffffffffffff169063972f414390602401602060405180830381600087803b15801561116e57600080fd5b505af1158015611182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a6919061399e565b6003546040517f624d8aba00000000000000000000000000000000000000000000000000000000815260048101839052919250611344918a918a918a918a9173ffffffffffffffffffffffffffffffffffffffff9091169063624d8aba9060240160006040518083038186803b15801561121f57600080fd5b505afa158015611233573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261127991908101906138f7565b6003546040517f9436a8180000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff90911690639436a8189060240160006040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261133d9190810190613796565b898b611fa5565b6001805598975050505050505050565b6000600260015414156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103ad565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561143357600080fd5b505af1158015611447573d6000803e3d6000fd5b5061149093505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016915084905034611df3565b5060408051348082526020820181905273ffffffffffffffffffffffffffffffffffffffff8481168385015260006060840181905260808401529251909233927f00000000000000000000000000000000000000000000000000000000000000009091169173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917f7acb84937815db1a71622c24a8f03661982c6ac39f087563b5033ab1c9d2cbbd919081900360a00190a460018055919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103ad565b73ffffffffffffffffffffffffffffffffffffffff8116611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103ad565b61166c81611f30565b50565b6000808073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8516146116aa57836116cc565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816141561183d57853414611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f57617264656e537761703a20457468657220736f7572636520616d6f756e742060448201527f6d69736d6174636865640000000000000000000000000000000000000000000060648201526084016103ad565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b1580156117f957600080fd5b505af115801561180d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009250309050611843565b50859150335b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152600091908516906370a082319060240160206040518083038186803b1580156118ae57600080fd5b505afa1580156118c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e6919061399e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611989919061399e565b905061199b8d8d8d8d898d8a8a612a06565b95506119a78883613e89565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528716906370a082319060240160206040518083038186803b158015611a0e57600080fd5b505afa158015611a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a46919061399e565b14611ad3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f57617264656e537761703a20736f7572636520616d6f756e74206d69736d617460448201527f636865642061667465722074726164650000000000000000000000000000000060648201526084016103ad565b611add8682613df9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b158015611b4257600080fd5b505afa158015611b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7a919061399e565b14611c07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206d60448201527f69736d617463686564206166746572207472616465000000000000000000000060648201526084016103ad565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff88161415611cda576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018790527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015611cc157600080fd5b505af1158015611cd5573d6000803e3d6000fd5b505050505b5050505050979650505050505050565b600480546040517fc62dc9ef00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81169382019390935288831660248201526044810188905260648101879052858316608482015284831660a482015283151560c48201526000928392839291169063c62dc9ef9060e4016040805180830381600087803b158015611d8d57600080fd5b505af1158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613c3a565b90925090508115611ddb57611ddb898383612cdf565b611de58288613e89565b9a9950505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ec79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e6e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f2a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e45565b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8a1614611fe05788612002565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8d161415612173578a34146120c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f57617264656e537761703a20457468657220736f7572636520616d6f756e742060448201527f6d69736d6174636865640000000000000000000000000000000000000000000060648201526084016103ad565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08c6040518263ffffffff1660e01b81526004016000604051808303818588803b15801561212f57600080fd5b505af1158015612143573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009250309050612179565b508a9150335b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152600091908516906370a082319060240160206040518083038186803b1580156121e457600080fd5b505afa1580156121f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221c919061399e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561228757600080fd5b505afa15801561229b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bf919061399e565b90506122cf858e868d8d88612f7a565b95506122db8d83613e89565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528716906370a082319060240160206040518083038186803b15801561234257600080fd5b505afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a919061399e565b14612407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f57617264656e537761703a20736f7572636520616d6f756e74206d69736d617460448201527f636865642061667465722074726164650000000000000000000000000000000060648201526084016103ad565b6124118682613df9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b15801561247657600080fd5b505afa15801561248a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ae919061399e565b1461253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206d60448201527f69736d617463686564206166746572207472616465000000000000000000000060648201526084016103ad565b50505050508673ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff161415612629576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561261057600080fd5b505af1158015612624573d6000803e3d6000fd5b505050505b61263989888a8433886000611cea565b9050858110156126cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f57617264656e537761703a2064657374696e6174696f6e20616d6f756e74206960448201527f7320746f6f206c6f772e0000000000000000000000000000000000000000000060648201526084016103ad565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff881614156127f35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612757576040519150601f19603f3d011682016040523d82523d6000602084013e61275c565b606091505b50509050806127ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f57617264656e537761703a205472616e73666572206574686572206261636b2060448201527f746f2063616c6c6572206661696c65642e00000000000000000000000000000060648201526084016103ad565b50612814565b61281473ffffffffffffffffffffffffffffffffffffffff88168483611df3565b81806128c7576003546040517f96a9bb5a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906396a9bb5a906128729089908990600401613c7b565b602060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c4919061399e565b90505b6003546040517f29c2393b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528a81166024830152604482018c90526064820185905260848201849052909116906329c2393b9060a401602060405180830381600087803b15801561295157600080fd5b505af1158015612965573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129899190613983565b50604080518a81526020810184905273ffffffffffffffffffffffffffffffffffffffff86811682840152851515606083015260006080830152915133928b811692908e16917f7acb84937815db1a71622c24a8f03661982c6ac39f087563b5033ab1c9d2cbbd9181900360a00190a45098975050505050505050565b600083815b89811015612cd1576000612a2060018c613e89565b821415612a2e575081612a6d565b60648a8a84818110612a4257612a42613f34565b9050602002013588612a549190613e4c565b612a5e9190613e11565b9050612a6a8184613e89565b92505b60035460009073ffffffffffffffffffffffffffffffffffffffff1663972f41438e8e86818110612aa057612aa0613f34565b905060200201356040518263ffffffff1660e01b8152600401612ac591815260200190565b602060405180830381600087803b158015612adf57600080fd5b505af1158015612af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b17919061399e565b6003546040517f624d8aba00000000000000000000000000000000000000000000000000000000815260048101839052919250612cb0918b9185918b9173ffffffffffffffffffffffffffffffffffffffff169063624d8aba9060240160006040518083038186803b158015612b8c57600080fd5b505afa158015612ba0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612be691908101906138f7565b6003546040517f9436a8180000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff90911690639436a8189060240160006040518083038186803b158015612c5057600080fd5b505afa158015612c64573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612caa9190810190613796565b8b612f7a565b612cba9086613df9565b945050508080612cc990613ecc565b915050612a0b565b505098975050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff84161415612de15760008173ffffffffffffffffffffffffffffffffffffffff168360405160006040518083038185875af1925050503d8060008114612d6b576040519150601f19603f3d011682016040523d82523d6000602084013e612d70565b606091505b5050905080612ddb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5472616e7366657220666565206f66206574686572206661696c65642e00000060448201526064016103ad565b50612e02565b612e0273ffffffffffffffffffffffffffffffffffffffff84168284611df3565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f63641fd2aeafea4143cc44c28ca8af48dde6326ee1be502b0222b4f92dfae28384604051612e6191815260200190565b60405180910390a3505050565b6000612ed0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132499092919063ffffffff16565b805190915015611ec75780806020019051810190612eee9190613983565b611ec7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016103ad565b825185906000908190815b8181101561323b578015612fbc5786612f9f600183613e89565b81518110612faf57612faf613f34565b6020026020010151612fbe565b8a5b9350612fcb600183613e89565b8114612ff057868181518110612fe357612fe3613f34565b6020026020010151612ff2565b885b9250600088828151811061300857613008613f34565b60200260200101519050600082600014613023576000613025565b875b90506000613034600186613e89565b841415613042575030613215565b60025460009073ffffffffffffffffffffffffffffffffffffffff1663e254a4f38d61306f886001613df9565b8151811061307f5761307f613f34565b60200260200101516040518263ffffffff1660e01b81526004016130a591815260200190565b60006040518083038186803b1580156130bd57600080fd5b505afa1580156130d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526131179190810190613af4565b604001519050600061312a600188613e89565b613135876001613df9565b14613163578b613146876001613df9565b8151811061315657613156613f34565b6020026020010151613165565b8d5b6040517f2717650900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015280831660248301529192509083169063271765099060440160206040518083038186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132109190613779565b925050505b61322383888a898686613262565b9750505050808061323390613ecc565b915050612f85565b505050509695505050505050565b6060613258848460008561351d565b90505b9392505050565b6002546040517fe254a4f300000000000000000000000000000000000000000000000000000000815260048101889052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063e254a4f39060240160006040518083038186803b1580156132d157600080fd5b505afa1580156132e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261332b9190810190613af4565b60409081015190517f2717650900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152878116602483015291925060009183169063271765099060440160206040518083038186803b1580156133a557600080fd5b505afa1580156133b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133dd9190613779565b905073ffffffffffffffffffffffffffffffffffffffff85163014156134235761341e73ffffffffffffffffffffffffffffffffffffffff89168289611df3565b613461565b73ffffffffffffffffffffffffffffffffffffffff8516156134615761346173ffffffffffffffffffffffffffffffffffffffff891686838a611ecc565b6040517fd76d0c5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015287811660248301526044820189905285811660648301526000919084169063d76d0c5b90608401602060405180830381600087803b1580156134e557600080fd5b505af11580156134f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de5919061399e565b6060824710156135af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103ad565b843b613617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103ad565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136409190613c5f565b60006040518083038185875af1925050503d806000811461367d576040519150601f19603f3d011682016040523d82523d6000602084013e613682565b606091505b509150915061369282828661369d565b979650505050505050565b606083156136ac57508161325b565b8251156136bc5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ad9190613d0c565b60008083601f84011261370257600080fd5b50813567ffffffffffffffff81111561371a57600080fd5b6020830191508360208260051b850101111561373557600080fd5b9250929050565b8051801515811461374c57600080fd5b919050565b805161374c81613f92565b60006020828403121561376e57600080fd5b813561325b81613f92565b60006020828403121561378b57600080fd5b815161325b81613f92565b600060208083850312156137a957600080fd5b825167ffffffffffffffff8111156137c057600080fd5b8301601f810185136137d157600080fd5b80516137e46137df82613dd5565b613d86565b80828252848201915084840188868560051b870101111561380457600080fd5b600094505b8385101561383057805161381c81613f92565b835260019490940193918501918501613809565b50979650505050505050565b600080600080600080600080600060e08a8c03121561385a57600080fd5b893567ffffffffffffffff8082111561387257600080fd5b61387e8d838e016136f0565b909b50995060208c013591508082111561389757600080fd5b506138a48c828d016136f0565b90985096505060408a01356138b881613f92565b945060608a0135935060808a01356138cf81613f92565b925060a08a0135915060c08a01356138e681613f92565b809150509295985092959850929598565b6000602080838503121561390a57600080fd5b825167ffffffffffffffff81111561392157600080fd5b8301601f8101851361393257600080fd5b80516139406137df82613dd5565b80828252848201915084840188868560051b870101111561396057600080fd5b600094505b83851015613830578051835260019490940193918501918501613965565b60006020828403121561399557600080fd5b61325b8261373c565b6000602082840312156139b057600080fd5b5051919050565b600080604083850312156139ca57600080fd5b82356139d581613f92565b946020939093013593505050565b600080600080600080600080600060e08a8c031215613a0157600080fd5b8935613a0c81613f92565b985060208a0135975060408a0135613a2381613f92565b965060608a0135955060808a013567ffffffffffffffff80821115613a4757600080fd5b613a538d838e016136f0565b909750955060a08c0135915080821115613a6c57600080fd5b50613a798c828d016136f0565b90945092505060c08a01356138e681613f92565b60008060008060008060c08789031215613aa657600080fd5b8635613ab181613f92565b9550602087013594506040870135613ac881613f92565b9350606087013592506080870135915060a0870135613ae681613f92565b809150509295509295509295565b60006020808385031215613b0757600080fd5b825167ffffffffffffffff80821115613b1f57600080fd5b9084019060608287031215613b3357600080fd5b613b3b613d5d565b825182811115613b4a57600080fd5b8301601f81018813613b5b57600080fd5b805183811115613b6d57613b6d613f63565b613b9d867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d86565b93508084528886828401011115613bb357600080fd5b613bc281878601888501613ea0565b5050818152613bd284840161373c565b84820152613be260408401613751565b60408201529695505050505050565b600060208284031215613c0357600080fd5b5035919050565b60008060408385031215613c1d57600080fd5b823591506020830135613c2f81613f92565b809150509250929050565b60008060408385031215613c4d57600080fd5b825191506020830151613c2f81613f92565b60008251613c71818460208701613ea0565b9190910192915050565b604080825283519082018190526000906020906060840190828701845b82811015613cb457815184529284019290840190600101613c98565b5050508381038285015284518082528583019183019060005b81811015613cff57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613ccd565b5090979650505050505050565b6020815260008251806020840152613d2b816040850160208701613ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6040516060810167ffffffffffffffff81118282101715613d8057613d80613f63565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613dcd57613dcd613f63565b604052919050565b600067ffffffffffffffff821115613def57613def613f63565b5060051b60200190565b60008219821115613e0c57613e0c613f05565b500190565b600082613e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8457613e84613f05565b500290565b600082821015613e9b57613e9b613f05565b500390565b60005b83811015613ebb578181015183820152602001613ea3565b83811115611f2a5750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613efe57613efe613f05565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461166c57600080fdfea26469706673582212201f3d880f21e4cd8566afa653a25496e4fb8ae0cb206cad16bee3282d04bf491864736f6c63430008070033000000000000000000000000bf0955a3c4d3dd474b397ae4cdb8d264065c575a0000000000000000000000003c0d058aab0b47a377c25effc856b84f0ebcb783000000000000000000000000d31a255de0957023896762a0c7b26e855a861753000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000bf0955a3c4d3dd474b397ae4cdb8d264065c575a0000000000000000000000003c0d058aab0b47a377c25effc856b84f0ebcb783000000000000000000000000d31a255de0957023896762a0c7b26e855a861753000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _routingManagement (address): 0xbf0955a3c4d3dd474b397ae4cdb8d264065c575a
Arg [1] : _learner (address): 0x3c0d058aab0b47a377c25effc856b84f0ebcb783
Arg [2] : _postTrade (address): 0xd31a255de0957023896762a0c7b26e855a861753
Arg [3] : _weth (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000bf0955a3c4d3dd474b397ae4cdb8d264065c575a
Arg [1] : 0000000000000000000000003c0d058aab0b47a377c25effc856b84f0ebcb783
Arg [2] : 000000000000000000000000d31a255de0957023896762a0c7b26e855a861753
Arg [3] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

29230:20276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31650:209;;;;;;;;;;-1:-1:-1;31650:209:0;;;;;:::i;:::-;;:::i;:::-;;29557:33;;;;;;;;;;-1:-1:-1;29557:33:0;;;;;;;;;;;11125:42:1;11113:55;;;11095:74;;11083:2;11068:18;29557:33:0;;;;;;;;44213:1697;;;;;;:::i;:::-;;:::i;:::-;;;13251:25:1;;;13239:2;13224:18;44213:1697:0;13105:177:1;29469:41:0;;;;;;;;;;-1:-1:-1;29469:41:0;;;;;;;;47522:186;;;;;;;;;;-1:-1:-1;47522:186:0;;;;;:::i;:::-;;:::i;46735:642::-;;;;;;;;;;-1:-1:-1;46735:642:0;;;;;:::i;:::-;;:::i;31439:199::-;;;;;;;;;;-1:-1:-1;31439:199:0;;;;;:::i;:::-;;:::i;31182:245::-;;;;;;;;;;-1:-1:-1;31182:245:0;;;;;:::i;:::-;;:::i;25782:94::-;;;;;;;;;;;;;:::i;38921:649::-;;;;;;:::i;:::-;;:::i;25131:87::-;;;;;;;;;;-1:-1:-1;25177:7:0;25204:6;;;25131:87;;47853:284;;;;;;;;;;-1:-1:-1;47853:284:0;;;;;:::i;:::-;;:::i;29517:33::-;;;;;;;;;;-1:-1:-1;29517:33:0;;;;;;;;39972:716;;;;;;:::i;:::-;;:::i;46081:434::-;;;;;;:::i;:::-;;:::i;26031:192::-;;;;;;;;;;-1:-1:-1;26031:192:0;;;;;:::i;:::-;;:::i;31650:209::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;;;;;;;;;31779:9:::1;:22:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;31817:34:::1;::::0;::::1;::::0;-1:-1:-1;;31817:34:0::1;31650:209:::0;:::o;44213:1697::-;44598:19;28211:1;28807:7;;:19;;28799:63;;;;;;;22107:2:1;28799:63:0;;;22089:21:1;22146:2;22126:18;;;22119:30;22185:33;22165:18;;;22158:61;22236:18;;28799:63:0;21905:355:1;28799:63:0;28211:1;28940:7;:18;44643:22;44635:74:::1;;;::::0;::::1;::::0;;17307:2:1;44635:74:0::1;::::0;::::1;17289:21:1::0;17346:2;17326:18;;;17319:30;17385:34;17365:18;;;17358:62;17456:9;17436:18;;;17429:37;17483:19;;44635:74:0::1;17105:403:1::0;44635:74:0::1;44728:37:::0;;::::1;44720:103;;;::::0;::::1;::::0;;18946:2:1;44720:103:0::1;::::0;::::1;18928:21:1::0;18985:2;18965:18;;;18958:30;19024:34;19004:18;;;18997:62;19095:23;19075:18;;;19068:51;19136:19;;44720:103:0::1;18744:417:1::0;44720:103:0::1;44858:154;44898:11;;44924:8;;44947:4;44966:15;44996:5;44858:25;:154::i;:::-;44844:168;;45071:197;45109:4;45128:5;45148:15;45178:11;45204:10;45229:9;45253:4;45071:23;:197::i;:::-;45057:211;;45385:14;45370:11;:29;;45362:84;;;::::0;::::1;::::0;;19786:2:1;45362:84:0::1;::::0;::::1;19768:21:1::0;19825:2;19805:18;;;19798:30;19864:34;19844:18;;;19837:62;19935:12;19915:18;;;19908:40;19965:19;;45362:84:0::1;19584:406:1::0;45362:84:0::1;29413:42;45461:20;::::0;::::1;;45457:327;;;45499:12;45517:9;:14;;45539:11;45517:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45498:57;;;45607:7;45599:69;;;::::0;::::1;::::0;;19368:2:1;45599:69:0::1;::::0;::::1;19350:21:1::0;19407:2;19387:18;;;19380:30;19446:34;19426:18;;;19419:62;19517:19;19497:18;;;19490:47;19554:19;;45599:69:0::1;19166:413:1::0;45599:69:0::1;45483:197;45457:327;;;45730:42;:18;::::0;::::1;45749:9:::0;45760:11;45730:18:::1;:42::i;:::-;45801:101;::::0;;22694:25:1;;;22750:2;22735:18;;22728:34;;;45801:101:0::1;22798:55:1::0;;;22778:18;;;22771:83;45891:4:0::1;22885:2:1::0;22870:18;;22863:50;;;22944:3;22929:19;;22922:51;45801:101:0;;45868:10:::1;::::0;45801:101;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;22681:3:1;45801:101:0;;::::1;28167:1:::0;29119:22;;44213:1697;;-1:-1:-1;;;;;;;;;44213:1697:0:o;47522:186::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;47660:40:::1;:19;::::0;::::1;47680:10;47692:7:::0;47660:19:::1;:40::i;:::-;47522:186:::0;;:::o;46735:642::-;46888:19;28211:1;28807:7;;:19;;28799:63;;;;;;;22107:2:1;28799:63:0;;;22089:21:1;22146:2;22126:18;;;22119:30;22185:33;22165:18;;;22158:61;22236:18;;28799:63:0;21905:355:1;28799:63:0;28211:1;28940:7;:18;46925:77:::1;:38;46940:4;46925:38;46964:10;46984:4;46991:10:::0;46925:38:::1;:77::i;:::-;47013:25;::::0;;;;::::1;::::0;::::1;13251::1::0;;;47013:4:0::1;:13;;::::0;::::1;::::0;13224:18:1;;47013:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47050:12;47068:9;:14;;47090:10;47068:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47049:56;;;47153:7;47145:69;;;::::0;::::1;::::0;;19368:2:1;47145:69:0::1;::::0;::::1;19350:21:1::0;19407:2;19387:18;;;19380:30;19446:34;19426:18;;;19419:62;19517:19;19497:18;;;19490:47;19554:19;;47145:69:0::1;19166:413:1::0;47145:69:0::1;47265:104;::::0;;22694:25:1;;;22750:2;22735:18;;22728:34;;;47265:104:0::1;22798:55:1::0;;;22778:18;;;22771:83;-1:-1:-1;22885:2:1;22870:18;;22863:50;;;22944:3;22929:19;;22922:51;47265:104:0;;22694:25:1;;-1:-1:-1;47333:10:0::1;::::0;29413:42:::1;::::0;47279:4:::1;47265:104:::0;;::::1;::::0;::::1;::::0;;;;22681:3:1;47265:104:0;;::::1;-1:-1:-1::0;28167:1:0;29119:22;;46735:642;;-1:-1:-1;;46735:642:0:o;31439:199::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;31566:7:::1;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;31600:30:::1;::::0;::::1;::::0;-1:-1:-1;;31600:30:0::1;31439:199:::0;:::o;31182:245::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;31321:17:::1;:38:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;31375:44:::1;::::0;::::1;::::0;-1:-1:-1;;31375:44:0::1;31182:245:::0;:::o;25782:94::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;25847:21:::1;25865:1;25847:9;:21::i;:::-;25782:94::o:0;38921:649::-;39278:19;28211:1;28807:7;;:19;;28799:63;;;;;;;22107:2:1;28799:63:0;;;22089:21:1;22146:2;22126:18;;;22119:30;22185:33;22165:18;;;22158:61;22236:18;;28799:63:0;21905:355:1;28799:63:0;28211:1;28940:7;:18;;;;39329:233:::1;39373:4;39392:10;39417:5;39437:14;39466:10;;39329:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39329:233:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;39491:20:0;;-1:-1:-1;39491:20:0;;;;39329:233;::::1;::::0;39491:20;;39329:233;39491:20;39329:233;::::1;;::::0;::::1;::::0;;;-1:-1:-1;39526:9:0;;-1:-1:-1;39329:233:0;-1:-1:-1;39329:29:0::1;::::0;-1:-1:-1;39329:233:0:i:1;:::-;28167:1:::0;29119:22;;39315:247;38921:649;-1:-1:-1;;;;;;;;;;38921:649:0:o;47853:284::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;47985:35:::1;::::0;47967:12:::1;::::0;47985:10:::1;::::0;48008:7;;47967:12;47985:35;47967:12;47985:35;48008:7;47985:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47966:54;;;48068:7;48060:69;;;::::0;::::1;::::0;;19368:2:1;48060:69:0::1;::::0;::::1;19350:21:1::0;19407:2;19387:18;;;19380:30;19446:34;19426:18;;;19419:62;19517:19;19497:18;;;19490:47;19554:19;;48060:69:0::1;19166:413:1::0;39972:716:0;40257:19;28211:1;28807:7;;:19;;28799:63;;;;;;;22107:2:1;28799:63:0;;;22089:21:1;22146:2;22126:18;;;22119:30;22185:33;22165:18;;;22158:61;22236:18;;28799:63:0;21905:355:1;28799:63:0;28211:1;28940:7;:18;40316:7:::1;::::0;:33:::1;::::0;;;;::::1;::::0;::::1;13251:25:1::0;;;40294:19:0::1;::::0;40316:7:::1;;::::0;:21:::1;::::0;13224:18:1;;40316:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40521:7;::::0;:42:::1;::::0;;;;::::1;::::0;::::1;13251:25:1::0;;;40294:55:0;;-1:-1:-1;40384:296:0::1;::::0;40428:4;;40447:10;;40472:5;;40492:14;;40521:7:::1;::::0;;::::1;::::0;:29:::1;::::0;13224:18:1;;40521:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40578:7;::::0;:42:::1;::::0;;;;::::1;::::0;::::1;13251:25:1::0;;;40578:7:0::1;::::0;;::::1;::::0;:29:::1;::::0;13224:18:1;;40578:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40635:9;40659:10;40384:29;:296::i;:::-;28167:1:::0;29119:22;;40370:310;39972:716;-1:-1:-1;;;;;;;;39972:716:0:o;46081:434::-;46218:19;28211:1;28807:7;;:19;;28799:63;;;;;;;22107:2:1;28799:63:0;;;22089:21:1;22146:2;22126:18;;;22119:30;22185:33;22165:18;;;22158:61;22236:18;;28799:63:0;21905:355:1;28799:63:0;28211:1;28940:7;:18;;;;46255:4:::1;:12;;;46275:9;46255:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;46298:56:0::1;::::0;-1:-1:-1;;46298:34:0::1;46313:4;46298:34;::::0;-1:-1:-1;46333:9:0;;-1:-1:-1;46344:9:0::1;46298:34;:56::i;:::-;-1:-1:-1::0;46404:103:0::1;::::0;;46379:9:::1;22694:25:1::0;;;22750:2;22735:18;;22728:34;;;46404:103:0::1;22798:55:1::0;;;22778:18;;;22771:83;-1:-1:-1;22885:2:1;22870:18;;22863:50;;;22944:3;22929:19;;22922:51;46404:103:0;;46379:9;;46471:10:::1;::::0;46451:4:::1;46404:103:::0;;::::1;::::0;29413:42:::1;::::0;46404:103:::1;::::0;;;;;22681:3:1;46404:103:0;;::::1;28167:1:::0;29119:22;;46081:434;;-1:-1:-1;46081:434:0:o;26031:192::-;25177:7;25204:6;25351:23;25204:6;23946:10;25351:23;25343:68;;;;;;;20197:2:1;25343:68:0;;;20179:21:1;;;20216:18;;;20209:30;20275:34;20255:18;;;20248:62;20327:18;;25343:68:0;19995:356:1;25343:68:0;26120:22:::1;::::0;::::1;26112:73;;;::::0;::::1;::::0;;18132:2:1;26112:73:0::1;::::0;::::1;18114:21:1::0;18171:2;18151:18;;;18144:30;18210:34;18190:18;;;18183:62;18281:8;18261:18;;;18254:36;18307:19;;26112:73:0::1;17930:402:1::0;26112:73:0::1;26196:19;26206:8;26196:9;:19::i;:::-;26031:192:::0;:::o;41965:1804::-;42239:19;;;29413:42;42327:20;;;;:52;;42374:5;42327:52;;;42365:4;42327:52;42305:74;-1:-1:-1;42390:19:0;29413:42;42455:19;;;;42451:384;;;42512:15;42499:9;:28;42491:83;;;;;;;16896:2:1;42491:83:0;;;16878:21:1;16935:2;16915:18;;;16908:30;16974:34;16954:18;;;16947:62;17045:12;17025:18;;;17018:40;17075:19;;42491:83:0;16694:406:1;42491:83:0;42589:4;:12;;;42609:15;42589:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42685:4;42656:35;;42728:4;42706:27;;42451:384;;;-1:-1:-1;42780:4:0;;-1:-1:-1;42813:10:0;42451:384;42944:34;;;;;:21;11113:55:1;;;42944:34:0;;;11095:74:1;42918:23:0;;42944:21;;;;;;11068:18:1;;42944:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43016:37;;;;;43047:4;43016:37;;;11095:74:1;42918:60:0;;-1:-1:-1;42989:24:0;;43016:22;;;;;;11068:18:1;;43016:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42989:64;;43088:176;43110:11;;43136:8;;43159:11;43185:15;43215:12;43242:11;43088:7;:176::i;:::-;43074:190;-1:-1:-1;43403:33:0;43421:15;43403;:33;:::i;:::-;43365:34;;;;;:21;11113:55:1;;;43365:34:0;;;11095:74:1;43365:21:0;;;;;11068:18:1;;43365:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;43357:132;;;;;;;17715:2:1;43357:132:0;;;17697:21:1;17754:2;17734:18;;;17727:30;17793:34;17773:18;;;17766:62;17864:18;17844;;;17837:46;17900:19;;43357:132:0;17513:412:1;43357:132:0;43549:30;43568:11;43549:16;:30;:::i;:::-;43508:37;;;;;43539:4;43508:37;;;11095:74:1;43508:22:0;;;;;;11068:18:1;;43508:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;43500:137;;;;;;;21685:2:1;43500:137:0;;;21667:21:1;21724:2;21704:18;;;21697:30;21763:34;21743:18;;;21736:62;21834:23;21814:18;;;21807:51;21875:19;;43500:137:0;21483:417:1;43500:137:0;29413:42;43687:20;;;;43683:79;;;43724:26;;;;;;;;13251:25:1;;;43724:4:0;:13;;;;;13224:18:1;;43724:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43683:79;42265:1504;;;;;41965:1804;;;;;;;;;:::o;48240:777::-;48629:9;;;:195;;;;;:9;14575:15:1;;;48629:195:0;;;14557:34:1;;;;14627:15;;;14607:18;;;14600:43;14659:18;;;14652:34;;;14702:18;;;14695:34;;;14766:15;;;14745:19;;;14738:44;14819:15;;;14798:19;;;14791:44;14879:14;;14872:22;14851:19;;;14844:51;48530:22:0;;;;;;48629:9;;;:25;;14468:19:1;;48629:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48594:230;;-1:-1:-1;48594:230:0;-1:-1:-1;48839:7:0;;48835:140;;48863:100;48893:5;48917:3;48939:9;48863:11;:100::i;:::-;48992:17;49006:3;48992:11;:17;:::i;:::-;48985:24;48240:777;-1:-1:-1;;;;;;;;;;48240:777:0:o;19893:211::-;20037:58;;11787:42:1;11775:55;;20037:58:0;;;11757:74:1;11847:18;;;11840:34;;;20010:86:0;;20030:5;;20060:23;;11730:18:1;;20037:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20010:19;:86::i;:::-;19893:211;;;:::o;20112:248::-;20283:68;;11392:42:1;11461:15;;;20283:68:0;;;11443:34:1;11513:15;;11493:18;;;11486:43;11545:18;;;11538:34;;;20256:96:0;;20276:5;;20306:27;;11355:18:1;;20283:68:0;11180:398:1;20256:96:0;20112:248;;;;:::o;26231:173::-;26287:16;26306:6;;;26323:17;;;;;;;;;;26356:40;;26306:6;;;;;;;26356:40;;26287:16;26356:40;26276:128;26231:173;:::o;35191:3261::-;35551:19;;;29413:42;35658:20;;;;:52;;35705:5;35658:52;;;35696:4;35658:52;35636:74;-1:-1:-1;35725:19:0;29413:42;35802:19;;;;35798:410;;;35863:10;35850:9;:23;35842:78;;;;;;;16896:2:1;35842:78:0;;;16878:21:1;16935:2;16915:18;;;16908:30;16974:34;16954:18;;;16947:62;17045:12;17025:18;;;17018:40;17075:19;;35842:78:0;16694:406:1;35842:78:0;35939:4;:12;;;35959:10;35939:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36038:4;36009:35;;36085:4;36063:27;;35798:410;;;-1:-1:-1;36145:4:0;;-1:-1:-1;36182:10:0;35798:410;36325:34;;;;;:21;11113:55:1;;;36325:34:0;;;11095:74:1;36299:23:0;;36325:21;;;;;;11068:18:1;;36325:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36401:37;;;;;36432:4;36401:37;;;11095:74:1;36299:60:0;;-1:-1:-1;36374:24:0;;36401:22;;;;;;11068:18:1;;36401:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36374:64;;36481:219;36516:11;36546:10;36575:12;36606:10;36635:20;36674:11;36481:16;:219::i;:::-;36467:233;-1:-1:-1;36855:28:0;36873:10;36855:15;:28;:::i;:::-;36817:34;;;;;:21;11113:55:1;;;36817:34:0;;;11095:74:1;36817:21:0;;;;;11068:18:1;;36817:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;36809:127;;;;;;;17715:2:1;36809:127:0;;;17697:21:1;17754:2;17734:18;;;17727:30;17793:34;17773:18;;;17766:62;17864:18;17844;;;17837:46;17900:19;;36809:127:0;17513:412:1;36809:127:0;37000:30;37019:11;37000:16;:30;:::i;:::-;36959:37;;;;;36990:4;36959:37;;;11095:74:1;36959:22:0;;;;;;11068:18:1;;36959:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;36951:137;;;;;;;21685:2:1;36951:137:0;;;21667:21:1;21724:2;21704:18;;;21697:30;21763:34;21743:18;;;21736:62;21834:23;21814:18;;;21807:51;21875:19;;36951:137:0;21483:417:1;36951:137:0;35588:1512;;;;;37164:5;37149:20;;29413:42;37149:20;;;37145:79;;;37186:26;;;;;;;;13251:25:1;;;37186:4:0;:13;;;;;13224:18:1;;37186:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:79;37282:193;37320:4;37339:5;37359:10;37384:11;37410:10;37435:9;37459:5;37282:23;:193::i;:::-;37268:207;;37592:14;37577:11;:29;;37569:84;;;;;;;19786:2:1;37569:84:0;;;19768:21:1;19825:2;19805:18;;;19798:30;19864:34;19844:18;;;19837:62;19935:12;19915:18;;;19908:40;19965:19;;37569:84:0;19584:406:1;37569:84:0;29413:42;37668:20;;;;37664:327;;;37706:12;37724:9;:14;;37746:11;37724:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37705:57;;;37814:7;37806:69;;;;;;;19368:2:1;37806:69:0;;;19350:21:1;19407:2;19387:18;;;19380:30;19446:34;19426:18;;;19419:62;19517:19;19497:18;;;19490:47;19554:19;;37806:69:0;19166:413:1;37806:69:0;37690:197;37664:327;;;37937:42;:18;;;37956:9;37967:11;37937:18;:42::i;:::-;38031:10;38056:15;38052:107;;38100:7;;:47;;;;;:7;;;;;:13;;:47;;38114:10;;38126:20;;38100:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38088:59;;38052:107;38169:7;;:149;;;;;:7;15272:15:1;;;38169:149:0;;;15254:34:1;15324:15;;;15304:18;;;15297:43;15356:18;;;15349:34;;;15399:18;;;15392:34;;;15442:19;;;15435:35;;;38169:7:0;;;;:24;;15165:19:1;;38169:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38336:108:0;;;22694:25:1;;;22750:2;22735:18;;22728:34;;;38336:108:0;22798:55:1;;;22778:18;;;22771:83;38421:15:0;;;22885:2:1;22870:18;;22863:50;-1:-1:-1;22944:3:1;22929:19;;22922:51;38336:108:0;;38398:10;;38336:108;;;;;;;;;;;;;22681:3:1;38336:108:0;;;35577:2875;35191:3261;;;;;;;;;;:::o;40700:1253::-;40984:19;41084:15;40984:19;41110:836;41127:22;;;41110:836;;;41171:26;41221:22;41242:1;41221:11;:22;:::i;:::-;41216:1;:27;41212:265;;;-1:-1:-1;41285:12:0;41212:265;;;41391:3;41377:8;;41386:1;41377:11;;;;;;;:::i;:::-;;;;;;;41359:15;:29;;;;:::i;:::-;:35;;;;:::i;:::-;41338:56;-1:-1:-1;41428:33:0;41338:56;41428:12;:33;:::i;:::-;41413:48;;41212:265;41527:7;;41505:19;;41527:7;;:21;41549:11;;41561:1;41549:14;;;;;;;:::i;:::-;;;;;;;41527:37;;;;;;;;;;;;;13251:25:1;;13239:2;13224:18;;13105:177;41527:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41759:7;;:42;;;;;;;;13251:25:1;;;41505:59:0;;-1:-1:-1;41624:296:0;;41663:4;;41690:18;;41731:5;;41759:7;;;:29;;13224:18:1;;41759:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41824:7;;:42;;;;;;;;13251:25:1;;;41824:7:0;;;;;:29;;13224:18:1;;41824:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41889:12;41624:16;:296::i;:::-;41593:327;;:11;:327;:::i;:::-;41579:341;;41156:790;;41151:3;;;;;:::i;:::-;;;;41110:836;;;;41020:933;40700:1253;;;;;;;;;;:::o;49029:474::-;29413:42;49171:21;;;;49167:277;;;49210:12;49236:10;49228:24;;49260:4;49228:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49209:60;;;49321:7;49313:49;;;;;;;20558:2:1;49313:49:0;;;20540:21:1;20597:2;20577:18;;;20570:30;20636:31;20616:18;;;20609:59;20685:18;;49313:49:0;20356:353:1;49313:49:0;49194:180;49167:277;;;49395:37;:19;;;49415:10;49427:4;49395:19;:37::i;:::-;49478:10;49459:36;;49470:6;49459:36;;;49490:4;49459:36;;;;13251:25:1;;13239:2;13224:18;;13105:177;49459:36:0;;;;;;;;49029:474;;;:::o;22466:716::-;22890:23;22916:69;22944:4;22916:69;;;;;;;;;;;;;;;;;22924:5;22916:27;;;;:69;;;;;:::i;:::-;23000:17;;22890:95;;-1:-1:-1;23000:21:0;22996:179;;23097:10;23086:30;;;;;;;;;;;;:::i;:::-;23078:85;;;;;;;21274:2:1;23078:85:0;;;21256:21:1;21313:2;21293:18;;;21286:30;21352:34;21332:18;;;21325:62;21423:12;21403:18;;;21396:40;21453:19;;23078:85:0;21072:406:1;33255:1421:0;33671:17;;33629:10;;33535:19;;;;;33699:970;33720:10;33716:1;:14;33699:970;;;33758:6;;:43;;33774:20;33795:5;33799:1;33795;:5;:::i;:::-;33774:27;;;;;;;;:::i;:::-;;;;;;;33758:43;;;33767:4;33758:43;33752:49;-1:-1:-1;33828:14:0;33841:1;33828:10;:14;:::i;:::-;33823:1;:19;:53;;33853:20;33874:1;33853:23;;;;;;;;:::i;:::-;;;;;;;33823:53;;;33845:5;33823:53;33816:60;;33905:18;33926:10;33937:1;33926:13;;;;;;;;:::i;:::-;;;;;;;33905:34;;33954:19;33976:1;33981;33976:6;:66;;34000:42;33976:66;;;33985:12;33976:66;33954:88;-1:-1:-1;34057:17:0;34166:14;34179:1;34166:10;:14;:::i;:::-;34161:1;:19;34157:392;;;-1:-1:-1;34221:4:0;34157:392;;;34302:17;;34267:32;;34302:17;;:31;34334:10;34345:5;:1;34302:17;34345:5;:::i;:::-;34334:17;;;;;;;;:::i;:::-;;;;;;;34302:50;;;;;;;;;;;;;13251:25:1;;13239:2;13224:18;;13105:177;34302:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;-1:-1:-1;34377:15:0;34404:14;34417:1;34404:10;:14;:::i;:::-;34395:5;:1;34399;34395:5;:::i;:::-;:23;:61;;34429:20;34450:5;:1;34454;34450:5;:::i;:::-;34429:27;;;;;;;;:::i;:::-;;;;;;;34395:61;;;34421:5;34395:61;34487:46;;;;;:30;13568:15:1;;;34487:46:0;;;13550:34:1;13620:15;;;13600:18;;;13593:43;34377:79:0;;-1:-1:-1;34487:30:0;;;;;;13462:18:1;;34487:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:58;;34248:301;;34157:392;34579:78;34598:10;34610:3;34615:11;34628:4;34634:11;34647:9;34579:18;:78::i;:::-;34565:92;;33737:932;;;33732:3;;;;;:::i;:::-;;;;33699:970;;;;33561:1115;;;33255:1421;;;;;;;;:::o;12013:229::-;12150:12;12182:52;12204:6;12212:4;12218:1;12221:12;12182:21;:52::i;:::-;12175:59;;12013:229;;;;;;:::o;32264:979::-;32589:17;;:50;;;;;;;;13251:25:1;;;32498:7:0;;;;32589:17;;;;;:31;;13224:18:1;;32589:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;;32721:41;;;;;:30;13568:15:1;;;32721:41:0;;;13550:34:1;13620:15;;;13600:18;;;13593:43;32589:56:0;;-1:-1:-1;32696:22:0;;32721:30;;;;;13462:18:1;;32721:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32696:66;-1:-1:-1;32777:28:0;;;32800:4;32777:28;32773:260;;;32822:43;:16;;;32839:14;32855:9;32822:16;:43::i;:::-;32773:260;;;32887:57;;;;32883:150;;32961:60;:20;;;32982:11;32995:14;33011:9;32961:20;:60::i;:::-;33093:114;;;;;:18;13985:15:1;;;33093:114:0;;;13967:34:1;14037:15;;;14017:18;;;14010:43;14069:18;;;14062:34;;;14132:15;;;14112:18;;;14105:43;33072:18:0;;33093;;;;;;13878:19:1;;33093:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13133:511::-;13303:12;13361:5;13336:21;:30;;13328:81;;;;;;;18539:2:1;13328:81:0;;;18521:21:1;18578:2;18558:18;;;18551:30;18617:34;18597:18;;;18590:62;18688:8;18668:18;;;18661:36;18714:19;;13328:81:0;18337:402:1;13328:81:0;9530:20;;13420:60;;;;;;;20916:2:1;13420:60:0;;;20898:21:1;20955:2;20935:18;;;20928:30;20994:31;20974:18;;;20967:59;21043:18;;13420:60:0;20714:353:1;13420:60:0;13494:12;13508:23;13535:6;:11;;13554:5;13561:4;13535:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13493:73;;;;13584:52;13602:7;13611:10;13623:12;13584:17;:52::i;:::-;13577:59;13133:511;-1:-1:-1;;;;;;;13133:511:0:o;15602:712::-;15752:12;15781:7;15777:530;;;-1:-1:-1;15812:10:0;15805:17;;15777:530;15926:17;;:21;15922:374;;16124:10;16118:17;16185:15;16172:10;16168:2;16164:19;16157:44;15922:374;16267:12;16260:20;;;;;;;;;;;:::i;14:375:1:-;85:8;95:6;149:3;142:4;134:6;130:17;126:27;116:55;;167:1;164;157:12;116:55;-1:-1:-1;190:20:1;;233:18;222:30;;219:50;;;265:1;262;255:12;219:50;302:4;294:6;290:17;278:29;;362:3;355:4;345:6;342:1;338:14;330:6;326:27;322:38;319:47;316:67;;;379:1;376;369:12;316:67;14:375;;;;;:::o;394:164::-;470:13;;519;;512:21;502:32;;492:60;;548:1;545;538:12;492:60;394:164;;;:::o;563:159::-;663:13;;685:31;663:13;685:31;:::i;727:247::-;786:6;839:2;827:9;818:7;814:23;810:32;807:52;;;855:1;852;845:12;807:52;894:9;881:23;913:31;938:5;913:31;:::i;979:251::-;1049:6;1102:2;1090:9;1081:7;1077:23;1073:32;1070:52;;;1118:1;1115;1108:12;1070:52;1150:9;1144:16;1169:31;1194:5;1169:31;:::i;1235:989::-;1344:6;1375:2;1418;1406:9;1397:7;1393:23;1389:32;1386:52;;;1434:1;1431;1424:12;1386:52;1467:9;1461:16;1500:18;1492:6;1489:30;1486:50;;;1532:1;1529;1522:12;1486:50;1555:22;;1608:4;1600:13;;1596:27;-1:-1:-1;1586:55:1;;1637:1;1634;1627:12;1586:55;1666:2;1660:9;1689:68;1705:51;1753:2;1705:51;:::i;:::-;1689:68;:::i;:::-;1779:3;1803:2;1798:3;1791:15;1831:2;1826:3;1822:12;1815:19;;1862:2;1858;1854:11;1910:7;1905:2;1899;1896:1;1892:10;1888:2;1884:19;1880:28;1877:41;1874:61;;;1931:1;1928;1921:12;1874:61;1953:1;1944:10;;1963:231;1977:2;1974:1;1971:9;1963:231;;;2041:3;2035:10;2058:31;2083:5;2058:31;:::i;:::-;2102:18;;1995:1;1988:9;;;;;2140:12;;;;2172;;1963:231;;;-1:-1:-1;2213:5:1;1235:989;-1:-1:-1;;;;;;;1235:989:1:o;2229:1374::-;2424:6;2432;2440;2448;2456;2464;2472;2480;2488;2541:3;2529:9;2520:7;2516:23;2512:33;2509:53;;;2558:1;2555;2548:12;2509:53;2598:9;2585:23;2627:18;2668:2;2660:6;2657:14;2654:34;;;2684:1;2681;2674:12;2654:34;2723:78;2793:7;2784:6;2773:9;2769:22;2723:78;:::i;:::-;2820:8;;-1:-1:-1;2697:104:1;-1:-1:-1;2908:2:1;2893:18;;2880:32;;-1:-1:-1;2924:16:1;;;2921:36;;;2953:1;2950;2943:12;2921:36;;2992:80;3064:7;3053:8;3042:9;3038:24;2992:80;:::i;:::-;3091:8;;-1:-1:-1;2966:106:1;-1:-1:-1;;3176:2:1;3161:18;;3148:32;3189:31;3148:32;3189:31;:::i;:::-;3239:5;-1:-1:-1;3291:2:1;3276:18;;3263:32;;-1:-1:-1;3347:3:1;3332:19;;3319:33;3361;3319;3361;:::i;:::-;3413:7;-1:-1:-1;3467:3:1;3452:19;;3439:33;;-1:-1:-1;3524:3:1;3509:19;;3496:33;3538;3496;3538;:::i;:::-;3590:7;3580:17;;;2229:1374;;;;;;;;;;;:::o;3608:900::-;3703:6;3734:2;3777;3765:9;3756:7;3752:23;3748:32;3745:52;;;3793:1;3790;3783:12;3745:52;3826:9;3820:16;3859:18;3851:6;3848:30;3845:50;;;3891:1;3888;3881:12;3845:50;3914:22;;3967:4;3959:13;;3955:27;-1:-1:-1;3945:55:1;;3996:1;3993;3986:12;3945:55;4025:2;4019:9;4048:68;4064:51;4112:2;4064:51;:::i;4048:68::-;4138:3;4162:2;4157:3;4150:15;4190:2;4185:3;4181:12;4174:19;;4221:2;4217;4213:11;4269:7;4264:2;4258;4255:1;4251:10;4247:2;4243:19;4239:28;4236:41;4233:61;;;4290:1;4287;4280:12;4233:61;4312:1;4303:10;;4322:156;4336:2;4333:1;4330:9;4322:156;;;4393:10;;4381:23;;4354:1;4347:9;;;;;4424:12;;;;4456;;4322:156;;4513:202;4580:6;4633:2;4621:9;4612:7;4608:23;4604:32;4601:52;;;4649:1;4646;4639:12;4601:52;4672:37;4699:9;4672:37;:::i;4720:184::-;4790:6;4843:2;4831:9;4822:7;4818:23;4814:32;4811:52;;;4859:1;4856;4849:12;4811:52;-1:-1:-1;4882:16:1;;4720:184;-1:-1:-1;4720:184:1:o;4909:329::-;4991:6;4999;5052:2;5040:9;5031:7;5027:23;5023:32;5020:52;;;5068:1;5065;5058:12;5020:52;5107:9;5094:23;5126:31;5151:5;5126:31;:::i;:::-;5176:5;5228:2;5213:18;;;;5200:32;;-1:-1:-1;;;4909:329:1:o;5243:1388::-;5452:6;5460;5468;5476;5484;5492;5500;5508;5516;5569:3;5557:9;5548:7;5544:23;5540:33;5537:53;;;5586:1;5583;5576:12;5537:53;5625:9;5612:23;5644:31;5669:5;5644:31;:::i;:::-;5694:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;;-1:-1:-1;5802:2:1;5787:18;;5774:32;5815:33;5774:32;5815:33;:::i;:::-;5867:7;-1:-1:-1;5921:2:1;5906:18;;5893:32;;-1:-1:-1;5976:3:1;5961:19;;5948:33;6000:18;6030:14;;;6027:34;;;6057:1;6054;6047:12;6027:34;6096:78;6166:7;6157:6;6146:9;6142:22;6096:78;:::i;:::-;6193:8;;-1:-1:-1;6070:104:1;-1:-1:-1;6281:3:1;6266:19;;6253:33;;-1:-1:-1;6298:16:1;;;6295:36;;;6327:1;6324;6317:12;6295:36;;6366:80;6438:7;6427:8;6416:9;6412:24;6366:80;:::i;:::-;6465:8;;-1:-1:-1;6340:106:1;-1:-1:-1;;6552:3:1;6537:19;;6524:33;6566;6524;6566;:::i;6636:764::-;6768:6;6776;6784;6792;6800;6808;6861:3;6849:9;6840:7;6836:23;6832:33;6829:53;;;6878:1;6875;6868:12;6829:53;6917:9;6904:23;6936:31;6961:5;6936:31;:::i;:::-;6986:5;-1:-1:-1;7038:2:1;7023:18;;7010:32;;-1:-1:-1;7094:2:1;7079:18;;7066:32;7107:33;7066:32;7107:33;:::i;:::-;7159:7;-1:-1:-1;7213:2:1;7198:18;;7185:32;;-1:-1:-1;7264:3:1;7249:19;;7236:33;;-1:-1:-1;7321:3:1;7306:19;;7293:33;7335;7293;7335;:::i;:::-;7387:7;7377:17;;;6636:764;;;;;;;;:::o;8234:1210::-;8326:6;8357:2;8400;8388:9;8379:7;8375:23;8371:32;8368:52;;;8416:1;8413;8406:12;8368:52;8449:9;8443:16;8478:18;8519:2;8511:6;8508:14;8505:34;;;8535:1;8532;8525:12;8505:34;8558:22;;;;8614:4;8596:16;;;8592:27;8589:47;;;8632:1;8629;8622:12;8589:47;8658:22;;:::i;:::-;8711:2;8705:9;8739:2;8729:8;8726:16;8723:36;;;8755:1;8752;8745:12;8723:36;8778:17;;8826:4;8818:13;;8814:27;-1:-1:-1;8804:55:1;;8855:1;8852;8845:12;8804:55;8884:2;8878:9;8906:2;8902;8899:10;8896:36;;;8912:18;;:::i;:::-;8954:112;9062:2;8993:66;8986:4;8982:2;8978:13;8974:86;8970:95;8954:112;:::i;:::-;8941:125;;9089:2;9082:5;9075:17;9129:7;9124:2;9119;9115;9111:11;9107:20;9104:33;9101:53;;;9150:1;9147;9140:12;9101:53;9163:54;9214:2;9209;9202:5;9198:14;9193:2;9189;9185:11;9163:54;:::i;:::-;;;9240:5;9233;9226:20;9278:39;9313:2;9309;9305:11;9278:39;:::i;:::-;9273:2;9266:5;9262:14;9255:63;9350;9409:2;9405;9401:11;9350:63;:::i;:::-;9345:2;9334:14;;9327:87;9338:5;8234:1210;-1:-1:-1;;;;;;8234:1210:1:o;9449:180::-;9508:6;9561:2;9549:9;9540:7;9536:23;9532:32;9529:52;;;9577:1;9574;9567:12;9529:52;-1:-1:-1;9600:23:1;;9449:180;-1:-1:-1;9449:180:1:o;9823:315::-;9891:6;9899;9952:2;9940:9;9931:7;9927:23;9923:32;9920:52;;;9968:1;9965;9958:12;9920:52;10004:9;9991:23;9981:33;;10064:2;10053:9;10049:18;10036:32;10077:31;10102:5;10077:31;:::i;:::-;10127:5;10117:15;;;9823:315;;;;;:::o;10143:312::-;10222:6;10230;10283:2;10271:9;10262:7;10258:23;10254:32;10251:52;;;10299:1;10296;10289:12;10251:52;10328:9;10322:16;10312:26;;10381:2;10370:9;10366:18;10360:25;10394:31;10419:5;10394:31;:::i;10460:274::-;10589:3;10627:6;10621:13;10643:53;10689:6;10684:3;10677:4;10669:6;10665:17;10643:53;:::i;:::-;10712:16;;;;;10460:274;-1:-1:-1;;10460:274:1:o;11885:1215::-;12167:2;12179:21;;;12249:13;;12152:18;;;12271:22;;;12119:4;;12346;;12324:2;12309:18;;;12373:15;;;12119:4;12416:169;12430:6;12427:1;12424:13;12416:169;;;12491:13;;12479:26;;12525:12;;;;12560:15;;;;12452:1;12445:9;12416:169;;;-1:-1:-1;;;12621:19:1;;;12601:18;;;12594:47;12691:13;;12713:21;;;12789:15;;;;12752:12;;;12824:1;12834:238;12850:8;12845:3;12842:17;12834:238;;;12923:15;;12940:42;12919:64;12905:79;;13045:17;;;;13006:14;;;;12878:1;12869:11;12834:238;;;-1:-1:-1;13089:5:1;;11885:1215;-1:-1:-1;;;;;;;11885:1215:1:o;16247:442::-;16396:2;16385:9;16378:21;16359:4;16428:6;16422:13;16471:6;16466:2;16455:9;16451:18;16444:34;16487:66;16546:6;16541:2;16530:9;16526:18;16521:2;16513:6;16509:15;16487:66;:::i;:::-;16605:2;16593:15;16610:66;16589:88;16574:104;;;;16680:2;16570:113;;16247:442;-1:-1:-1;;16247:442:1:o;22984:253::-;23056:2;23050:9;23098:4;23086:17;;23133:18;23118:34;;23154:22;;;23115:62;23112:88;;;23180:18;;:::i;:::-;23216:2;23209:22;22984:253;:::o;23242:334::-;23313:2;23307:9;23369:2;23359:13;;23374:66;23355:86;23343:99;;23472:18;23457:34;;23493:22;;;23454:62;23451:88;;;23519:18;;:::i;:::-;23555:2;23548:22;23242:334;;-1:-1:-1;23242:334:1:o;23581:191::-;23649:4;23682:18;23674:6;23671:30;23668:56;;;23704:18;;:::i;:::-;-1:-1:-1;23749:1:1;23745:14;23761:4;23741:25;;23581:191::o;23777:128::-;23817:3;23848:1;23844:6;23841:1;23838:13;23835:39;;;23854:18;;:::i;:::-;-1:-1:-1;23890:9:1;;23777:128::o;23910:274::-;23950:1;23976;23966:189;;24011:77;24008:1;24001:88;24112:4;24109:1;24102:15;24140:4;24137:1;24130:15;23966:189;-1:-1:-1;24169:9:1;;23910:274::o;24189:228::-;24229:7;24355:1;24287:66;24283:74;24280:1;24277:81;24272:1;24265:9;24258:17;24254:105;24251:131;;;24362:18;;:::i;:::-;-1:-1:-1;24402:9:1;;24189:228::o;24422:125::-;24462:4;24490:1;24487;24484:8;24481:34;;;24495:18;;:::i;:::-;-1:-1:-1;24532:9:1;;24422:125::o;24552:258::-;24624:1;24634:113;24648:6;24645:1;24642:13;24634:113;;;24724:11;;;24718:18;24705:11;;;24698:39;24670:2;24663:10;24634:113;;;24765:6;24762:1;24759:13;24756:48;;;-1:-1:-1;;24800:1:1;24782:16;;24775:27;24552:258::o;24815:195::-;24854:3;24885:66;24878:5;24875:77;24872:103;;;24955:18;;:::i;:::-;-1:-1:-1;25002:1:1;24991:13;;24815:195::o;25015:184::-;25067:77;25064:1;25057:88;25164:4;25161:1;25154:15;25188:4;25185:1;25178:15;25204:184;25256:77;25253:1;25246:88;25353:4;25350:1;25343:15;25377:4;25374:1;25367:15;25393:184;25445:77;25442:1;25435:88;25542:4;25539:1;25532:15;25566:4;25563:1;25556:15;25582:154;25668:42;25661:5;25657:54;25650:5;25647:65;25637:93;;25726:1;25723;25716:12

Swarm Source

ipfs://1f3d880f21e4cd8566afa653a25496e4fb8ae0cb206cad16bee3282d04bf4918
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.