Contract 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a

 

Contract Overview

Balance:
0.90105524 BNB

BNB Value:
$579.96 (@ $643.64/BNB)

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0x69ff7e6b8eccf23be3e1e7341f8bcac08616f14eb076d086056f489bea288687(pending)2021-05-06 13:06:213 secs ago0x3c4cb0ea1a2f0b3946517f79af84bfc8bd1b2ad1 IN 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB(Pending)
0xac7c6b38cca2b7f56b2017930360ce42152eb4e4d1efd9fc1d8c08ac3ad1703f(pending)2021-05-06 13:06:213 secs ago0x3ec0b82892d48878eca35a5541372834980cfd0c IN 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a1.279 BNB(Pending)
0x1583f2cafb652de7523dfd72f00c0a3c1965036f3b6aa404c9695f61a2ef674f71867452021-05-06 13:06:0024 secs ago0x639e43f5b44b3c1e8c841cb28d942437337c5c89 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.23 BNB0.000833205
0xce547778bb8a681866273b559ba8d12dc01658fa00c118d41bb33971557420fa71867432021-05-06 13:05:5331 secs ago0xa4ef3e3ca7714405bba0b9600e137c553449756e IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001631155
0x4b6542b9dc893cb64a075ce19c6a7b490159c7ddb7f96b53ba9031c875ee31d871867432021-05-06 13:05:5331 secs ago0xcb6d69bb2087d81371b949d3bddea31e16bfb04a IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.002360255
0xaef3b910283949f4f6ed97e49499a539affea9f55cbd6be27e4655ed8e56640871867432021-05-06 13:05:5331 secs ago0x48e9ba3321ec917206fbecd98e068b83602d2d84 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169465
0xbd845436a822207ae4cf0bc514496b77c5c7bb24e7ddbad0f2ba72d817ad3a2e71867432021-05-06 13:05:5331 secs ago0x48e9ba3321ec917206fbecd98e068b83602d2d84 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001498055
0xcbcec275b88846cfee9996149ed1ebc45898392288d0ee706b276eeb5566c84971867432021-05-06 13:05:5331 secs ago0x5429a363847387af8b5fdf229c592c9134a82017 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00110832
0x8b6a6cf6b5f24bcec39640916592069fba702ab22fe6134336f56720a75b2e1871867402021-05-06 13:05:4440 secs ago0x22b805f65c513f8762710619bba4a259d0eb885b IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169725
0x671be533cedb907a50421ffd6f193185117e4caca1d7805acf2e0241bdfce2bb71867402021-05-06 13:05:4440 secs ago0x22b805f65c513f8762710619bba4a259d0eb885b IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001429035
0x30f67a86fd2ee737788f0e97b4f005afdb4c8299b04799442c730e2126cec87371867392021-05-06 13:05:3747 secs ago0x9f269abc3d73b6d2040bb25d3fcd2281928ca688 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00141079
0x7d7b9977977ec80069909edaf5cd0de2e4dd38ff3379c2b9ae3d64d07ba00b9171867382021-05-06 13:05:3450 secs ago0x3444bd72cd5d8ad17493ac7d81e1a9a8b7ab8aa5 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a1.454644225 BNB0.000773125
0x2d559f2bb314c98203f2ed7de9a4f9ad3989ee4df9f66deebaebb56540d9605c71867382021-05-06 13:05:3450 secs ago0x6dacdbbcdd5561990ac7d25f40b24a965bcca084 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169725
0xa9832dac91580831c934b029da0d86f29ae33030d03e509ed61068fcc5a15bd671867382021-05-06 13:05:3450 secs ago0x6dacdbbcdd5561990ac7d25f40b24a965bcca084 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001368955
0xd222cb8c0a963cf09dc8b492a5de0b24560593cf4cb416491ff5169f00e6c80171867382021-05-06 13:05:3450 secs ago0x6dacdbbcdd5561990ac7d25f40b24a965bcca084 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00167739
0x6fdabf95a04fddf704f46045973e12421fb469e861c1bda9921034402b0945d671867382021-05-06 13:05:3450 secs ago0x675d7f441154f73558c96dacb72c5af54b8d983d IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001626815
0x36eb8d283d0068f8a5ab2f8699b98f10a90ca4ec7464ffa2d1b11711e5c9a1b671867372021-05-06 13:05:3153 secs ago0x274769ae4bec95876c37f267f3c9783b0d04ad9c IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00153698
0x86ed4e1cfff2f3ace578f8b65c900c7a44c72d4aa150eeedecf15d32762dc66971867372021-05-06 13:05:3153 secs ago0xd3b6340518d15a421e7e03fcc8a641d97f1d6f60 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00103025
0x98019296293254aba65c2f5e70a61172886f0ada8f8a28a968f6dba1b931a38271867372021-05-06 13:05:3153 secs ago0x29960b7c9fce3a6cac8b280bc004b745e92fc939 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001368955
0x165a43e27a3b87290bea67e80a893e28a64ea05e67afdad44bec5bafba2f3f5a71867372021-05-06 13:05:3153 secs ago0x0c42d2a6793f9ecd354ab64e26ddf1ddf284bf50 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.074625 BNB0.00094648
0x4ff3c11e39daf22c625699c482489410b36e41d8eb6c9bd6506a1ef4aa9c1ab671867372021-05-06 13:05:3153 secs ago0x5b2f484d5dc7e9a9a4c5392871ab9c8ecfa719b9 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00152739
0x8dd9aabaebdf3a6b13e54125953b16f5602b6cdfc4ec5b58bd0ec1905635d86a71867362021-05-06 13:05:2856 secs ago0xa069de1c5a6473120aa38aa11f954fbb1c1da56f IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001557895
0x3dd11c76852faac1e0c1582c6b859a44406551efabe12e0a89623b38f4ded9a671867352021-05-06 13:05:231 min ago0xcb31926ffb1b0b0496b698c78d28bae4cc294b09 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a1.9 BNB0.00093156
0x4d3047e0c8edab328d127845f30eb3a2ff9d9a0199d6a815c5375fcf00f4758971867332021-05-06 13:05:171 min ago0xaff634b53f94366854e5d4333ca21b3da47a8e61 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00160227
0x290ee3a83d2447a69d778058cd602d86850ba551a806cafe89318827b212650c71867332021-05-06 13:05:171 min ago0x229afb59b864d0b76ce381bd2e00b5583caaef8e IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.969259369301757 BNB0.002197245
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1583f2cafb652de7523dfd72f00c0a3c1965036f3b6aa404c9695f61a2ef674f71867452021-05-06 13:06:0024 secs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.23 BNB
0xbd845436a822207ae4cf0bc514496b77c5c7bb24e7ddbad0f2ba72d817ad3a2e71867432021-05-06 13:05:5331 secs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0x48e9ba3321ec917206fbecd98e068b83602d2d8412.043018327877545712 BNB
0xbd845436a822207ae4cf0bc514496b77c5c7bb24e7ddbad0f2ba72d817ad3a2e71867432021-05-06 13:05:5331 secs ago PancakeSwap: Router v2 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a12.043018327877545712 BNB
0x7d7b9977977ec80069909edaf5cd0de2e4dd38ff3379c2b9ae3d64d07ba00b9171867382021-05-06 13:05:3450 secs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d1.454644225 BNB
0x165a43e27a3b87290bea67e80a893e28a64ea05e67afdad44bec5bafba2f3f5a71867372021-05-06 13:05:3153 secs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.074625 BNB
0x8dd9aabaebdf3a6b13e54125953b16f5602b6cdfc4ec5b58bd0ec1905635d86a71867362021-05-06 13:05:2856 secs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xa069de1c5a6473120aa38aa11f954fbb1c1da56f0.018368961608809178 BNB
0x8dd9aabaebdf3a6b13e54125953b16f5602b6cdfc4ec5b58bd0ec1905635d86a71867362021-05-06 13:05:2856 secs ago PancakeSwap: Router v2 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.018368961608809178 BNB
0x3dd11c76852faac1e0c1582c6b859a44406551efabe12e0a89623b38f4ded9a671867352021-05-06 13:05:231 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d1.9 BNB
0x290ee3a83d2447a69d778058cd602d86850ba551a806cafe89318827b212650c71867332021-05-06 13:05:171 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0235910cd3017178f69db8ea98c43f3764cb69780.77540749544140625 BNB
0x290ee3a83d2447a69d778058cd602d86850ba551a806cafe89318827b212650c71867332021-05-06 13:05:171 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x3bc7e56ca9c11060eda4b10e3f7e6ade28215d530.193851873860351563 BNB
0x4f0f917053c1fafc891c55b98273343bd04306575fd948a9e321dbcdf1e3cee671867322021-05-06 13:05:121 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x878a11ac067e0f19069716a9463ec1deb8dd98c70.2 BNB
0x9324077a27c513a7aa731436d58381135260b009bd8309e098e3e0e0c28cbfba71867292021-05-06 13:05:011 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d12 BNB
0x47cd6df5ef510f44cb8cc89592bc7332611bc8b35c10d02c4e30bb673c54092971867292021-05-06 13:05:011 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.724883987500000001 BNB
0x6d415d21a9a6070430a789470939b185f1f2041ffc1c2fe644da18764a183ed271867282021-05-06 13:04:581 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x3bc7e56ca9c11060eda4b10e3f7e6ade28215d530.2 BNB
0x7388bd5fc56c37a12b97cddcc4d6c7946ccd61210e3ad3e476539fdeecdac0d471867262021-05-06 13:04:501 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.1 BNB
0xf41909823765600643d75e52e960fe4a3a8f4d77338dd34c5f8d71c5fa1b816d71867252021-05-06 13:04:461 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x814180b140d33cc890a704c96b19ccbd731c36130.19 BNB
0x1f08b75c3c7b2794d1b9169e9e37f604614418b4466aa79c9bac7a8040a3c72d71867232021-05-06 13:04:331 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x814180b140d33cc890a704c96b19ccbd731c36131.1 BNB
0xf8781ae88c24a777f85bba9a1990c7a94d40b0920f98f80dd064db332c9edb3071867212021-05-06 13:04:261 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x1fabd0f3732b9d007e374c457c095566a8657f4e0.0178 BNB
0xf8781ae88c24a777f85bba9a1990c7a94d40b0920f98f80dd064db332c9edb3071867212021-05-06 13:04:261 min ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0235910cd3017178f69db8ea98c43f3764cb69780.0178 BNB
0x6a1ddf72999cde0cf890cb5a488ea777929ddd8db9180bab4e9b4dc93d2376a471867162021-05-06 13:04:082 mins ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d5.178133866436582203 BNB
0x7daa1878b1988a4aa2a94e9a85cc41dbc97eb9bac7194f71d92cf7cda0d0d49871867162021-05-06 13:04:082 mins ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.16 BNB
0x25f3655415e2381fd215ad0fc7fc45553189fa018ed8f2f79c09bb590f0bee7271867162021-05-06 13:04:082 mins ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x814180b140d33cc890a704c96b19ccbd731c36130.10287890875 BNB
0x7b5db23ce3d25a2e584bf594f90e17317b1b4ee38a21d797e7e38f53cd158a7671867132021-05-06 13:03:592 mins ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0x4e941480748583357c2064a8387627acab8f89c20.064187182880184224 BNB
0x7b5db23ce3d25a2e584bf594f90e17317b1b4ee38a21d797e7e38f53cd158a7671867132021-05-06 13:03:592 mins ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.000064251434314498 BNB
0x7b5db23ce3d25a2e584bf594f90e17317b1b4ee38a21d797e7e38f53cd158a7671867132021-05-06 13:03:592 mins ago PancakeSwap: Router v2 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.064251434314498722 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xc660a974b70889e53d64df199adfb4a258b33194

