Contract 0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F

 
 
Txn Hash
Block
From
To
Value [Txn Fee]
0x9498aa8bb67f125adf4c899a051bd8d0e4fcfa1dc3efb0a1f833569f9ae2cbc694582262021-07-25 6:23:1629 secs ago0x8ca191228128e22d6fb0ccff41a49b9fcf24d74b IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00093025
0xe1a0442d7277b81a734b54ebef0532c4405a46db1c583b17920d87a5dc6bb1f294582222021-07-25 6:23:0441 secs ago0x8753775bd55fed48a47efa28021d44f9d3a2591f IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000593005
0x65b4e0e3d041a0302f79191b66246a31324e4ccbae2529ee974a1dc3170e4ac394582172021-07-25 6:22:4956 secs ago0xc290cd7d4fbeeace7973b3adf9d0581deea574e0 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00056249
0xe7be2764135cc31cc461cd186127ec7916388728dab3613e45bed04a1c26c58994582172021-07-25 6:22:4956 secs ago0xe852330767b1fa962b296c590c7e4d0508bc6368 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.0004796856
0xd427d773260a1f62786d3461fbe389d2d2bd6ad7ff15e7fb7b1b87dab19e622d94582082021-07-25 6:22:221 min ago0x6050e11c858b6a4265657bb7780662d0c821191c IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000784015
0x3079a22da5c42d3857bb0b0a31d242f71c34f30e163a31778d5e6789bdd486a994582062021-07-25 6:22:161 min ago0x4e299920726e8b207e8f7ef16fbd55c7c3024a08 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.0008699835
0xa6b956b804c5a56f1bdffad876d73521cef010a7ef92ab87d96d3bd3de28001394581972021-07-25 6:21:491 min ago0x16dae7d42ad9ae86c885762caaa247fcc65ba516 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000867485
0xaa53abc5ca669dee6876a83810c7759df55e066b0212058b7086d9400271160a94581872021-07-25 6:21:192 mins ago0x73b8778f0ab4a0937a8222f2ac7474d8cf0a4dd5 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000561315
0x0acb3c2b4ecf923b7940b9aca32e319f53bdf07dfc1f8ba0ca28c0b6d038d81e94581742021-07-25 6:20:403 mins ago0xbb7f5193144d7b13343cbecd43f21bc5e7eadac2 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.0008085795
0x1d171fe748a9f66b945e1d87dcd104d7dfcc386725e1f2e64310c7d396877b6394581712021-07-25 6:20:313 mins ago0x472276d38303f69915d9d9873969fc45c6d28c62 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.20822560913 BNB0.0005600157
0xcfebaa5ce250977a2fd8ea339a246a81cfe1a942d3935a53b0cbd18aaa36fb4294581702021-07-25 6:20:283 mins ago0x9e6520c347d077a7cd51351974571a407204cb69 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000852395
0x2c5ee7198bbc0b8d3237069991cb66a0dd48924d9218e0d8d663e41c6d7445c694581422021-07-25 6:19:044 mins ago0xc46188069607f2ded661b4a759dfa9e7e9999ad7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000809185
0xd1851e076a2fbdb2cf3aa0fbe89de3b3f6de4e8c1b925d77d6ba4079867a6d3094581392021-07-25 6:18:554 mins ago0x2d51095842d2e434f3ae529b5a4411e5dcb44420 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.088363797666781 BNB0.000866965
0xa97ffd508a663bcd9b3d51b63486a7a2bb3b7e05d6399e2fbfd4cecf266d16da94581352021-07-25 6:18:435 mins ago0x673c53b9b3c4feb545da65a1a4803c3feee1146f IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000781015
0xeb7e89f21d6a75ef4a1cc94f6acc38ed557d070e7ada11963bda90cba367966194581322021-07-25 6:18:345 mins ago0x2d51095842d2e434f3ae529b5a4411e5dcb44420 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000644565
0x9b6a67a77f0c6d0db57dcc6b4d24a86429dea37be8b0a113a20cb5759564a1d994581142021-07-25 6:17:406 mins ago0x472276d38303f69915d9d9873969fc45c6d28c62 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.21708717184 BNB0.0005600157
0x291e94af9e49e9bd556e4421b82c7c549865efcfeab57b7932e942e1c163f34994581122021-07-25 6:17:346 mins ago0x2d51095842d2e434f3ae529b5a4411e5dcb44420 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.174317974773763 BNB0.0006258
0x8b3a4b9756035f9773cfad822087cb854279971021e53d1c6562a2b9892db51894581112021-07-25 6:17:316 mins ago0x5fa14270c772a99f956f49e5b10fee39d0550d3d IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.002467559492
0xb8efb5dbbcdf1c70f9caa3e22936c6575aacfc62fd430ba827e5ba7ae1e757bb94581092021-07-25 6:17:256 mins ago0x472276d38303f69915d9d9873969fc45c6d28c62 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.21814845448 BNB0.0005600769
0x62a4d240e147b46a398b25a157cc78746b696df96da8549048ad759a88e9de0394580912021-07-25 6:16:317 mins ago0x02eb887528e65912709ee0f975a467fa45090acf IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.356 BNB0.000620525
0x86ad2d5977f82c7bc894492c96d2d0aa542b3065b2637e4be853ebce1be5904794580902021-07-25 6:16:287 mins ago0x73c25453e4abbbdbfe8387ad161188c9ad327f4a IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.5 BNB0.000743232
0x813085f092bb1eecb22d98a5a37d205275d184793af7d333b46981c3f1d9a23c94580742021-07-25 6:15:408 mins ago0x59efb835562ac6385aa84ddc7c7487bcea4f64c5 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.0005656206
0xbfbb3122f73cd40a67a947a330f02e61c2140e8c725083536957c1230460c99694580612021-07-25 6:15:018 mins ago0xef575087f1e7bec54046f98119c8c392a37c51dd IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000924597
0x2888cd3fdbccf23f4c9cf0344a567f597bfa9e30815e048a68a433a9ca234eed94580612021-07-25 6:15:018 mins ago0x5fa14270c772a99f956f49e5b10fee39d0550d3d IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.002593599747
0xb9edbe4cf165c7ee5c9959f2a85af52aeebfb2d2a2ae3ef845962de429b59ec694580612021-07-25 6:15:018 mins ago0x5fa14270c772a99f956f49e5b10fee39d0550d3d IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.000534445036
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe1a0442d7277b81a734b54ebef0532c4405a46db1c583b17920d87a5dc6bb1f294582222021-07-25 6:23:0441 secs ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x8753775bd55fed48a47efa28021d44f9d3a2591f0.16790515771699283 BNB
0xe1a0442d7277b81a734b54ebef0532c4405a46db1c583b17920d87a5dc6bb1f294582222021-07-25 6:23:0441 secs ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.16790515771699283 BNB
0x65b4e0e3d041a0302f79191b66246a31324e4ccbae2529ee974a1dc3170e4ac394582172021-07-25 6:22:4956 secs ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0xc290cd7d4fbeeace7973b3adf9d0581deea574e00.048331422428280326 BNB
0x65b4e0e3d041a0302f79191b66246a31324e4ccbae2529ee974a1dc3170e4ac394582172021-07-25 6:22:4956 secs ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.048331422428280326 BNB
0xaa53abc5ca669dee6876a83810c7759df55e066b0212058b7086d9400271160a94581872021-07-25 6:21:192 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x73b8778f0ab4a0937a8222f2ac7474d8cf0a4dd51.236980296976546104 BNB
0xaa53abc5ca669dee6876a83810c7759df55e066b0212058b7086d9400271160a94581872021-07-25 6:21:192 mins ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1.236980296976546104 BNB
0x1d171fe748a9f66b945e1d87dcd104d7dfcc386725e1f2e64310c7d396877b6394581712021-07-25 6:20:313 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.20822560913 BNB
0xd1851e076a2fbdb2cf3aa0fbe89de3b3f6de4e8c1b925d77d6ba4079867a6d3094581392021-07-25 6:18:554 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.088363797666781204 BNB
0xeb7e89f21d6a75ef4a1cc94f6acc38ed557d070e7ada11963bda90cba367966194581322021-07-25 6:18:345 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x2d51095842d2e434f3ae529b5a4411e5dcb444200.085181130798617577 BNB
0xeb7e89f21d6a75ef4a1cc94f6acc38ed557d070e7ada11963bda90cba367966194581322021-07-25 6:18:345 mins ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.085181130798617577 BNB
0x9b6a67a77f0c6d0db57dcc6b4d24a86429dea37be8b0a113a20cb5759564a1d994581142021-07-25 6:17:406 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.21708717184 BNB
0x291e94af9e49e9bd556e4421b82c7c549865efcfeab57b7932e942e1c163f34994581122021-07-25 6:17:346 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.174317974773763174 BNB
0xb8efb5dbbcdf1c70f9caa3e22936c6575aacfc62fd430ba827e5ba7ae1e757bb94581092021-07-25 6:17:256 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.21814845448 BNB
0x62a4d240e147b46a398b25a157cc78746b696df96da8549048ad759a88e9de0394580912021-07-25 6:16:317 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.356 BNB
0x86ad2d5977f82c7bc894492c96d2d0aa542b3065b2637e4be853ebce1be5904794580902021-07-25 6:16:287 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token0.5 BNB
0x3bc3a9c042f664102a1c872a7a9bd2b2b8f2d9a46520360addcae5cdacb1dd1894580562021-07-25 6:14:468 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x0c00edd44fad18094734350d1bdb7669a4f376790.062145973922056522 BNB
0x3bc3a9c042f664102a1c872a7a9bd2b2b8f2d9a46520360addcae5cdacb1dd1894580562021-07-25 6:14:468 mins ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.062145973922056522 BNB
0x6ed4486c768c78d30288f06ace7655fbcfac8a0e9b3e7504ab552f1bbad0be8894580552021-07-25 6:14:439 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x999f38f87270f73fc972e7ba9a042fdf28ae46870.195393475026959574 BNB
0x6ed4486c768c78d30288f06ace7655fbcfac8a0e9b3e7504ab552f1bbad0be8894580552021-07-25 6:14:439 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token21.806384360956162873 BNB
0xe1bad0c1fc138c92407b7ff1b1aac28ce22ce580f5b8c861f513707cc5b0b7ee94580552021-07-25 6:14:439 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x0a10fce605fdd59ffb4a4e15d932baac05e4689d0.031611850355269221 BNB
0xe1bad0c1fc138c92407b7ff1b1aac28ce22ce580f5b8c861f513707cc5b0b7ee94580552021-07-25 6:14:439 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token6.642081548959221143 BNB
0xd4b8295559a586f3a31412e7b6f482f30c6cbd417e8b9b5cde3c236e002383a794580462021-07-25 6:14:169 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x999f38f87270f73fc972e7ba9a042fdf28ae46870.197931082455418535 BNB
0xd4b8295559a586f3a31412e7b6f482f30c6cbd417e8b9b5cde3c236e002383a794580462021-07-25 6:14:169 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f Binance: WBNB Token28.307567563462942908 BNB
0x2d58316071c8dfb21ed87949a3a205a44ee45bdb494bcde8f8fe78bbec35ab5f94580442021-07-25 6:14:109 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x0c00edd44fad18094734350d1bdb7669a4f376792.461702597395201509 BNB
0x2d58316071c8dfb21ed87949a3a205a44ee45bdb494bcde8f8fe78bbec35ab5f94580442021-07-25 6:14:109 mins ago Binance: WBNB Token 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f2.461702597395201509 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BakerySwapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity >=0.5.0;