Contract Name:
WardenSwap

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-15
*/

// SPDX-License-Identifier: MIT

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

// Sources flattened with hardhat v2.0.11 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.5.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].
 *
 * _Since v2.5.0:_ this module is now much more gas efficient, given net gas
 * metering changes introduced in the Istanbul hardfork.
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial 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 percetange 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.
        _notEntered = true;
    }

    /**
     * @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(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

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


// File @openzeppelin/contracts/math/[email protected]

pragma solidity ^0.5.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
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 @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.5.5;

/**
 * @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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.5.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 ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    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));
    }

    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'
        // solhint-disable-next-line max-line-length
        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).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/GSN/[email protected]

pragma solidity ^0.5.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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/ownership/[email protected]

pragma solidity ^0.5.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.
 *
 * 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.
 */
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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/interfaces/IWardenTradingRoute.sol

pragma solidity 0.5.17;

/**
 * @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
    * @return _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
    )
        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
        view
        returns(uint256 _destAmount);

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


// File contracts/RoutingManagement.sol

pragma solidity 0.5.17;


contract RoutingManagement is Ownable {
    /**
    * @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 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
    );

    Route[] public tradingRoutes; // list of trading routes

    modifier onlyTradingRouteEnabled(uint _index) {
        require(tradingRoutes[_index].enable == true, "This trading route is disabled");
        _;
    }

    modifier onlyTradingRouteDisabled(uint _index) {
        require(tradingRoutes[_index].enable == false, "This trading route is enabled");
        _;
    }

    /**
    * @dev Function for adding new trading route
    * @param _name Name of trading route.
    * @param _routingAddress The address of trading route.
    * @return length of trading routes.
    */
    function addTradingRoute(
        string memory _name,
        IWardenTradingRoute _routingAddress
    )
      public
      onlyOwner
    {
        tradingRoutes.push(Route({
            name: _name,
            enable: true,
            route: _routingAddress
        }));
        emit AddedTradingRoute(msg.sender, _name, _routingAddress, tradingRoutes.length - 1);
    }

    /**
    * @dev Function for disable trading route by index
    * @param _index The uint256 of trading route index.
    * @return length of trading routes.
    */
    function disableTradingRoute(
        uint256 _index
    )
        public
        onlyOwner
        onlyTradingRouteEnabled(_index)
    {
        tradingRoutes[_index].enable = false;
        emit DisabledTradingRoute(msg.sender, tradingRoutes[_index].name, tradingRoutes[_index].route, _index);
    }

    /**
    * @dev Function for enale trading route by index
    * @param _index The uint256 of trading route index.
    * @return length of trading routes.
    */
    function enableTradingRoute(
        uint256 _index
    )
        public
        onlyOwner
        onlyTradingRouteDisabled(_index)
    {
        tradingRoutes[_index].enable = true;
        emit EnabledTradingRoute(msg.sender, tradingRoutes[_index].name, tradingRoutes[_index].route, _index);
    }

    /**
    * @dev Function for get amount of trading route
    * @return Amount of trading routes.
    */
    function allRoutesLength() public view returns (uint256) {
        return tradingRoutes.length;
    }

    /**
    * @dev Function for get enable status of trading route
    * @param _index The uint256 of trading route index.
    * @return enable status of trading route.
    */
    function isTradingRouteEnabled(uint256 _index) public view returns (bool) {
        return tradingRoutes[_index].enable;
    }
}


// File contracts/Partnership.sol

pragma solidity 0.5.17;



/*
* Fee collection by partner reference
*/
contract Partnership is RoutingManagement {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /**
    * @dev Platform Fee collection
    * @param partnerIndex Partner or Wallet provider that integrate to Warden
    * @param token Token address
    * @param wallet Partner or Wallet provider wallet
    * @param amount Fee amount
    */
    event CollectFee(
      uint256 indexed partnerIndex,
      IERC20   indexed token,
      address indexed wallet,
      uint256         amount
    );

    /**
    * @dev Updating partner info
    * @param index Partner index
    * @param wallet Partner wallet
    * @param fee Fee in bps
    * @param name partner name
    */
    event UpdatePartner(
      uint256 indexed index,
      address indexed wallet,
      uint16 fee,
      bytes16 name
    );

    struct Partner {
      address wallet;       // To receive fee on the Warden Swap network
      uint16 fee;           // fee in bps
      bytes16 name;         // Partner reference
    }

    IERC20 public constant etherERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    mapping(uint256 => Partner) public partners;

    constructor() public {
        Partner memory partner = Partner(msg.sender, 10, "WARDEN"); // 0.1%
        partners[0] = partner;
        emit UpdatePartner(0, msg.sender, 10, "WARDEN");
    }

    function updatePartner(uint256 index, address wallet, uint16 fee, bytes16 name)
        external
        onlyOwner
    {
        require(fee <= 100, "fee: no more than 1%");
        Partner memory partner = Partner(wallet, fee, name);
        partners[index] = partner;
        emit UpdatePartner(index, wallet, fee, name);
    }

    function _amountWithFee(uint256 amount, uint256 partnerIndex)
        internal
        view
        returns(uint256 remainingAmount)
    {
        Partner storage partner = partners[partnerIndex];
        if (partner.wallet == 0x0000000000000000000000000000000000000000) {
          partner = partners[0];
        }
        if (partner.fee == 0) {
            return amount;
        }
        uint256 fee = amount.mul(partner.fee).div(10000);
        return amount.sub(fee);
    }

    function _collectFee(uint256 partnerIndex, uint256 amount, IERC20 token)
        internal
        returns(uint256 remainingAmount)
    {
        Partner storage partner = partners[partnerIndex];
        if (partner.wallet == 0x0000000000000000000000000000000000000000) {
            partnerIndex = 0;
            partner = partners[0];
        }
        if (partner.fee == 0) {
            return amount;
        }
        uint256 fee = amount.mul(partner.fee).div(10000);
        require(fee < amount, "fee exceeds return amount!");
        if (etherERC20 == token) {
            (bool success, ) = partner.wallet.call.value(fee)(""); // Send back ether to sender
            require(success, "Transfer fee of ether failed.");
        } else {
            token.safeTransfer(partner.wallet, fee);
        }
        emit CollectFee(partnerIndex, token, partner.wallet, fee);

        return amount.sub(fee);
    }
}


// File contracts/WardenSwap.sol

pragma solidity 0.5.17;

contract WardenTokenPriviledge is Partnership {
    uint256 public eligibleAmount = 10 ether; // 10 WAD
    IERC20 public wardenToken;

    event UpdateWardenToken(IERC20 indexed token);
    event UpdateEligibleAmount(uint256 amount);

    function updateWardenToken(
        IERC20  token
    )
        public
        onlyOwner
    {
        wardenToken = token;
        emit UpdateWardenToken(token);
    }

    function updateEligibleAmount(
        uint256  amount
    )
        public
        onlyOwner
    {
        eligibleAmount = amount;
        emit UpdateEligibleAmount(amount);
    }

    function isEligibleForFreeTrade(address user)
        public
        view
        returns (bool)
    {
        if (address(wardenToken) == 0x0000000000000000000000000000000000000000) {
            return false;
        }
        return wardenToken.balanceOf(user) >= eligibleAmount;
    }
}