interface IBakerySwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function safeTransferBNB(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper: BNB_TRANSFER_FAILED');
    }
}

interface IBakerySwapRouter {
    function factory() external pure returns (address);

    function WBNB() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountBNB,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountBNB);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountBNB);

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

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

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountBNB);

    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountBNB);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactBNBForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForBNBSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

library BakerySwapLibrary {
    using SafeMath for uint256;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'BakerySwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'BakerySwapLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encodePacked(token0, token1)),
                        hex'e2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3' // init code hash
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IBakerySwapPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, 'BakerySwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'BakerySwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, 'BakerySwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'BakerySwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, 'BakerySwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'BakerySwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, 'BakerySwapLibrary: INVALID_PATH');
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, 'BakerySwapLibrary: INVALID_PATH');
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @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);
}

interface IWBNB {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

contract BakerySwapRouter is IBakerySwapRouter {
    using SafeMath for uint256;
    address public immutable override factory;
    address public immutable override WBNB;

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

    constructor(address _factory, address _WBNB) public {
        factory = _factory;
        WBNB = _WBNB;
    }

    receive() external payable {
        assert(msg.sender == WBNB); // only accept BNB via fallback from the WBNB contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IBakerySwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IBakerySwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) = BakerySwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = BakerySwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BakerySwapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = BakerySwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BakerySwapRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBakerySwapPair(pair).mint(to);
    }

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountBNB,
            uint256 liquidity
        )
    {
        (amountToken, amountBNB) = _addLiquidity(
            token,
            WBNB,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountBNBMin
        );
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWBNB(WBNB).deposit{value: amountBNB}();
        assert(IWBNB(WBNB).transfer(pair, amountBNB));
        liquidity = IBakerySwapPair(pair).mint(to);
        // refund dust bnb, if any
        if (msg.value > amountBNB) TransferHelper.safeTransferBNB(msg.sender, msg.value - amountBNB);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        IBakerySwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IBakerySwapPair(pair).burn(to);
        (address token0, ) = BakerySwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BakerySwapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BakerySwapRouter: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountBNB) {
        (amountToken, amountBNB) = removeLiquidity(
            token,
            WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountToken, uint256 amountBNB) {
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountBNB) = removeLiquidityBNB(token, liquidity, amountTokenMin, amountBNBMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountBNB) {
        (, amountBNB) = removeLiquidity(token, WBNB, liquidity, amountTokenMin, amountBNBMin, address(this), deadline);
        TransferHelper.safeTransfer(token, to, IBEP20(token).balanceOf(address(this)));
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }

    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountBNB) {
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountBNB = removeLiquidityBNBSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = BakerySwapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? BakerySwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IBakerySwapPair(BakerySwapLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to);
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = BakerySwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust bnb, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferBNB(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = BakerySwapLibrary.sortTokens(input, output);
            IBakerySwapPair pair = IBakerySwapPair(BakerySwapLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput = IBEP20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = BakerySwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to = i < path.length - 2 ? BakerySwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to);
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IBEP20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactBNBForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        uint256 amountIn = msg.value;
        IWBNB(WBNB).deposit{value: amountIn}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint256 balanceBefore = IBEP20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForBNBSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IBEP20(WBNB).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).withdraw(amountOut);
        TransferHelper.safeTransferBNB(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) public virtual override pure returns (uint256 amountB) {
        return BakerySwapLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public virtual override pure returns (uint256 amountOut) {
        return BakerySwapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public virtual override pure returns (uint256 amountIn) {
        return BakerySwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path)
        public
        virtual
        override
        view
        returns (uint256[] memory amounts)
    {
        return BakerySwapLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path)
        public
        virtual
        override
        view
        returns (uint256[] memory amounts)
    {
        return BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WBNB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WBNB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNBSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityBNBWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapBNBForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactBNBForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactBNBForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForBNB","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForBNBSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactBNB","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b50604051620056d4380380620056d4833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61554d62000187600039806101ac5280610f995280611388528061147052806114f15280611c1b5280611e295280611f1452806120b0528061226052806122f552806125e35280612679528061282c52806128c15280612aa05280612b755280612fea528061316e528061323e528061335a528061358d52806135c8528061387152806138c752806138fb528061397c525080610e005280610e395280610f77528061113c528061123a5280611530528061195f5280611d0d5280611ef2528061219652806123345280612519528061275f52806129005280612c825280612f145280612f3d528061344c52806136f652806138a552806142be5280614301528061443d528061461e5280614e155280614ef65280614f76525061554d6000f3fe60806040526004361061018f5760003560e01c80638dd95002116100d6578063d06ca61f1161007f578063e058848811610059578063e058848814610ca4578063e8e3370014610d04578063eaaed44214610d91576101d5565b8063d06ca61f14610aa3578063d46d2f8314610b5a578063d67b571e14610bff576101d5565b8063b7e65949116100b0578063b7e65949146109c4578063baa2abde14610a24578063c45a015514610a8e576101d5565b80638dd95002146108bd5780639cf68911146108fb578063ad615dec1461098e576101d5565b80635c11d795116101385780638332a963116101125780638332a9631461074f57806385f8c259146107e25780638803dbee14610818576101d5565b80635c11d795146105855780635d616c5b1461062a578063685a0a34146106cf576101d5565b806334a0772d1161016957806334a0772d146103cd57806338ed17391461044d57806350e27df3146104f2576101d5565b8063054d50d4146101da5780631f00ca74146102225780632195995c14610329576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b50610210600480360360608110156101fd57600080fd5b5080359060208101359060400135610de4565b60408051918252519081900360200190f35b34801561022e57600080fd5b506102d96004803603604081101561024557600080fd5b8135919081019060408101602082013564010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184602083028401116401000000008311171561029b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610df9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103155781810151838201526020016102fd565b505050509050019250505060405180910390f35b34801561033557600080fd5b506103b4600480360361016081101561034d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135610e2f565b6040805192835260208301919091528051918290030190f35b3480156103d957600080fd5b506103b460048036036101408110156103f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610f6d565b34801561045957600080fd5b506102d9600480360360a081101561047057600080fd5b81359160208101359181019060608101604082013564010000000081111561049757600080fd5b8201836020820111156104a957600080fd5b803590602001918460208302840111640100000000831117156104cb57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356110c5565b6101d36004803603608081101561050857600080fd5b8135919081019060408101602082013564010000000081111561052a57600080fd5b82018360208201111561053c57600080fd5b8035906020019184602083028401116401000000008311171561055e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611316565b34801561059157600080fd5b506101d3600480360360a08110156105a857600080fd5b8135916020810135918101906060810160408201356401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184602083028401116401000000008311171561060357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356118bc565b34801561063657600080fd5b506102d9600480360360a081101561064d57600080fd5b81359160208101359181019060608101604082013564010000000081111561067457600080fd5b82018360208201111561068657600080fd5b803590602001918460208302840111640100000000831117156106a857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b92565b3480156106db57600080fd5b5061021060048036036101408110156106f357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611eea565b6102d96004803603608081101561076557600080fd5b8135919081019060408101602082013564010000000081111561078757600080fd5b82018360208201111561079957600080fd5b803590602001918460208302840111640100000000831117156107bb57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561203c565b3480156107ee57600080fd5b506102106004803603606081101561080557600080fd5b5080359060208101359060400135612495565b34801561082457600080fd5b506102d9600480360360a081101561083b57600080fd5b81359160208101359181019060608101604082013564010000000081111561086257600080fd5b82018360208201111561087457600080fd5b8035906020019184602083028401116401000000008311171561089657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124a2565b3480156108c957600080fd5b506108d26125e1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102d96004803603608081101561091157600080fd5b8135919081019060408101602082013564010000000081111561093357600080fd5b82018360208201111561094557600080fd5b8035906020019184602083028401116401000000008311171561096757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612605565b34801561099a57600080fd5b50610210600480360360608110156109b157600080fd5b5080359060208101359060400135612a1b565b3480156109d057600080fd5b50610210600480360360c08110156109e757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612a28565b348015610a3057600080fd5b506103b4600480360360e0811015610a4757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612c08565b348015610a9a57600080fd5b506108d2612f12565b348015610aaf57600080fd5b506102d960048036036040811015610ac657600080fd5b81359190810190604081016020820135640100000000811115610ae857600080fd5b820183602082011115610afa57600080fd5b80359060200191846020830284011164010000000083111715610b1c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612f36945050505050565b348015610b6657600080fd5b506101d3600480360360a0811015610b7d57600080fd5b813591602081013591810190606081016040820135640100000000811115610ba457600080fd5b820183602082011115610bb657600080fd5b80359060200191846020830284011164010000000083111715610bd857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612f63565b348015610c0b57600080fd5b506102d9600480360360a0811015610c2257600080fd5b813591602081013591810190606081016040820135640100000000811115610c4957600080fd5b820183602082011115610c5b57600080fd5b80359060200191846020830284011164010000000083111715610c7d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356132d1565b348015610cb057600080fd5b506103b4600480360360c0811015610cc757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135613514565b348015610d1057600080fd5b50610d736004803603610100811015610d2857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613667565b60408051938452602084019290925282820152519081900360600190f35b610d73600480360360c0811015610da757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356137f6565b6000610df1848484613b22565b949350505050565b6060610e267f00000000000000000000000000000000000000000000000000000000000000008484613c46565b90505b92915050565b6000806000610e5f7f00000000000000000000000000000000000000000000000000000000000000008f8f613de9565b9050600087610e6e578c610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015610f2c57600080fd5b505af1158015610f40573d6000803e3d6000fd5b50505050610f538f8f8f8f8f8f8f612c08565b809450819550505050509b509b9950505050505050505050565b6000806000610fbd7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613de9565b9050600087610fcc578c610fee565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561108a57600080fd5b505af115801561109e573d6000803e3d6000fd5b505050506110b08e8e8e8e8e8e613514565b909f909e509c50505050505050505050505050565b6060814281101561113757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6111957f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b915086826001845103815181106111a857fe5b60200260200101511015611207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b6112cc8686600081811061121757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336112b27f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061126657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061129057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613de9565b856000815181106112bf57fe5b6020026020010151614025565b61130b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b509695505050505050565b804281101561138657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106113ca57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156114d657600080fd5b505af11580156114ea573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115867f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061129057fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b505161162257fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061165257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156116eb57600080fd5b505afa1580156116ff573d6000803e3d6000fd5b505050506040513d602081101561171557600080fd5b505160408051602089810282810182019093528982529293506117579290918a918a9182918501908490808284376000920191909152508992506143e6915050565b8761185b8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061178a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b505afa158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b50519063ffffffff61471016565b10156118b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b5050505050505050565b804281101561192c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6119918585600081811061193c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361198b7f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8a614025565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106119c157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a5a57600080fd5b505afa158015611a6e573d6000803e3d6000fd5b505050506040513d6020811015611a8457600080fd5b50516040805160208881028281018201909352888252929350611ac69290918991899182918501908490808284376000920191909152508892506143e6915050565b8661185b8288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611af957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b60608142811015611c0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b611d667f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b91508682600184510381518110611d7957fe5b60200260200101511015611dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b611de88686600081811061121757fe5b611e27828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506141f5915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d83600185510381518110611e7357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b5050505061130b8483600185510381518110611edd57fe5b6020026020010151614752565b600080611f387f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613de9565b9050600086611f47578b611f69565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050505061202b8d8d8d8d8d8d612a28565b9d9c50505050505050505050505050565b606081428110156120ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106120f257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461219157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6121ef7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b915034826000815181106121ff57fe5b6020026020010151111561225e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106122a757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122da57600080fd5b505af11580156122ee573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123607f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8460008151811061236d57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156123de57600080fd5b505af11580156123f2573d6000803e3d6000fd5b505050506040513d602081101561240857600080fd5b505161241057fe5b61244f828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b8160008151811061245c57fe5b602002602001015134111561248b5761248b338360008151811061247c57fe5b60200260200101513403614752565b5095945050505050565b6000610df184848461488a565b6060814281101561251457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6125727f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b9150868260008151811061258257fe5b60200260200101511115611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6060814281101561267757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106126bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461275a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6127b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b915086826001845103815181106127cb57fe5b6020026020010151101561282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061287357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128a657600080fd5b505af11580156128ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61292c7f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8460008151811061293957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b505050506040513d60208110156129d457600080fd5b50516129dc57fe5b61248b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b6000610df18484846149ae565b60008142811015612a9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b612ac9887f00000000000000000000000000000000000000000000000000000000000000008989893089612c08565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450612b7392508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612b4257600080fd5b505afa158015612b56573d6000803e3d6000fd5b505050506040513d6020811015612b6c57600080fd5b5051614a8e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612be657600080fd5b505af1158015612bfa573d6000803e3d6000fd5b5050505061130b8483614752565b6000808242811015612c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6000612ca87f00000000000000000000000000000000000000000000000000000000000000008c8c613de9565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612d2957600080fd5b505af1158015612d3d573d6000803e3d6000fd5b505050506040513d6020811015612d5357600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050506040513d6040811015612df057600080fd5b50805160209091015190925090506000612e0a8e8e614c6b565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612e47578183612e4a565b82825b90975095508a871015612ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154286027913960400191505060405180910390fd5b89861015612f01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154016027913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610e267f00000000000000000000000000000000000000000000000000000000000000008484613ed4565b8042811015612fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061303857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6130e78585600081811061193c57fe5b6131258585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506143e6915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d60208110156131df57600080fd5b505190508681101561323c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156132af57600080fd5b505af11580156132c3573d6000803e3d6000fd5b505050506118b28482614752565b6060814281101561334357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106133a857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461344757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6134a57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b915086826000815181106134b557fe5b60200260200101511115611dd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b600080824281101561358757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6135b6897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612c08565b90935091506135c6898685614a8e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561363957600080fd5b505af115801561364d573d6000803e3d6000fd5b5050505061365b8583614752565b50965096945050505050565b600080600083428110156136dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6136ea8c8c8c8c8c8c614dbe565b9094509250600061371c7f00000000000000000000000000000000000000000000000000000000000000008e8e613de9565b905061372a8d338388614025565b6137368c338387614025565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156137b557600080fd5b505af11580156137c9573d6000803e3d6000fd5b505050506040513d60208110156137df57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561386b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6138998a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614dbe565b909450925060006138eb7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613de9565b90506138f98b338388614025565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561396157600080fd5b505af1158015613975573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a2157600080fd5b505af1158015613a35573d6000803e3d6000fd5b505050506040513d6020811015613a4b57600080fd5b5051613a5357fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015613ad257600080fd5b505af1158015613ae6573d6000803e3d6000fd5b505050506040513d6020811015613afc57600080fd5b5051925034841015613b1457613b1433853403614752565b505096509650969350505050565b6000808411613b7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061538e602c913960400191505060405180910390fd5b600083118015613b8c5750600082115b613be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b6000613bf5856103e563ffffffff6150bf16565b90506000613c09828563ffffffff6150bf16565b90506000613c2f83613c23886103e863ffffffff6150bf16565b9063ffffffff61513216565b9050808281613c3a57fe5b04979650505050505050565b6060600282511015613cb957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613cd157600080fd5b50604051908082528060200260200182016040528015613cfb578160200160208202803683370190505b5090508281600183510381518110613d0f57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613de157600080613d7c87866001860381518110613d5b57fe5b6020026020010151878681518110613d6f57fe5b60200260200101516151a6565b91509150613d9e848481518110613d8f57fe5b6020026020010151838361488a565b846001850381518110613dad57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613d3f565b509392505050565b6000806000613df88585614c6b565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fe2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6060600282511015613f4757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613f5f57600080fd5b50604051908082528060200260200182016040528015613f89578160200160208202803683370190505b5090508281600081518110613f9a57fe5b60200260200101818152505060005b6001835103811015613de157600080613fdf87868581518110613fc857fe5b6020026020010151878660010181518110613d6f57fe5b91509150614001848481518110613ff257fe5b60200260200101518383613b22565b84846001018151811061401057fe5b60209081029190910101525050600101613fa9565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061410357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016140c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614165576040519150601f19603f3d011682016040523d82523d6000602084013e61416a565b606091505b5091509150818015614198575080511580614198575080806020019051602081101561419557600080fd5b50515b6141ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806154cb6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156143e05760008084838151811061421357fe5b602002602001015185846001018151811061422a57fe5b60200260200101519150915060006142428383614c6b565b509050600087856001018151811061425657fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461429e578260006142a2565b6000835b91509150600060028a510388106142b957886142fa565b6142fa7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106142ed57fe5b6020026020010151613de9565b90506143277f00000000000000000000000000000000000000000000000000000000000000008888613de9565b73ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484846040518463ffffffff1660e01b8152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156143b557600080fd5b505af11580156143c9573d6000803e3d6000fd5b5050600190990198506141f8975050505050505050565b50505050565b60005b600183510381101561470b5760008084838151811061440457fe5b602002602001015185846001018151811061441b57fe5b60200260200101519150915060006144338383614c6b565b50905060006144637f00000000000000000000000000000000000000000000000000000000000000008585613de9565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156144b157600080fd5b505afa1580156144c5573d6000803e3d6000fd5b505050506040513d60608110156144db57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614614525578284614528565b83835b915091506145ad828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b95506145ba868383613b22565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146145fe57826000614602565b6000835b91509150600060028c51038a10614619578a61464d565b61464d7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106142ed57fe5b90508573ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484846040518463ffffffff1660e01b8152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156146de57600080fd5b505af11580156146f2573d6000803e3d6000fd5b50506001909b019a506143e99950505050505050505050565b505050565b6000610e2683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061528e565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b602083106147c957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161478c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461482b576040519150601f19603f3d011682016040523d82523d6000602084013e614830565b606091505b505090508061470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061547b6023913960400191505060405180910390fd5b60008084116148e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061549e602d913960400191505060405180910390fd5b6000831180156148f45750600082115b614949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b600061496d6103e8614961868863ffffffff6150bf16565b9063ffffffff6150bf16565b905060006149876103e5614961868963ffffffff61471016565b90506149a4600182848161499757fe5b049063ffffffff61513216565b9695505050505050565b6000808411614a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ba6026913960400191505060405180910390fd5b600083118015614a185750600082115b614a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b82614a7e858463ffffffff6150bf16565b81614a8557fe5b04949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310614b6457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614b27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614bc6576040519150601f19603f3d011682016040523d82523d6000602084013e614bcb565b606091505b5091509150818015614bf9575080511580614bf95750808060200190516020811015614bf657600080fd5b50515b614c6457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153686026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d2d578284614d30565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614db757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614e5e57600080fd5b505afa158015614e72573d6000803e3d6000fd5b505050506040513d6020811015614e8857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f6e57604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b158015614f4157600080fd5b505af1158015614f55573d6000803e3d6000fd5b505050506040513d6020811015614f6b57600080fd5b50505b600080614f9c7f00000000000000000000000000000000000000000000000000000000000000008b8b6151a6565b91509150816000148015614fae575080155b15614fbe578793508692506150b2565b6000614fcb8984846149ae565b9050878111615038578581101561502d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154016027913960400191505060405180910390fd5b8894509250826150b0565b60006150458984866149ae565b90508981111561505157fe5b878110156150aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154286027913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000826150ce57506000610e29565b828202828482816150db57fe5b0414610e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153e06021913960400191505060405180910390fd5b600082820183811015610e2657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006151b58585614c6b565b5090506000806151c6888888613de9565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561520b57600080fd5b505afa15801561521f573d6000803e3d6000fd5b505050506040513d606081101561523557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461527c57808261527f565b81815b90999098509650505050505050565b60008184841115615337576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156152fc5781810151838201526020016152e4565b50505050905090810190601f1680156153295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe42616b65727953776170526f757465723a204558434553534956455f494e5055545f414d4f554e5442616b657279537761704c6962726172793a204944454e544943414c5f41444452455353455342616b657279537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5442616b657279537761704c6962726172793a20494e53554646494349454e545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7742616b65727953776170526f757465723a20494e53554646494349454e545f425f414d4f554e5442616b65727953776170526f757465723a20494e53554646494349454e545f415f414d4f554e5442616b65727953776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a20424e425f5452414e534645525f4641494c454442616b657279537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454442616b657279537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459a2646970667358221220299e6ec863a05b34facb61387047c1629d5fac978f54568d39a4d31919f46fcb64736f6c6343000606003300000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

00000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

24821:19546:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25306:10;:18;25320:4;25306:18;;25299:26;;;;24821:19546;;12:1:-1;9;2:12;43303:259:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43303:259:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43303:259:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44104:260;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44104:260:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44104:260:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;44104:260:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;44104:260: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;44104:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44104:260:0;;-1:-1:-1;44104:260:0;;-1:-1:-1;;;;;44104:260:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44104:260:0;;;;;;;;;;;;;;;;;30487:730;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30487:730:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;30487:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31225:722;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31225:722:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;31225:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34382:682::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34382:682:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34382:682:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34382:682:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34382:682: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;34382:682:0;;-1:-1:-1;34382:682:0;-1:-1:-1;34382:682:0;;;;;;;;;:::i;41337:815::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;41337:815:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;41337:815:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41337:815: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;41337:815:0;;-1:-1:-1;41337:815:0;-1:-1:-1;41337:815:0;;;;;;;;;:::i;40562:767::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40562:767:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;40562:767:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;40562:767:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40562:767: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;40562:767:0;;-1:-1:-1;40562:767:0;-1:-1:-1;40562:767:0;;;;;;;;;:::i;37335:907::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37335:907:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37335:907:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37335:907:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37335:907: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;37335:907:0;;-1:-1:-1;37335:907:0;-1:-1:-1;37335:907:0;;;;;;;;;:::i;32647:833::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32647:833:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;32647:833:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38250:807::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38250:807:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;38250:807:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38250:807: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;38250:807:0;;-1:-1:-1;38250:807:0;-1:-1:-1;38250:807:0;;;;;;;;;:::i;43570:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43570:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43570:258:0;;;;;;;;;;;;:::i;35072:660::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35072:660:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35072:660:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35072:660:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35072:660: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;35072:660:0;;-1:-1:-1;35072:660:0;-1:-1:-1;35072:660:0;;;;;;;;;:::i;24956:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24956:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35740:694;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35740:694:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35740:694:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35740:694: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;35740:694:0;;-1:-1:-1;35740:694:0;-1:-1:-1;35740:694:0;;;;;;;;;:::i;43060:235::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43060:235:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43060:235:0;;;;;;;;;;;;:::i;32026:613::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32026:613:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;32026:613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28884:896::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28884:896:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;28884:896:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24908:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24908:41:0;;;:::i;43836:260::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43836:260:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;43836:260:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;43836:260:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;43836:260: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;43836:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43836:260:0;;-1:-1:-1;43836:260:0;;-1:-1:-1;;;;;43836:260:0:i;42160:856::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42160:856:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;42160:856:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;42160:856:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42160:856: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;42160:856:0;;-1:-1:-1;42160:856:0;-1:-1:-1;42160:856:0;;;;;;;;;:::i;36442:885::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36442:885:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36442:885:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36442:885:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36442:885: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;36442:885:0;;-1:-1:-1;36442:885:0;-1:-1:-1;36442:885:0;;;;;;;;;:::i;29788:691::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29788:691:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;29788:691:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26863:864::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26863:864:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26863:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;27735:1106;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;27735:1106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43303:259::-;43454:17;43491:63;43522:8;43532:9;43543:10;43491:30;:63::i;:::-;43484:70;43303:259;-1:-1:-1;;;;43303:259:0:o;44104:260::-;44251:24;44300:56;44331:7;44340:9;44351:4;44300:30;:56::i;:::-;44293:63;;44104:260;;;;;:::o;30487:730::-;30832:15;30849;30877:12;30892:50;30918:7;30927:6;30935;30892:25;:50::i;:::-;30877:65;;30953:13;30969:10;:36;;30996:9;30969:36;;;30990:2;30969:36;31016:81;;;;;;31045:10;31016:81;;;;31065:4;31016:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30953:52;;-1:-1:-1;31016:28:0;;;;;;:81;;;;;-1:-1:-1;;31016:81:0;;;;;;;;-1:-1:-1;31016:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;31016:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31016:81:0;;;;31129:80;31145:6;31153;31161:9;31172:10;31184;31196:2;31200:8;31129:15;:80::i;:::-;31108:101;;;;;;;;30487:730;;;;;;;;;;;;;;;;:::o;31225:722::-;31553:19;31574:17;31604:12;31619:47;31645:7;31654:5;31661:4;31619:25;:47::i;:::-;31604:62;;31677:13;31693:10;:36;;31720:9;31693:36;;;31714:2;31693:36;31740:81;;;;;;31769:10;31740:81;;;;31789:4;31740:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31677:52;;-1:-1:-1;31740:28:0;;;;;;:81;;;;;-1:-1:-1;;31740:81:0;;;;;;;;-1:-1:-1;31740:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;31740:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31740:81:0;;;;31859:80;31878:5;31885:9;31896:14;31912:12;31926:2;31930:8;31859:18;:80::i;:::-;31832:107;;;;-1:-1:-1;31225:722:0;-1:-1:-1;;;;;;;;;;;;;31225:722:0:o;34382:682::-;34615:24;34596:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34662:56:::1;34694:7;34703:8;34713:4;;34662:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34662:31:0::1;::::0;-1:-1:-1;;;34662:56:0:i:1;:::-;34652:66;;34768:12;34737:7;34762:1;34745:7;:14;:18;34737:27;;;;;;;;;;;;;;:43;;34729:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34840:181;34886:4;;34891:1;34886:7;;;;;;;;;;;;;;;34908:10;34933:52;34959:7;34968:4;;34973:1;34968:7;;;;;;;;;;;;;;;34977:4;;34982:1;34977:7;;;;;;;;;;;;;;;34933:25;:52::i;:::-;35000:7;35008:1;35000:10;;;;;;;;;;;;;;34840:31;:181::i;:::-;35032:24;35038:7;35047:4;;35032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35053:2:0;;-1:-1:-1;35032:5:0::1;::::0;-1:-1:-1;;35032:24:0:i:1;:::-;34382:682:::0;;;;;;;;;:::o;41337:815::-;41558:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41598:4:::1;41587:15;;:4;;41592:1;41587:7;;;;;;;;;;;;;;;:15;;;41579:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41648:16;41667:9;41648:28;;41693:4;41687:19;;;41714:8;41687:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41687:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41687:38:0;;;;;41749:4;41743:20;;;41764:52;41790:7;41799:4;;41804:1;41799:7;;;;;;;;;;;;;;;41808:4;;41813:1;41808:7;;;;;;41764:52;41818:8;41743:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41743:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41743:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41743:84:0;41736:92:::1;;;;41839:21;41870:4:::0;;41875:15;;;41870:21;;::::1;;;;;;;;;;;;;41863:39;;;41903:2;41863:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41863:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41863:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41863:43:0;41917:44:::1;::::0;;41863:43:::1;41917:44:::0;;::::1;::::0;;;;;;;;;;;41863:43;;-1:-1:-1;41917:44:0::1;::::0;;;41952:4;;;;;;41917:44;::::1;::::0;41952:4;;41917:44;41952:4;41917:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41958:2:0;;-1:-1:-1;41917:34:0::1;::::0;-1:-1:-1;;41917:44:0:i:1;:::-;42060:12:::0;41994:62:::1;42042:13:::0;42001:4;;42006:15;;;42001:21;;::::1;;;;;;;;;;;;;41994:39;;;42034:2;41994:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41994:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41994:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41994:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;41972:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25124:1;;41337:815:::0;;;;;;:::o;40562:767::-;40805:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40826:179:::1;40872:4;;40877:1;40872:7;;;;;;;;;;;;;;;40894:10;40919:52;40945:7;40954:4;;40959:1;40954:7;;;;;;40919:52;40986:8;40826:31;:179::i;:::-;41016:21;41047:4:::0;;41052:15;;;41047:21;;::::1;;;;;;;;;;;;;41040:39;;;41080:2;41040:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41040:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41040:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41040:43:0;41094:44:::1;::::0;;41040:43:::1;41094:44:::0;;::::1;::::0;;;;;;;;;;;41040:43;;-1:-1:-1;41094:44:0::1;::::0;;;41129:4;;;;;;41094:44;::::1;::::0;41129:4;;41094:44;41129:4;41094:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41135:2:0;;-1:-1:-1;41094:34:0::1;::::0;-1:-1:-1;;41094:44:0:i:1;:::-;41237:12:::0;41171:62:::1;41219:13:::0;41178:4;;41183:15;;;41178:21;;::::1;;;;;;;;;;;;;41171:39;;;41211:2;41171:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;37335:907:0::0;37565:24;37546:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37610:29:::1;37635:4;37610:29;:4:::0;;37615:15;;;37610:21;;::::1;;;;;;;;;;;;;:29;;;37602:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37695:56;37727:7;37736:8;37746:4;;37695:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37695:31:0::1;::::0;-1:-1:-1;;;37695:56:0:i:1;:::-;37685:66;;37801:12;37770:7;37795:1;37778:7;:14;:18;37770:27;;;;;;;;;;;;;;:43;;37762:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37873:181;37919:4;;37924:1;37919:7;;;;;;37873:181;38065:35;38071:7;38080:4;;38065:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38094:4:0::1;::::0;-1:-1:-1;38065:5:0::1;::::0;-1:-1:-1;;38065:35:0:i:1;:::-;38117:4;38111:20;;;38132:7;38157:1;38140:7;:14;:18;38132:27;;;;;;;;;;;;;;38111:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38111:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38111:49:0;;;;38171:63;38202:2;38206:7;38231:1;38214:7;:14;:18;38206:27;;;;;;;;;;;;;;38171:30;:63::i;32647:833::-:0;33004:17;33034:12;33049:47;33075:7;33084:5;33091:4;33049:25;:47::i;:::-;33034:62;;33107:13;33123:10;:36;;33150:9;33123:36;;;33144:2;33123:36;33170:81;;;;;;33199:10;33170:81;;;;33219:4;33170:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33107:52;;-1:-1:-1;33170:28:0;;;;;;:81;;;;;-1:-1:-1;;33170:81:0;;;;;;;;-1:-1:-1;33170:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;33170:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33170:81:0;;;;33274:198;33336:5;33356:9;33380:14;33409:12;33436:2;33453:8;33274:47;:198::i;:::-;33262:210;32647:833;-1:-1:-1;;;;;;;;;;;;;32647:833:0:o;38250:807::-;38458:24;38439:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38514:4:::1;38503:15;;:4;;38508:1;38503:7;;;;;;;;;;;;;;;:15;;;38495:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38574:56;38605:7;38614:9;38625:4;;38574:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38574:30:0::1;::::0;-1:-1:-1;;;38574:56:0:i:1;:::-;38564:66;;38663:9;38649:7;38657:1;38649:10;;;;;;;;;;;;;;:23;;38641:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38734:4;38728:19;;;38755:7;38763:1;38755:10;;;;;;;;;;;;;;38728:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38728:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38728:40:0;;;;;38792:4;38786:20;;;38807:52;38833:7;38842:4;;38847:1;38842:7;;;;;;38807:52;38861:7;38869:1;38861:10;;;;;;;;;;;;;;38786:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38786:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38786:86:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38786:86:0;38779:94:::1;;;;38884:24;38890:7;38899:4;;38884:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38905:2:0;;-1:-1:-1;38884:5:0::1;::::0;-1:-1:-1;;38884:24:0:i:1;:::-;38971:7;38979:1;38971:10;;;;;;;;;;;;;;38959:9;:22;38955:94;;;38983:66;39014:10;39038:7;39046:1;39038:10;;;;;;;;;;;;;;39026:9;:22;38983:30;:66::i;:::-;38250:807:::0;;;;;;;;:::o;43570:258::-;43721:16;43757:63;43787:9;43798;43809:10;43757:29;:63::i;35072:660::-;35305:24;35286:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35352:56:::1;35383:7;35392:9;35403:4;;35352:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35352:30:0::1;::::0;-1:-1:-1;;;35352:56:0:i:1;:::-;35342:66;;35441:11;35427:7;35435:1;35427:10;;;;;;;;;;;;;;:25;;35419:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24956:38:::0;;;:::o;35740:694::-;35951:24;35932:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36007:4:::1;35996:15;;:4;;36001:1;35996:7;;;;;;;;;;;;;;;:15;;;35988:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36067:57;36099:7;36108:9;36119:4;;36067:57;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36067:31:0::1;::::0;-1:-1:-1;;;36067:57:0:i:1;:::-;36057:67;;36174:12;36143:7;36168:1;36151:7;:14;:18;36143:27;;;;;;;;;;;;;;:43;;36135:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36252:4;36246:19;;;36273:7;36281:1;36273:10;;;;;;;;;;;;;;36246:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36246:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36246:40:0;;;;;36310:4;36304:20;;;36325:52;36351:7;36360:4;;36365:1;36360:7;;;;;;36325:52;36379:7;36387:1;36379:10;;;;;;;;;;;;;;36304:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36304:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36304:86:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36304:86:0;36297:94:::1;;;;36402:24;36408:7;36417:4;;36402:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36423:2:0;;-1:-1:-1;36402:5:0::1;::::0;-1:-1:-1;;36402:24:0:i:1;43060:235::-:0;43200:15;43235:52;43259:7;43268:8;43278;43235:23;:52::i;32026:613::-;32304:17;32285:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32350:94:::1;32366:5;32373:4;32379:9;32390:14;32406:12;32428:4;32435:8;32350:15;:94::i;:::-;32494:38;::::0;;;;;32526:4:::1;32494:38;::::0;::::1;::::0;;;32334:110;;-1:-1:-1;32455:78:0::1;::::0;-1:-1:-1;32483:5:0;;32490:2;;32494:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32494:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32494:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32494:38:0;32455:27:::1;:78::i;:::-;32550:4;32544:20;;;32565:9;32544:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32544:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32544:31:0;;;;32586:45;32617:2;32621:9;32586:30;:45::i;28884:896::-:0;29150:15;29167;29131:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29195:12:::1;29210:50;29236:7;29245:6;29253;29210:25;:50::i;:::-;29271:63;::::0;;;;;29306:10:::1;29271:63;::::0;::::1;::::0;:34:::1;::::0;::::1;:63:::0;;;;;;;;;;;;;;29195:65;;-1:-1:-1;29271:34:0;;::::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;29271:34:0;:63;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;29271:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29271:63:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;29408:30:0::1;::::0;;;;;:26:::1;:30:::0;;::::1;;::::0;::::1;::::0;;;29372:15:::1;::::0;;;29408:26;;::::1;::::0;::::1;::::0;:30;;;;;;;;;;;29372:15;29408:26;:30;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;29408:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29408:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29408:30:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;29408:30:0;-1:-1:-1;29450:14:0::1;29470:44;29499:6:::0;29507;29470:28:::1;:44::i;:::-;29449:65;;;29556:6;29546:16;;:6;:16;;;:58;;29587:7;29596;29546:58;;;29566:7;29575;29546:58;29525:79:::0;;-1:-1:-1;29525:79:0;-1:-1:-1;29623:21:0;;::::1;;29615:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29718:10;29707:7;:21;;29699:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25124:1;;;;28884:896:::0;;;;;;;;;;;:::o;24908:41::-;;;:::o;43836:260::-;43983:24;44032:56;44064:7;44073:8;44083:4;44032:31;:56::i;42160:856::-;42400:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42429:29:::1;42454:4;42429:29;:4:::0;;42434:15;;;42429:21;;::::1;;;;;;;;;;;;;:29;;;42421:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;42504:179;42550:4;;42555:1;42550:7;;;;;;42504:179;42694:55;42729:4;;42694:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42743:4:0::1;::::0;-1:-1:-1;42694:34:0::1;::::0;-1:-1:-1;;42694:55:0:i:1;:::-;42780:37;::::0;;;;;42811:4:::1;42780:37;::::0;::::1;::::0;;;42760:17:::1;::::0;42780:22:::1;42787:4;42780:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42780:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42780:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42780:37:0;;-1:-1:-1;42836:25:0;;::::1;;42828:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42927:4;42921:20;;;42942:9;42921:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42921:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42921:31:0;;;;42963:45;42994:2;42998:9;42963:30;:45::i;36442:885::-:0;36672:24;36653:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36717:29:::1;36742:4;36717:29;:4:::0;;36722:15;;;36717:21;;::::1;;;;;;;;;;;;;:29;;;36709:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36802:56;36833:7;36842:9;36853:4;;36802:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36802:30:0::1;::::0;-1:-1:-1;;;36802:56:0:i:1;:::-;36792:66;;36891:11;36877:7;36885:1;36877:10;;;;;;;;;;;;;;:25;;36869:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29788:691:::0;30037:19;30058:17;30018:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30115:196:::1;30145:5;30165:4;30184:9;30208:14;30237:12;30272:4;30292:8;30115:15;:196::i;:::-;30088:223:::0;;-1:-1:-1;30088:223:0;-1:-1:-1;30322:51:0::1;30350:5:::0;30357:2;30088:223;30322:27:::1;:51::i;:::-;30390:4;30384:20;;;30405:9;30384:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30384:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30384:31:0;;;;30426:45;30457:2;30461:9;30426:30;:45::i;:::-;29788:691:::0;;;;;;;;;;:::o;26863:864::-;27225:15;27255;27285:17;27183:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27351:85:::1;27365:6;27373;27381:14;27397;27413:10;27425;27351:13;:85::i;:::-;27330:106:::0;;-1:-1:-1;27330:106:0;-1:-1:-1;27447:12:0::1;27462:50;27488:7;27497:6:::0;27505;27462:25:::1;:50::i;:::-;27447:65;;27523:66;27555:6;27563:10;27575:4;27581:7;27523:31;:66::i;:::-;27600;27632:6;27640:10;27652:4;27658:7;27600:31;:66::i;:::-;27705:4;27689:26;;;27716:2;27689:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27689:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27689:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27689:30:0;26863:864;;;;-1:-1:-1;27689:30:0;;-1:-1:-1;26863:864:0;;-1:-1:-1;;;;;;;;;26863:864:0:o;27735:1106::-;28068:19;28102:17;28134;28026:8;25068:15;25056:8;:27;;25048:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28206:176:::1;28234:5;28254:4;28273:18;28306:9;28330:14;28359:12;28206:13;:176::i;:::-;28179:203:::0;;-1:-1:-1;28179:203:0;-1:-1:-1;28393:12:0::1;28408:47;28434:7;28443:5:::0;28450:4:::1;28408:25;:47::i;:::-;28393:62;;28466:69;28498:5;28505:10;28517:4;28523:11;28466:31;:69::i;:::-;28552:4;28546:19;;;28573:9;28546:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28546:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28546:39:0;;;;;28609:4;28603:20;;;28624:4;28630:9;28603:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28603:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28603:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28603:37:0;28596:45:::1;;;;28680:4;28664:26;;;28691:2;28664:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28664:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28664:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28664:30:0;;-1:-1:-1;28745:9:0::1;:21:::0;-1:-1:-1;28741:92:0::1;;;28768:65;28799:10;28823:9;28811;:21;28768:30;:65::i;:::-;25124:1;27735:1106:::0;;;;;;;;;;;:::o;10231:574::-;10367:17;10416:1;10405:8;:12;10397:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10497:1;10485:9;:13;:31;;;;;10515:1;10502:10;:14;10485:31;10477:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10573:23;10599:17;:8;10612:3;10599:17;:12;:17;:::i;:::-;10573:43;-1:-1:-1;10627:17:0;10647:31;10573:43;10667:10;10647:31;:19;:31;:::i;:::-;10627:51;-1:-1:-1;10689:19:0;10711:40;10735:15;10711:19;:9;10725:4;10711:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;10689:62;;10786:11;10774:9;:23;;;;;;;10231:574;-1:-1:-1;;;;;;;10231:574:0:o;12179:585::-;12317:24;12377:1;12362:4;:11;:16;;12354:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12449:4;:11;12435:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12435:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;12435:26:0;;12425:36;;12502:9;12472:7;12497:1;12480:7;:14;:18;12472:27;;;;;;;;;;;;;;;;;:39;12539:11;;:15;;12522:235;12556:5;;12522:235;;12584:17;12603:18;12625:42;12637:7;12646:4;12655:1;12651;:5;12646:11;;;;;;;;;;;;;;12659:4;12664:1;12659:7;;;;;;;;;;;;;;12625:11;:42::i;:::-;12583:84;;;;12699:46;12711:7;12719:1;12711:10;;;;;;;;;;;;;;12723:9;12734:10;12699:11;:46::i;:::-;12682:7;12694:1;12690;:5;12682:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;12563:3:0;;12522:235;;;;12179:585;;;;;:::o;8478:651::-;8601:12;8627:14;8643;8661:26;8672:6;8680;8661:10;:26::i;:::-;8906:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;8906:32:0;;;;;8896:43;;;;;;8785:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8785:291:0;;;;;;;8753:342;;;;;;;;;8478:651;-1:-1:-1;;;;;8478:651:0:o;11534:564::-;11672:24;11732:1;11717:4;:11;:16;;11709:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11804:4;:11;11790:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11790:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;11790:26:0;;11780:36;;11840:8;11827:7;11835:1;11827:10;;;;;;;;;;;;;:21;;;;;11864:9;11859:232;11893:1;11879:4;:11;:15;11875:1;:19;11859:232;;;11917:17;11936:18;11958:42;11970:7;11979:4;11984:1;11979:7;;;;;;;;;;;;;;11988:4;11993:1;11997;11993:5;11988:11;;;;;;;11958:42;11916:84;;;;12032:47;12045:7;12053:1;12045:10;;;;;;;;;;;;;;12057:9;12068:10;12032:12;:47::i;:::-;12015:7;12023:1;12027;12023:5;12015:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;11896:3:0;;11859:232;;1649:448;1920:51;;;1909:10;1920:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1920:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1920:51:0;179:29:-1;160:49;;1909:63:0;;;;1874:12;;1888:17;;1909:10;;;;1920:51;1909:63;;;25:18:-1;1909:63:0;;25:18:-1;36:153;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;;;1909:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1873:99:0;;;;1991:7;:57;;;;-1:-1:-1;2003:11:0;;:16;;:44;;;2034:4;2023:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2023:24:0;2003:44;1983:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:448;;;;;;:::o;33591:783::-;33735:9;33730:637;33764:1;33750:4;:11;:15;33746:1;:19;33730:637;;;33788:13;33803:14;33822:4;33827:1;33822:7;;;;;;;;;;;;;;33831:4;33836:1;33840;33836:5;33831:11;;;;;;;;;;;;;;33787:56;;;;33859:14;33879:43;33908:5;33915:6;33879:28;:43::i;:::-;33858:64;;;33937:17;33957:7;33965:1;33969;33965:5;33957:14;;;;;;;;;;;;;;33937:34;;33987:18;34007;34038:6;34029:15;;:5;:15;;;:101;;34108:9;34127:1;34029:101;;;34073:1;34077:9;34029:101;33986:144;;;;34145:10;34176:1;34162:4;:11;:15;34158:1;:19;:83;;34238:3;34158:83;;;34180:55;34206:7;34215:6;34223:4;34228:1;34232;34228:5;34223:11;;;;;;;;;;;;;;34180:25;:55::i;:::-;34145:96;;34272:49;34298:7;34307:5;34314:6;34272:25;:49::i;:::-;34256:71;;;34328:10;34340;34352:2;34256:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34256:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33767:3:0;;;;;-1:-1:-1;33730:637:0;;-1:-1:-1;;;;;;;;33730:637:0;;;33591:783;;;:::o;39204:1350::-;39317:9;39312:1235;39346:1;39332:4;:11;:15;39328:1;:19;39312:1235;;;39370:13;39385:14;39404:4;39409:1;39404:7;;;;;;;;;;;;;;39413:4;39418:1;39422;39418:5;39413:11;;;;;;;;;;;;;;39369:56;;;;39441:14;39461:43;39490:5;39497:6;39461:28;:43::i;:::-;39440:64;;;39519:20;39558:49;39584:7;39593:5;39600:6;39558:25;:49::i;:::-;39519:89;;39623:19;39657:20;39769:16;39787;39809:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39809:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39809:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39809:18:0;;;;;;;39768:59;;;;;-1:-1:-1;39768:59:0;;-1:-1:-1;39847:20:0;;39894:15;;;;;;;;:103;;39978:8;39988;39894:103;;;39934:8;39944;39894:103;39846:151;;;;40030:56;40073:12;40037:5;40030:23;;;40062:4;40030:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;40030:56:0;40016:70;;40120:72;40151:11;40164:12;40178:13;40120:30;:72::i;:::-;40105:87;;39312:1235;;;;40223:18;40243;40274:6;40265:15;;:5;:15;;;:107;;40347:12;40369:1;40265:107;;;40309:1;40313:12;40265:107;40222:150;;;;40387:10;40418:1;40404:4;:11;:15;40400:1;:19;:83;;40480:3;40400:83;;;40422:55;40448:7;40457:6;40465:4;40470:1;40474;40470:5;40465:11;;;;;;;40422:55;40387:96;;40498:4;:9;;;40508:10;40520;40532:2;40498:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40498:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;39349:3:0;;;;;-1:-1:-1;39312:1235:0;;-1:-1:-1;;;;;;;;;;39312:1235:0;;;39204:1350;;:::o;16844:136::-;16902:7;16929:43;16933:1;16936;16929:43;;;;;;;;;;;;;;;;;:3;:43::i;2105:200::-;2218:12;;;2178;2218;;;;;;;;;2196:7;;;;2211:5;;2196:35;;;;;;;;;;;;;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;;;2196:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2177:54:0;;;2250:7;2242:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10926:526;11062:16;11111:1;11099:9;:13;11091:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11193:1;11181:9;:13;:31;;;;;11211:1;11198:10;:14;11181:31;11173:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11269:17;11289:34;11318:4;11289:24;:9;11303;11289:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;11269:54;-1:-1:-1;11334:19:0;11356:34;11386:3;11356:25;:10;11371:9;11356:25;:14;:25;:::i;:34::-;11334:56;;11412:32;11442:1;11425:11;11413:9;:23;;;;;;;11412:32;:29;:32;:::i;:::-;11401:43;10926:526;-1:-1:-1;;;;;;10926:526:0:o;9740:369::-;9865:15;9911:1;9901:7;:11;9893:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9985:1;9974:8;:12;:28;;;;;10001:1;9990:8;:12;9974:28;9966:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10093:8;10069:21;:7;10081:8;10069:21;:11;:21;:::i;:::-;:32;;;;;;;9740:369;-1:-1:-1;;;;9740:369:0:o;1243:398::-;1475:45;;;1464:10;1475:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1475:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1475:45:0;179:29:-1;160:49;;1464:57:0;;;;1429:12;;1443:17;;1464:10;;;;1475:45;1464:57;;;25:18:-1;1464:57:0;;25:18:-1;36:153;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;;;1464:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1428:93:0;;;;1540:7;:57;;;;-1:-1:-1;1552:11:0;;:16;;:44;;;1583:4;1572:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1572:24:0;1552:44;1532:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1243:398;;;;;:::o;8035:351::-;8110:14;8126;8171:6;8161:16;;:6;:16;;;;8153:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8259:6;8250:15;;:6;:15;;;:53;;8288:6;8296;8250:53;;;8269:6;8277;8250:53;8231:72;;-1:-1:-1;8231:72:0;-1:-1:-1;8322:20:0;;;8314:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8035:351;;;;;:::o;25428:1427::-;25759:51;;;;;;:65;:51;;;;;;;;;;;;;;;;25658:15;;;;;;25778:7;25759:35;;;;;;:51;;;;;;;;;;;;;;;:35;:51;;;2:2:-1;;;;27:1;24;17:12;2:2;25759:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25759:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25759:51:0;:65;;;25755:152;;;25841:54;;;;;;:38;:54;;;;;;;;;;;;;;;;25860:7;25841:38;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;25841:38:0;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;25841:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25841:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;25755:152:0;25918:16;25936;25956:54;25986:7;25995:6;26003;25956:29;:54::i;:::-;25917:93;;;;26025:8;26037:1;26025:13;:30;;;;-1:-1:-1;26042:13:0;;26025:30;26021:827;;;26094:14;;-1:-1:-1;26110:14:0;;-1:-1:-1;26021:827:0;;;26158:22;26183:59;26207:14;26223:8;26233;26183:23;:59::i;:::-;26158:84;;26279:14;26261;:32;26257:580;;26340:10;26322:14;:28;;26314:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26435:14;;-1:-1:-1;26451:14:0;-1:-1:-1;26451:14:0;26257:580;;;26507:22;26532:59;26556:14;26572:8;26582;26532:23;:59::i;:::-;26507:84;;26635:14;26617;:32;;26610:40;;;;26695:10;26677:14;:28;;26669:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26790:14;-1:-1:-1;26806:14:0;;-1:-1:-1;26257:580:0;26021:827;;25428:1427;;;;;;;;;;;:::o;17768:471::-;17826:7;18071:6;18067:47;;-1:-1:-1;18101:1:0;18094:8;;18067:47;18138:5;;;18142:1;18138;:5;:1;18162:5;;;;;:10;18154:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16380:181;16438:7;16470:5;;;16494:6;;;;16486:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9187:440;9314:16;9332;9362:14;9382:26;9393:6;9401;9382:10;:26::i;:::-;9361:47;;;9420:16;9438;9476:32;9484:7;9493:6;9501;9476:7;:32::i;:::-;9460:61;;;:63;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9460:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9460:63:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9460:63:0;;;;;;;9419:104;;;;;-1:-1:-1;9419:104:0;;-1:-1:-1;9557:16:0;;;;;;;;:62;;9600:8;9610;9557:62;;;9577:8;9587;9557:62;9534:85;;;;-1:-1:-1;9187:440:0;-1:-1:-1;;;;;;;9187:440:0:o;17283:226::-;17403:7;17439:12;17431:6;;;;17423:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;17423:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17475:5:0;;;17283:226::o

Swarm Source

ipfs://299e6ec863a05b34facb61387047c1629d5fac978f54568d39a4d31919f46fcb
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.