contract WardenSwap is WardenTokenPriviledge, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /**
    * @dev when new trade occure (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
    );

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between Ether to token by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @return amount of actual destination tokens
    */
    function _tradeEtherToToken(
        uint256 tradingRouteIndex,
        uint256 srcAmount,
        IERC20 dest
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Trade to route
        uint256 destAmount = tradingRoute.trade.value(srcAmount)(
            etherERC20,
            dest,
            srcAmount
        );
        return destAmount;
    }

    // Receive ETH in case of trade Token -> ETH, will get ETH back from trading route
    function () external payable {}

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between token to Ether by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @return amount of actual destination tokens
    */
    function _tradeTokenToEther(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Approve to TradingRoute
        src.safeApprove(address(tradingRoute), srcAmount);
        // Trande to route
        uint256 destAmount = tradingRoute.trade(
            src,
            etherERC20,
            srcAmount
        );
        return destAmount;
    }

    /**
    * @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
    * @return amount of actual destination tokens
    */
    function _tradeTokenToToken(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Approve to TradingRoute
        src.safeApprove(address(tradingRoute), srcAmount);
        // Trande to route
        uint256 destAmount = tradingRoute.trade(
            src,
            dest,
            srcAmount
        );
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token by tradingRouteIndex
    * Ex1: trade 0.5 ETH -> DAI
    * 0, "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "500000000000000000", "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "21003850000000000000"
    * Ex2: trade 30 DAI -> ETH
    * 0, "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "30000000000000000000", "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "740825000000000000"
    * @param _tradingRouteIndex index of trading route
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @return amount of actual destination tokens
    */
    function _trade(
        uint256             _tradingRouteIndex,
        IERC20              _src,
        uint256             _srcAmount,
        IERC20              _dest
    )
        private
        onlyTradingRouteEnabled(_tradingRouteIndex)
        returns(uint256)
    {
        // Destination amount
        uint256 destAmount;
        // Record src/dest asset for later consistency check.
        uint256 srcAmountBefore;
        uint256 destAmountBefore;

        if (etherERC20 == _src) { // Source
            srcAmountBefore = address(this).balance;
        } else {
            srcAmountBefore = _src.balanceOf(address(this));
        }
        if (etherERC20 == _dest) { // Dest
            destAmountBefore = address(this).balance;
        } else {
            destAmountBefore = _dest.balanceOf(address(this));
        }
        if (etherERC20 == _src) { // Trade ETH -> Token
            destAmount = _tradeEtherToToken(_tradingRouteIndex, _srcAmount, _dest);
        } else if (etherERC20 == _dest) { // Trade Token -> ETH
            destAmount = _tradeTokenToEther(_tradingRouteIndex, _src, _srcAmount);
        } else { // Trade Token -> Token
            destAmount = _tradeTokenToToken(_tradingRouteIndex, _src, _srcAmount, _dest);
        }

        // Recheck if src/dest amount correct
        if (etherERC20 == _src) { // Source
            require(address(this).balance == srcAmountBefore.sub(_srcAmount), "source amount mismatch after trade");
        } else {
            require(_src.balanceOf(address(this)) == srcAmountBefore.sub(_srcAmount), "source amount mismatch after trade");
        }
        if (etherERC20 == _dest) { // Dest
            require(address(this).balance == destAmountBefore.add(destAmount), "destination amount mismatch after trade");
        } else {
            require(_dest.balanceOf(address(this)) == destAmountBefore.add(destAmount), "destination amount mismatch after trade");
        }
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token by tradingRouteIndex
    * Ex1: trade 0.5 ETH -> DAI
    * 0, "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "500000000000000000", "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "21003850000000000000"
    * Ex2: trade 30 DAI -> ETH
    * 0, "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "30000000000000000000", "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "740825000000000000"
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @param minDestAmount minimun destination amount
    * @param partnerIndex index of partnership for revenue sharing
    * @return amount of actual destination tokens
    */
    function trade(
        uint256   tradingRouteIndex,
        IERC20    src,
        uint256   srcAmount,
        IERC20    dest,
        uint256   minDestAmount,
        uint256   partnerIndex
    )
        external
        payable
        nonReentrant
        returns(uint256)
    {
        uint256 destAmount;
        // Prepare source's asset
        if (etherERC20 != src) {
            src.safeTransferFrom(msg.sender, address(this), srcAmount); // Transfer token to this address
        }
        // Trade to route
        destAmount = _trade(tradingRouteIndex, src, srcAmount, dest);
        if (!isEligibleForFreeTrade(msg.sender)) {
            destAmount = _collectFee(partnerIndex, destAmount, dest);
        }

        // Throw exception if destination amount doesn't meet user requirement.
        require(destAmount >= minDestAmount, "destination amount is too low.");
        if (etherERC20 == dest) {
            (bool success, ) = msg.sender.call.value(destAmount)(""); // Send back ether to sender
            require(success, "Transfer ether back to caller failed.");
        } else { // Send back token to sender
            dest.safeTransfer(msg.sender, destAmount);
        }

        emit Trade(address(src), srcAmount, address(dest), destAmount, msg.sender);
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade with split volumes to multiple-routes ex. UNI -> ETH (5%, 15% and 80%)
    * @param routes Trading paths
    * @param src Source token
    * @param srcAmounts amount of source tokens
    * @param dest Destination token
    * @param minDestAmount minimun destination amount
    * @param partnerIndex index of partnership for revenue sharing
    * @return amount of actual destination tokens
    */
    function splitTrades(
        uint256[] calldata routes,
        IERC20    src,
        uint256   totalSrcAmount,
        uint256[] calldata srcAmounts,
        IERC20    dest,
        uint256   minDestAmount,
        uint256   partnerIndex
    )
        external
        payable
        nonReentrant
        returns(uint256)
    {
        require(routes.length > 0, "routes can not be empty");
        require(routes.length == srcAmounts.length, "routes and srcAmounts lengths mismatch");
        uint256 destAmount = 0;
        // Prepare source's asset
        if (etherERC20 != src) {
            src.safeTransferFrom(msg.sender, address(this), totalSrcAmount); // Transfer token to this address
        }
        // Trade with routes
        for (uint i = 0; i < routes.length; i++) {
            uint256 tradingRouteIndex = routes[i];
            uint256 amount = srcAmounts[i];
            destAmount = destAmount.add(_trade(tradingRouteIndex, src, amount, dest));
        }

        // Collect fee
        if (!isEligibleForFreeTrade(msg.sender)) {
            destAmount = _collectFee(partnerIndex, destAmount, dest);
        }

        // Throw exception if destination amount doesn't meet user requirement.
        require(destAmount >= minDestAmount, "destination amount is too low.");
        if (etherERC20 == dest) {
            (bool success, ) = msg.sender.call.value(destAmount)(""); // Send back ether to sender
            require(success, "Transfer ether back to caller failed.");
        } else { // Send back token to sender
            dest.safeTransfer(msg.sender, destAmount);
        }

        emit Trade(address(src), totalSrcAmount, address(dest), destAmount, msg.sender);
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev get amount of destination token for given source token amount
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param dest Destination token
    * @param srcAmount amount of source tokens
    * @return amount of actual destination tokens
    */
    function getDestinationReturnAmount(
        uint256 tradingRouteIndex,
        IERC20  src,
        IERC20  dest,
        uint256 srcAmount,
        uint256 partnerIndex
    )
        external
        view
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        uint256 destAmount = tradingRoute.getDestinationReturnAmount(src, dest, srcAmount);
        return _amountWithFee(destAmount, partnerIndex);
    }

    function getDestinationReturnAmountForSplitTrades(
        uint256[] calldata routes,
        IERC20    src,
        uint256[] calldata srcAmounts,
        IERC20    dest,
        uint256   partnerIndex
    )
        external
        view
        returns(uint256)
    {
        require(routes.length > 0, "routes can not be empty");
        require(routes.length == srcAmounts.length, "routes and srcAmounts lengths mismatch");
        uint256 destAmount = 0;
        
        for (uint i = 0; i < routes.length; i++) {
            uint256 tradingRouteIndex = routes[i];
            uint256 amount = srcAmounts[i];
            // Load trading route
            IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
            destAmount = destAmount.add(tradingRoute.getDestinationReturnAmount(src, dest, amount));
        }
        return _amountWithFee(destAmount, partnerIndex);
    }

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

    // In case of expected and unexpected event that have some ether amounts remain in this contract, owner can call to collect them.
    function collectRemainingEther(
        uint256 amount
    )
      public
      onlyOwner
    {
        (bool success, ) = msg.sender.call.value(amount)(""); // Send back ether to sender
        require(success, "Transfer ether back to caller failed.");
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addedBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AddedTradingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"partnerIndex","type":"uint256"},{"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":"disabledBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"DisabledTradingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"enabledBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"EnabledTradingRoute","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"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateEligibleAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint16","name":"fee","type":"uint16"},{"indexed":false,"internalType":"bytes16","name":"name","type":"bytes16"}],"name":"UpdatePartner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"}],"name":"UpdateWardenToken","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"contract IWardenTradingRoute","name":"_routingAddress","type":"address"}],"name":"addTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allRoutesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"disableTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eligibleAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"enableTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"etherERC20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tradingRouteIndex","type":"uint256"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"getDestinationReturnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"routes","type":"uint256[]"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256[]","name":"srcAmounts","type":"uint256[]"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"getDestinationReturnAmountForSplitTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isEligibleForFreeTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isTradingRouteEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"partners","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"bytes16","name":"name","type":"bytes16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"routes","type":"uint256[]"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"totalSrcAmount","type":"uint256"},{"internalType":"uint256[]","name":"srcAmounts","type":"uint256[]"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"minDestAmount","type":"uint256"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"splitTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tradingRouteIndex","type":"uint256"},{"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":"partnerIndex","type":"uint256"}],"name":"trade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradingRoutes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"contract IWardenTradingRoute","name":"route","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateEligibleAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"bytes16","name":"name","type":"bytes16"}],"name":"updatePartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"updateWardenToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wardenToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052678ac7230489e800006003556000620000256001600160e01b036200019b16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000796200019f565b506040805160608101825233808252600a6020808401828152652ba0a92222a760d11b85870181815260008080526002855287517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805495516001600160a01b03199096166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff9096169590950294909417909355517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077c80546001600160801b03191660809290921c91909117905586519384529183019190915284519394929390927f5c403d036e1c349774b6d02e8239a8ead8b2cc6cce35e81b098361da1ded89a2928290030190a3506004805460ff60a01b1916600160a01b179055620001bf565b3390565b604080516060810182526000808252602082018190529181019190915290565b613cc780620001cf6000396000f3fe60806040526004361061018b5760003560e01c80638f64d73a116100d6578063dd9460301161007f578063e9fc3d1411610059578063e9fc3d1414610929578063f2fde38b1461093e578063f4de0d4f1461097e5761018b565b8063dd946030146107df578063e254a4f31461081f578063e405a406146108ff5761018b565b8063b6c91499116100b0578063b6c9149914610641578063b81f750514610746578063c3b49d041461075b5761018b565b80638f64d73a146104e75780639bd5318614610511578063b0cf0721146106175761018b565b8063629e1c69116101385780638da5cb5b116101125780638da5cb5b146104a85780638ec523b3146104bd5780638f32d59b146104d25761018b565b8063629e1c6914610402578063715018a614610455578063851131561461046a5761018b565b80634912dd14116101695780634912dd141461029d5780635a831ac4146102e35780635a9b50e0146103375761018b565b8063421457721461018d57806344500a44146101fb578063459b018414610225575b005b34801561019957600080fd5b506101e9600480360360a08110156101b057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013590911690606081013590608001356109a8565b60408051918252519081900360200190f35b34801561020757600080fd5b5061018b6004803603602081101561021e57600080fd5b5035610a95565b34801561023157600080fd5b5061018b6004803603608081101561024857600080fd5b50803590602081013573ffffffffffffffffffffffffffffffffffffffff1690604081013561ffff1690606001357fffffffffffffffffffffffffffffffff0000000000000000000000000000000016610b43565b3480156102a957600080fd5b5061018b600480360360408110156102c057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610d6c565b3480156102ef57600080fd5b506103236004803603602081101561030657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0a565b604080519115158252519081900360200190f35b34801561034357600080fd5b5061018b6004803603604081101561035a57600080fd5b81019060208101813564010000000081111561037557600080fd5b82018360208201111561038757600080fd5b803590602001918460018302840111640100000000831117156103a957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610ee29050565b6101e9600480360360c081101561041857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135916060820135169060808101359060a00135611119565b34801561046157600080fd5b5061018b61148f565b34801561047657600080fd5b5061047f611571565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104b457600080fd5b5061047f611589565b3480156104c957600080fd5b506101e96115a6565b3480156104de57600080fd5b506103236115ac565b3480156104f357600080fd5b5061018b6004803603602081101561050a57600080fd5b50356115ea565b6101e9600480360360e081101561052757600080fd5b81019060208101813564010000000081111561054257600080fd5b82018360208201111561055457600080fd5b8035906020019184602083028401116401000000008311171561057657600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff8335169260208101359291906060810190604001356401000000008111156105b657600080fd5b8201836020820111156105c857600080fd5b803590602001918460208302840111640100000000831117156105ea57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356116fe565b34801561062357600080fd5b5061018b6004803603602081101561063a57600080fd5b5035611b8f565b34801561064d57600080fd5b506101e9600480360360a081101561066457600080fd5b81019060208101813564010000000081111561067f57600080fd5b82018360208201111561069157600080fd5b803590602001918460208302840111640100000000831117156106b357600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff833516926040810190602001356401000000008111156106eb57600080fd5b8201836020820111156106fd57600080fd5b8035906020019184602083028401116401000000008311171561071f57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e25565b34801561075257600080fd5b506101e9612034565b34801561076757600080fd5b506107856004803603602081101561077e57600080fd5b503561203a565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845261ffff90921660208401527fffffffffffffffffffffffffffffffff000000000000000000000000000000001682820152519081900360600190f35b3480156107eb57600080fd5b5061018b6004803603602081101561080257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661208b565b34801561082b57600080fd5b506108496004803603602081101561084257600080fd5b503561216d565b6040518080602001841515151581526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b838110156108c25781810151838201526020016108aa565b50505050905090810190601f1680156108ef5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561090b57600080fd5b5061018b6004803603602081101561092257600080fd5b503561225f565b34801561093557600080fd5b5061047f612434565b34801561094a57600080fd5b5061018b6004803603602081101561096157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612450565b34801561098a57600080fd5b50610323600480360360208110156109a157600080fd5b50356124cf565b600080600187815481106109b857fe5b6000918252602080832060029290920290910160010154604080517f1eac74b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a81166024830152604482018a9052915161010090930490911694508492631eac74b392606480840193829003018186803b158015610a5157600080fd5b505afa158015610a65573d6000803e3d6000fd5b505050506040513d6020811015610a7b57600080fd5b50519050610a8981856124fb565b98975050505050505050565b610a9d6115ac565b610b0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60038190556040805182815290517f738c273cf923a5ca62dc0dd129c7e7c8213c8e0fa97cb428225e17e2cc5f16759181900360200190a150565b610b4b6115ac565b610bb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60648261ffff161115610c2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6665653a206e6f206d6f7265207468616e203125000000000000000000000000604482015290519081900360640190fd5b610c32613a9f565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff85811680835261ffff86811660208086018281527fffffffffffffffffffffffffffffffff00000000000000000000000000000000898116888a0181815260008f8152600286528b90208a51815495517fffffffffffffffffffffffff00000000000000000000000000000000000000009096169a16999099177fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000949097169390930295909517875590516001909601805490911660809690961c9590951790945585519081529283015283519293909288927f5c403d036e1c349774b6d02e8239a8ead8b2cc6cce35e81b098361da1ded89a292908290030190a35050505050565b610d746115ac565b610ddf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610e0673ffffffffffffffffffffffffffffffffffffffff8316338363ffffffff6125d916565b5050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16610e3257506000610edd565b60035460048054604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811694820194909452905192909116916370a0823191602480820192602092909190829003018186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d6020811015610ed657600080fd5b5051101590505b919050565b610eea6115ac565b610f5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604080516060810182528381526001602080830182905273ffffffffffffffffffffffffffffffffffffffff851693830193909352805480820180835560009290925282518051929460029092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60192610fd39284920190613abf565b50602082810151600192830180546040958601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116921515929092177fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff938416021790559154835182815287518184015287517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920195509286169333937fe50f1a4b29420cb0144d8fbaa9aa5d75b03b32b5abd03553588c9f40baf970bf938993919283929083019185019080838360005b838110156110db5781810151838201526020016110c3565b50505050905090810190601f1680156111085780820380516001836020036101000a031916815260200191505b509250505060405180910390a45050565b60045460009074010000000000000000000000000000000000000000900460ff166111a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816146112285761122873ffffffffffffffffffffffffffffffffffffffff881633308963ffffffff61266b16565b61123488888888612706565b905061123f33610e0a565b6112515761124e838287612d1e565b90505b838110156112c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f64657374696e6174696f6e20616d6f756e7420697320746f6f206c6f772e0000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8616141561139957604051600090339083908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b5050905080611393576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b506113c0565b6113c073ffffffffffffffffffffffffffffffffffffffff8616338363ffffffff6125d916565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8fc98f27a8ede6c2eaf4c0c1a9dc70869c311fae9c121f647bdfe88a726876a58985604051808381526020018281526020019250505060405180910390a49050600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b6114976115ac565b61150257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b60035481565b6000805473ffffffffffffffffffffffffffffffffffffffff166115ce612fe7565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6115f26115ac565b61165d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604051600090339083908381818185875af1925050503d806000811461169f576040519150601f19603f3d011682016040523d82523d6000602084013e6116a4565b606091505b5050905080610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b60045460009074010000000000000000000000000000000000000000900460ff1661178a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690558861181e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726f757465732063616e206e6f7420626520656d707479000000000000000000604482015290519081900360640190fd5b888514611876576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bec6026913960400191505060405180910390fd5b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8a16146118d1576118d173ffffffffffffffffffffffffffffffffffffffff8a1633308b63ffffffff61266b16565b60005b8a8110156119325760008c8c838181106118ea57fe5b905060200201359050600089898481811061190157fe5b905060200201359050611926611919838e848c612706565b859063ffffffff612feb16565b935050506001016118d4565b5061193c33610e0a565b61194e5761194b838287612d1e565b90505b838110156119bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f64657374696e6174696f6e20616d6f756e7420697320746f6f206c6f772e0000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff86161415611a9657604051600090339083908381818185875af1925050503d8060008114611a31576040519150601f19603f3d011682016040523d82523d6000602084013e611a36565b606091505b5050905080611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b50611abd565b611abd73ffffffffffffffffffffffffffffffffffffffff8616338363ffffffff6125d916565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f8fc98f27a8ede6c2eaf4c0c1a9dc70869c311fae9c121f647bdfe88a726876a58b85604051808381526020018281526020019250505060405180910390a49050600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559998505050505050505050565b611b976115ac565b611c0257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8060018181548110611c1057fe5b60009182526020909120600160029092020181015460ff16151514611c9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546869732074726164696e6720726f7574652069732064697361626c65640000604482015290519081900360640190fd5b600060018381548110611ca557fe5b906000526020600020906002020160010160006101000a81548160ff0219169083151502179055508160018381548110611cdb57fe5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f522343fed4da4ad88198645bf4de396fd09d83359b80334e5cab68eba80cd59e60018681548110611d6857fe5b600091825260209182902060408051848152600293840290920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001831615020116939093049382018490529192909182919082019084908015611e135780601f10611de857610100808354040283529160200191611e13565b820191906000526020600020905b815481529060010190602001808311611df657829003601f168201915b50509250505060405180910390a45050565b600086611e9357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726f757465732063616e206e6f7420626520656d707479000000000000000000604482015290519081900360640190fd5b868414611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bec6026913960400191505060405180910390fd5b6000805b8881101561201c5760008a8a83818110611f0557fe5b9050602002013590506000888884818110611f1c57fe5b905060200201359050600060018381548110611f3457fe5b600091825260209182902060016002909202010154604080517f1eac74b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f811660048301528c8116602483015260448201879052915161010090930491909116935061200b928492631eac74b3926064808201939291829003018186803b158015611fd257600080fd5b505afa158015611fe6573d6000803e3d6000fd5b505050506040513d6020811015611ffc57600080fd5b5051869063ffffffff612feb16565b94505060019092019150611eef9050565b5061202781846124fb565b9998505050505050505050565b60015490565b6002602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff82169174010000000000000000000000000000000000000000900461ffff169060801b83565b6120936115ac565b6120fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe88298080913cf71aa73490a2e1bf9c29b4816c8ffda9078d180dd1278321f4190600090a250565b6001818154811061217a57fe5b60009182526020918290206002918202018054604080516001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921693909304601f81018590048502820185019093528281529093509183919083018282801561222e5780601f106122035761010080835404028352916020019161222e565b820191906000526020600020905b81548152906001019060200180831161221157829003601f168201915b5050506001909301549192505060ff81169073ffffffffffffffffffffffffffffffffffffffff6101009091041683565b6122676115ac565b6122d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600181815481106122e057fe5b600091825260209091206001600290920201015460ff161561236357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546869732074726164696e6720726f75746520697320656e61626c6564000000604482015290519081900360640190fd5b600180838154811061237157fe5b906000526020600020906002020160010160006101000a81548160ff02191690831515021790555081600183815481106123a757fe5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe18f2d774ca2ed7ecfb01f8117b026c2c909e254f21f9d50461b1a7c1b14540560018681548110611d6857fe5b60045473ffffffffffffffffffffffffffffffffffffffff1681565b6124586115ac565b6124c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6124cc8161305f565b50565b6000600182815481106124de57fe5b600091825260209091206002909102016001015460ff1692915050565b6000818152600260205260408120805473ffffffffffffffffffffffffffffffffffffffff1661255157506000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5b805474010000000000000000000000000000000000000000900461ffff1661257c57839150506125d3565b80546000906125bc90612710906125b090889074010000000000000000000000000000000000000000900461ffff16613158565b9063ffffffff6131cb16565b90506125ce858263ffffffff61320d16565b925050505b92915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261266690849061324f565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261270090859061324f565b50505050565b6000846001818154811061271657fe5b60009182526020909120600160029092020181015460ff1615151461279c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546869732074726164696e6720726f7574652069732064697361626c65640000604482015290519081900360640190fd5b6000808073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff891614156127da57479150612875565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8a16916370a08231916024808301926020929190829003018186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d602081101561287057600080fd5b505191505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff871614156128ae575047612949565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8816916370a08231916024808301926020929190829003018186803b15801561291a57600080fd5b505afa15801561292e573d6000803e3d6000fd5b505050506040513d602081101561294457600080fd5b505190505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8916141561298d5761298689888861348d565b92506129d9565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff871614156129ca57612986898989613584565b6129d689898989613697565b92505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff89161415612a7757612a1b828863ffffffff61320d16565b4714612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613b586022913960400191505060405180910390fd5b612b75565b612a87828863ffffffff61320d16565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8b16916370a08231916024808301926020929190829003018186803b158015612af357600080fd5b505afa158015612b07573d6000803e3d6000fd5b505050506040513d6020811015612b1d57600080fd5b505114612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613b586022913960400191505060405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff87161415612c1357612bb7818463ffffffff612feb16565b4714612c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613bc56027913960400191505060405180910390fd5b612d11565b612c23818463ffffffff612feb16565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b158015612c8f57600080fd5b505afa158015612ca3573d6000803e3d6000fd5b505050506040513d6020811015612cb957600080fd5b505114612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613bc56027913960400191505060405180910390fd5b5090979650505050505050565b6000838152600260205260408120805473ffffffffffffffffffffffffffffffffffffffff16612d7757506000808052600260205293507fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5b805474010000000000000000000000000000000000000000900461ffff16612da25783915050612fe0565b8054600090612dd690612710906125b090889074010000000000000000000000000000000000000000900461ffff16613158565b9050848110612e4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f66656520657863656564732072657475726e20616d6f756e7421000000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff85161415612f4c57815460405160009173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d8060008114612ed1576040519150601f19603f3d011682016040523d82523d6000602084013e612ed6565b606091505b5050905080612f4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5472616e7366657220666565206f66206574686572206661696c65642e000000604482015290519081900360640190fd5b50612f78565b8154612f789073ffffffffffffffffffffffffffffffffffffffff86811691168363ffffffff6125d916565b815460408051838152905173ffffffffffffffffffffffffffffffffffffffff9283169287169189917f9050eacbec2458f587bc890a13b95d69e1584e0c68a6f1a362aa5a9cf7ac29979181900360200190a4612fdb858263ffffffff61320d16565b925050505b9392505050565b3390565b600082820183811015612fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166130cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b9f6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082613167575060006125d3565b8282028284828161317457fe5b0414612fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c126021913960400191505060405180910390fd5b6000612fe083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137a5565b6000612fe083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613861565b61326e8273ffffffffffffffffffffffffffffffffffffffff166138d5565b6132d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061334257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613305565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133a4576040519150601f19603f3d011682016040523d82523d6000602084013e6133a9565b606091505b50915091508161341a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156127005780806020019051602081101561343657600080fd5b5051612700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613c33602a913960400191505060405180910390fd5b6000806001858154811061349d57fe5b6000918252602080832060029290920290910160010154604080517f5253baae00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff8881166024830152604482018a9052915161010090930490911694508492635253baae928992606480820193929182900301818588803b15801561354d57600080fd5b505af1158015613561573d6000803e3d6000fd5b50505050506040513d602081101561357857600080fd5b50519695505050505050565b6000806001858154811061359457fe5b600091825260209091206001600290920201015473ffffffffffffffffffffffffffffffffffffffff610100909104811691506135da908516828563ffffffff61391116565b604080517f5253baae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6024830152604482018690529151600092841691635253baae91606480830192602092919082900301818787803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b600080600186815481106136a757fe5b600091825260209091206001600290920201015473ffffffffffffffffffffffffffffffffffffffff610100909104811691506136ed908616828663ffffffff61391116565b604080517f5253baae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528581166024830152604482018790529151600092841691635253baae91606480830192602092919082900301818787803b15801561376e57600080fd5b505af1158015613782573d6000803e3d6000fd5b505050506040513d602081101561379857600080fd5b5051979650505050505050565b6000818361384b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138105781810151838201526020016137f8565b50505050905090810190601f16801561383d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161385757fe5b0495945050505050565b600081848411156138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156138105781810151838201526020016137f8565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061390957508115155b949350505050565b8015806139bd5750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561398f57600080fd5b505afa1580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b5051155b613a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613c5d6036913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261266690849061324f565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b0057805160ff1916838001178555613b2d565b82800160010185558215613b2d579182015b82811115613b2d578251825591602001919060010190613b12565b50613b39929150613b3d565b5090565b6115a391905b80821115613b395760008155600101613b4356fe736f7572636520616d6f756e74206d69736d617463682061667465722074726164655472616e73666572206574686572206261636b20746f2063616c6c6572206661696c65642e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737364657374696e6174696f6e20616d6f756e74206d69736d61746368206166746572207472616465726f7574657320616e6420737263416d6f756e7473206c656e67746873206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820673d2f8c2f0d239441e080555781176b473d073b01b663d04034e58e24a040fa64736f6c63430005110032

Deployed ByteCode Sourcemap

34389:13275:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45468:520;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45468:520:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;45468:520:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33888:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33888:189:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33888:189:0;;:::i;31602:337::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31602:337:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;31602:337:0;;;;;;;;;;;;;;;;;;;;;;;:::i;47071:180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47071:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47071:180:0;;;;;;;;;:::i;34085:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34085:297:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34085:297:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28180:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28180:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28180:386:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;28180:386:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28180:386:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28180:386:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28180:386:0;;-1:-1:-1;;;28180:386:0;;;;;-1:-1:-1;28180:386:0;;-1:-1:-1;28180:386:0:i;41460:1350::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;41460:1350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23644:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23644:140:0;;;:::i;31251:86::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31251:86:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22833:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22833:79:0;;;:::i;33510:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33510:40:0;;;:::i;23199:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23199:94:0;;;:::i;47394:267::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47394:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47394:267:0;;:::i;43313:1779::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43313:1779:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43313:1779:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43313:1779:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43313:1779:0;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43313:1779:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43313:1779:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43313:1779:0;;-1:-1:-1;43313:1779:0;-1:-1:-1;43313:1779:0;;;;;;;;;;;;;;:::i;28745:310::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28745:310:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28745:310:0;;:::i;45996:932::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45996:932:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45996:932:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45996:932:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45996:932:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45996:932:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45996:932:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45996:932:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45996:932:0;;-1:-1:-1;45996:932:0;-1:-1:-1;45996:932:0;;;;;;;;;:::i;29659:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29659:103:0;;;:::i;31346:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31346:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31346:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33704:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33704:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33704:176:0;;;;:::i;27577:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27577:28:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27577:28:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27577:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29232:308;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29232:308:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29232:308:0;;:::i;33567:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33567:25:0;;;:::i;23939:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23939:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23939:109:0;;;;:::i;29951:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29951:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29951:128:0;;:::i;45468:520::-;45700:7;45756:32;45791:13;45805:17;45791:32;;;;;;;;;;;;;;;;;;;;;;;;:38;;;45861:61;;;;;;45791:38;45861:61;;;;;;;;;;;;;;;;;;;;;;45791:38;;;;;;;;-1:-1:-1;45791:38:0;;45861:39;;:61;;;;;;;;;;45791:38;45861:61;;;5:2:-1;;;;30:1;27;20:12;5:2;45861:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45861:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45861:61:0;;-1:-1:-1;45940:40:0;45861:61;45967:12;45940:14;:40::i;:::-;45933:47;45468:520;-1:-1:-1;;;;;;;;45468:520:0:o;33888:189::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34002:14;:23;;;34041:28;;;;;;;;;;;;;;;;;33888:189;:::o;31602:337::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:3;31743;:10;;;;31735:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:22;;:::i;:::-;-1:-1:-1;31814:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31851:15:0;;;:8;:15;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31851:25:0;;;;;;;;;;;;;;;;;;;;31892:39;;;;;;;;;;;31814:26;;;;31851:15;;31892:39;;;;;;;;;23102:1;31602:337;;;;:::o;47071:180::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47205:38;:18;;;47224:10;47236:6;47205:38;:18;:38;:::i;:::-;47071:180;;:::o;34085:297::-;34213:11;;34179:4;;34213:11;;34201:111;;-1:-1:-1;34295:5:0;34288:12;;34201:111;34360:14;;34329:11;;;:27;;;;;;:11;:27;;;;;;;;;;;;:11;;;;;:21;;:27;;;;;;;;;;;;;;;:11;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;34329:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34329:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34329:27:0;:45;;;-1:-1:-1;34085:297:0;;;;:::o;28180:386::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28354:108;;;;;;;;;;;28335:13;28354:108;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;;-1:-1;28335:128:0;;;;;;;;23:18:-1;;28335:128:0;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28335:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28533:20;;28479:79;;;;;;;;;;;;;28533:24;;;;;-1:-1:-1;28479:79:0;;;;28497:10;;28479:79;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28479:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28180:386;;:::o;41460:1350::-;5013:11;;41740:7;;5013:11;;;;;5005:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5138:11;:19;;;;;;5152:5;31294:42;41833:17;;;;41829:142;;41867:58;:20;;;41888:10;41908:4;41915:9;41867:58;:20;:58;:::i;:::-;42021:47;42028:17;42047:3;42052:9;42063:4;42021:6;:47::i;:::-;42008:60;;42084:34;42107:10;42084:22;:34::i;:::-;42079:124;;42148:43;42160:12;42174:10;42186:4;42148:11;:43::i;:::-;42135:56;;42079:124;42318:13;42304:10;:27;;42296:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;42381:18;;;;42377:311;;;42435:37;;42417:12;;42435:10;;42457;;42417:12;42435:37;42417:12;42435:37;42457:10;42435;:37;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;42416:56:0;;;42524:7;42516:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42377:311;;;;42635:41;:17;;;42653:10;42665;42635:41;:17;:41;:::i;:::-;42763:10;42705:69;;42744:4;42705:69;;42719:3;42705:69;;;42725:9;42751:10;42705:69;;;;;;;;;;;;;;;;;;;;;;;;42792:10;-1:-1:-1;5318:11:0;:18;;;;;;;;41460:1350;;-1:-1:-1;;;;;;41460:1350:0:o;23644:140::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23743:1;23727:6;;23706:40;;;23727:6;;;;23706:40;;23743:1;;23706:40;23774:1;23757:19;;;;;;23644:140::o;31251:86::-;31294:42;31251:86;:::o;22833:79::-;22871:7;22898:6;;;22833:79;;:::o;33510:40::-;;;;:::o;23199:94::-;23239:4;23279:6;;;;23263:12;:10;:12::i;:::-;:22;;;23256:29;;23199:94;:::o;47394:267::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47523:33;;47505:12;;47523:10;;47545:6;;47505:12;47523:33;47505:12;47523:33;47545:6;47523:10;:33;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;47504:52:0;;;47604:7;47596:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43313:1779;5013:11;;43642:7;;5013:11;;;;;5005:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5138:11;:19;;;;;;43675:17;43667:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43739:34;;;43731:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43827:18;31294:42;43899:17;;;;43895:147;;43933:63;:20;;;43954:10;43974:4;43981:14;43933:63;:20;:63;:::i;:::-;44087:6;44082:238;44099:17;;;44082:238;;;44138:25;44166:6;;44173:1;44166:9;;;;;;;;;;;;;44138:37;;44190:14;44207:10;;44218:1;44207:13;;;;;;;;;;;;;44190:30;;44248:60;44263:44;44270:17;44289:3;44294:6;44302:4;44263:6;:44::i;:::-;44248:10;;:60;:14;:60;:::i;:::-;44235:73;-1:-1:-1;;;44118:3:0;;44082:238;;;;44361:34;44384:10;44361:22;:34::i;:::-;44356:124;;44425:43;44437:12;44451:10;44463:4;44425:11;:43::i;:::-;44412:56;;44356:124;44595:13;44581:10;:27;;44573:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;44658:18;;;;44654:311;;;44712:37;;44694:12;;44712:10;;44734;;44694:12;44712:37;44694:12;44712:37;44734:10;44712;:37;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44693:56:0;;;44801:7;44793:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44654:311;;;;44912:41;:17;;;44930:10;44942;44912:41;:17;:41;:::i;:::-;45045:10;44982:74;;45026:4;44982:74;;44996:3;44982:74;;;45002:14;45033:10;44982:74;;;;;;;;;;;;;;;;;;;;;;;;45074:10;-1:-1:-1;5318:11:0;:18;;;;;;;;43313:1779;;-1:-1:-1;;;;;;;;;43313:1779:0:o;28745:310::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:6;27705:13;27719:6;27705:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;;:36;;;27697:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28929:5;28898:13;28912:6;28898:21;;;;;;;;;;;;;;;;;;:28;;;:36;;;;;;;;;;;;;;;;;;29040:6;29011:13;29025:6;29011:21;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28950:97;;28971:10;28950:97;;;28983:13;28997:6;28983:21;;;;;;;;;;;;;;;;;28950:97;;;;;;28983:21;;;;;;;28950:97;;;;;;;;;;;;;;;;;;;;;28983:21;;28950:97;;;;;;;;28983:21;;28950:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23102:1;28745:310;:::o;45996:932::-;46260:7;46293:17;46285:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46357:34;;;46349:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46445:18;;46488:375;46505:17;;;46488:375;;;46544:25;46572:6;;46579:1;46572:9;;;;;;;;;;;;;46544:37;;46596:14;46613:10;;46624:1;46613:13;;;;;;;;;;;;;46596:30;;46676:32;46711:13;46725:17;46711:32;;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;46792:58;;;;;;46711:38;46792:58;;;;;;;;;;;;;;;;;;;;;;46711:38;;;;;;;;;-1:-1:-1;46777:74:0;;46711:38;;46792:39;;:58;;;;;46711:32;46792:58;;;;;;46711:38;46792:58;;;5:2:-1;;;;30:1;27;20:12;5:2;46792:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46792:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46792:58:0;46777:10;;:74;:14;:74;:::i;:::-;46764:87;-1:-1:-1;;46524:3:0;;;;;-1:-1:-1;46488:375:0;;-1:-1:-1;46488:375:0;;;46880:40;46895:10;46907:12;46880:14;:40::i;:::-;46873:47;45996:932;-1:-1:-1;;;;;;;;;45996:932:0:o;29659:103::-;29734:13;:20;29659:103;:::o;31346:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33704:176::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33813:11;:19;;;;;;;;;;;;;33848:24;;;;-1:-1:-1;;33848:24:0;33704:176;:::o;27577:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27577:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27577:28:0;;;;;;;-1:-1:-1;;27577:28:0;;;;;;;;;;;:::o;29232:308::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29361:6;27870:13;27884:6;27870:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;:37;27862:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29416:4;29385:13;29399:6;29385:21;;;;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;;29525:6;29496:13;29510:6;29496:21;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29436:96;;29456:10;29436:96;;;29468:13;29482:6;29468:21;;;;;;;33567:25;;;;;;:::o;23939:109::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24012:28;24031:8;24012:18;:28::i;:::-;23939:109;:::o;29951:128::-;30019:4;30043:13;30057:6;30043:21;;;;;;;;;;;;;;;;;;;;;:28;;;;;;29951:128;-1:-1:-1;;29951:128:0:o;31947:494::-;32058:23;32125:22;;;:8;:22;;;;;32162:14;;;;32158:112;;-1:-1:-1;32247:11:0;;;:8;:11;;;32158:112;32284:11;;;;;;;32280:62;;32324:6;32317:13;;;;;32280:62;32377:11;;32352;;32366:34;;32394:5;;32366:23;;:6;;32377:11;;;;;32366:10;:23::i;:::-;:27;:34;:27;:34;:::i;:::-;32352:48;-1:-1:-1;32418:15:0;:6;32352:48;32418:15;:10;:15;:::i;:::-;32411:22;;;;31947:494;;;;;:::o;17505:176::-;17614:58;;;17637:14;17614:58;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17614:58:0;;;;;;;;25:18:-1;;61:17;;17614:58:0;182:15:-1;17637:23:0;179:29:-1;160:49;;17588:85:0;;17607:5;;17588:18;:85::i;:::-;17505:176;;;:::o;17689:204::-;17816:68;;;17839:18;17816:68;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17816:68:0;;;;;;;;25:18:-1;;61:17;;17816:68:0;182:15:-1;17839:27:0;179:29:-1;160:49;;17790:95:0;;17809:5;;17790:18;:95::i;:::-;17689:204;;;;:::o;38573:2029::-;38844:7;38807:18;27705:13;27719:6;27705:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;;:36;;;27697:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38900:18;;;31294:42;39067:18;;;;39063:180;;;39130:21;39112:39;;39063:180;;;39202:29;;;;;;39225:4;39202:29;;;;;;:14;;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;39202:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39202:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39202:29:0;;-1:-1:-1;39063:180:0;31294:42;39257:19;;;;39253:182;;;-1:-1:-1;39320:21:0;39253:182;;;39393:30;;;;;;39417:4;39393:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;39393:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39393:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39393:30:0;;-1:-1:-1;39253:182:0;31294:42;39449:18;;;;39445:425;;;39519:57;39538:18;39558:10;39570:5;39519:18;:57::i;:::-;39506:70;;39445:425;;;31294:42;39598:19;;;;39594:276;;;39669:56;39688:18;39708:4;39714:10;39669:18;:56::i;39594:276::-;39795:63;39814:18;39834:4;39840:10;39852:5;39795:18;:63::i;:::-;39782:76;;39594:276;31294:42;39933:18;;;;39929:308;;;40011:31;:15;40031:10;40011:31;:19;:31;:::i;:::-;39986:21;:56;39978:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39929:308;;;40155:31;:15;40175:10;40155:31;:19;:31;:::i;:::-;40122:29;;;;;;40145:4;40122:29;;;;;;:14;;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40122:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40122:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40122:29:0;:64;40114:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;40251:19;;;;40247:320;;;40328:32;:16;40349:10;40328:32;:20;:32;:::i;:::-;40303:21;:57;40295:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40247:320;;;40479:32;:16;40500:10;40479:32;:20;:32;:::i;:::-;40445:30;;;;;;40469:4;40445:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;40445:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40445:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40445:30:0;:66;40437:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40584:10:0;;38573:2029;-1:-1:-1;;;;;;;38573:2029:0:o;32449:936::-;32557:23;32624:22;;;:8;:22;;;;;32661:14;;;;32657:145;;-1:-1:-1;32753:1:0;32779:11;;;:8;:11;;32753:1;-1:-1:-1;32779:11:0;32657:145;32816:11;;;;;;;32812:62;;32856:6;32849:13;;;;;32812:62;32909:11;;32884;;32898:34;;32926:5;;32898:23;;:6;;32909:11;;;;;32898:10;:23::i;:34::-;32884:48;;32957:6;32951:3;:12;32943:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;33009:19;;;;33005:270;;;33064:14;;:34;;33046:12;;33064:14;;;33090:3;;33046:12;33064:34;33046:12;33064:34;33090:3;33064:14;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33045:53:0;;;33150:7;33142:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33005:270;;;;33243:14;;33224:39;;33243:14;33224:18;;;;33243:14;33259:3;33224:39;:18;:39;:::i;:::-;33322:14;;33290:52;;;;;;;;33322:14;;;;;33290:52;;;33301:12;;33290:52;;;;;;;;;33362:15;:6;33373:3;33362:15;:10;:15;:::i;:::-;33355:22;;;;32449:936;;;;;;:::o;21531:98::-;21611:10;21531:98;:::o;6272:181::-;6330:7;6362:5;;;6386:6;;;;6378:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24154:229;24228:22;;;24220:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24330:6;;;24309:38;;;;;;;24330:6;;;24309:38;;;24358:6;:17;;;;;;;;;;;;;;;24154:229::o;7644:471::-;7702:7;7947:6;7943:47;;-1:-1:-1;7977:1:0;7970:8;;7943:47;8014:5;;;8018:1;8014;:5;:1;8038:5;;;;;:10;8030:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8583:132;8641:7;8668:39;8672:1;8675;8668:39;;;;;;;;;;;;;;;;;:3;:39::i;6728:136::-;6786:7;6813:43;6817:1;6820;6813:43;;;;;;;;;;;;;;;;;:3;:43::i;19544:1114::-;20148:27;20156:5;20148:25;;;:27::i;:::-;20140:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20285:12;20299:23;20334:5;20326:19;;20346:4;20326:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20326:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20284:67:0;;;;20370:7;20362:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20431:17;;:21;20427:224;;20573:10;20562:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20562:30:0;20554:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35404:493;35559:7;35615:32;35650:13;35664:17;35650:32;;;;;;;;;;;;;;;;;;;;;;;;:38;;;35747:114;;;;;;31294:42;35747:114;;;;35650:38;35747:114;;;;;;;;;;;;;;;35650:38;;;;;;;;-1:-1:-1;35650:38:0;;35747:18;;:114;;;;;;;35650:32;35747:114;;;;;;;35650:38;35747:114;;;5:2:-1;;;;30:1;27;20:12;5:2;35747:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35747:114:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35747:114:0;;35404:493;-1:-1:-1;;;;;;35404:493:0:o;36359:571::-;36513:7;36569:32;36604:13;36618:17;36604:32;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;;;;;;;;;-1:-1:-1;36689:49:0;;:15;;36604:38;36728:9;36689:49;:15;:49;:::i;:::-;36798:96;;;;;;:18;:96;;;;;;;31294:42;36798:96;;;;;;;;;;;;36777:18;;36798;;;;;:96;;;;;;;;;;;;;;36777:18;36798;:96;;;5:2:-1;;;;30:1;27;20:12;5:2;36798:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36798:96:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;37247:587:0;37423:7;37479:32;37514:13;37528:17;37514:32;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;;;;;;;;;-1:-1:-1;37599:49:0;;:15;;37514:38;37638:9;37599:49;:15;:49;:::i;:::-;37708:90;;;;;;:18;:90;;;;;;;;;;;;;;;;;;;;;;37687:18;;37708;;;;;:90;;;;;;;;;;;;;;37687:18;37708;:90;;;5:2:-1;;;;30:1;27;20:12;5:2;37708:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37708:90:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37708:90:0;;37247:587;-1:-1:-1;;;;;;;37247:587:0:o;9245:345::-;9331:7;9433:12;9426:5;9418:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9418:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9457:9;9473:1;9469;:5;;;;;;;9245:345;-1:-1:-1;;;;;9245:345:0:o;7201:192::-;7287:7;7323:12;7315:6;;;;7307:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7307:29:0;-1:-1:-1;;;7359:5:0;;;7201:192::o;14528:619::-;14588:4;15056:20;;14899:66;15096:23;;;;;;:42;;-1:-1:-1;15123:15:0;;;15096:42;15088:51;14528:619;-1:-1:-1;;;;14528:619:0:o;17901:621::-;18271:10;;;18270:62;;-1:-1:-1;18287:39:0;;;;;;18311:4;18287:39;;;;:15;:39;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;18287:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18287:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18287:39:0;:44;18270:62;18262:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:62;;;18474:13;18451:62;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18451:62:0;;;;;;;;25:18:-1;;61:17;;18451:62:0;182:15:-1;18474:22:0;179:29:-1;160:49;;18425:89:0;;18444:5;;18425:18;:89::i;34389:13275::-;;;;;;;;;-1:-1:-1;34389:13275:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34389:13275:0;;;-1:-1:-1;34389:13275:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://673d2f8c2f0d239441e080555781176b473d073b01b663d04034e58e24a040fa
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.