Contract 0x67fa5b3e9f15b793caae1dc2996de029ca45591c

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9cd1213b304e295d433af80bb53a2f01a08fef24c8ecb2eabe94fc2ae3924040Approve146849112022-01-25 21:53:123 days 2 hrs ago0x0e9f75ac1ff509c3e6d9da6e55ced123fbf95532 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.0000758888
0x985fff2963d706821a42a525e5aa551d335779ec79a866a3f078da02ff47ef69Approve146337162022-01-24 3:07:544 days 21 hrs ago0x4d01d11697f00097064d7e05114ecd3843e82867 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.0000773482
0x9c1642cb9c033dad47a9d70df8274a4c03014739aeff607dfaaf58f785875220Approve146213902022-01-23 16:50:255 days 7 hrs ago0x6d8e5744652ca3a3a1f9ea2d7599af73db0dd7b8 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x5d82b8df12ae01b2be5d7fc18a6858d62dc7fd75b0aee7e0afd0c3d530d3b9e3Approve146016152022-01-23 0:20:416 days 28 mins ago0x8586a7996ba25b34b63e701508c2e982a975df5d IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x17c016f614673088d593bc4138ce65d52d1898baf5012d3ef47259f85386eb7dApprove145109172022-01-19 20:35:049 days 4 hrs ago0x8ed3ba834263fd93cb056217a40803efa3a0caaa IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x9a6859ae708dfe445ae290ce2d6e17e9b33053be5cad9705a774082ba6be97a7Approve144299692022-01-17 0:24:4112 days 24 mins ago0xdd82f9f47f2af05cc307840ed89d4d88fc9fc45f IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0xc61051a26fa623b5838bcdcc5712e544f2e239c157c974a61b4bffa0a6185279Approve140680492022-01-04 10:07:0224 days 14 hrs ago0x7c3f14075f6477fea1af6cf59f325afdfcd3ddf7 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x39c6ca8e60cdd44a6796956d86367d0786e3df5ae08b440808ae2d3a891deba4Approve139601342021-12-31 16:03:1728 days 8 hrs ago0xf9834f6e879d1230b5fc0a8eccc38774db3a9a3c IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.000222855
0xb0ada40f871ec2a3cc00906dc64bd9d62804481e7b743e667083d61132bdbc16Approve139283012021-12-30 13:30:0029 days 11 hrs ago0x7d98605d78341008b3dca7cd28985d26973c4d80 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x17a849d40f6632663b7df90bd6c36d4b8b20a798775c73842dca3e09166d906eTransfer138783132021-12-28 19:49:1031 days 4 hrs ago0xe7494ef69134936aee3a1275243422d586e63d5d IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00042096
0x6cd0e1c90994f3fa5804e8c43595955978ccb01a8b0b6489b16f4767560b44a0BUSD Withdraw138550132021-12-28 0:21:2232 days 27 mins ago0xa6ff79150f1743abd42e804a6b4102e87c20dfa6 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00075052
0x8e1e902238c4de6b9892b837dbd0789c5aa459d2abda509369cdb379afd4472aApprove137450762021-12-24 4:37:4335 days 20 hrs ago0x8e57fe4360fab5103e2b4af9c45abe19568c5786 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0xb9cbd7c081e05a8232138005954a610651aafed157bc0c41005c5ef805db1634Approve136531162021-12-20 23:18:0839 days 1 hr ago0xb1432fff0e1ef0ff1e18053adb2fa4eebc687a2f IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.000222855
0x8a8f0de4bf98fb0615902d145ce4cce3b9a77f11db2ad4150a93a53db0abb66fApprove134890842021-12-15 6:17:4844 days 18 hrs ago0xd537417892bb6d292aac3d1220fb4f7b586d7683 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.0000773482
0x65ba59d2e7f07fc2453d556e98739e0f616c91fc35fab44c5db6ef9aa7572dc9Approve131336022021-12-02 15:05:0957 days 9 hrs ago0xd17c9eab1df3b248830099185a53d9e1ac36f778 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x6b8d967a5e64330591bcb542955786769b68a6927968c4cef1daa378e8b55d21Approve130336962021-11-28 21:33:4261 days 3 hrs ago0xf2221a9e8a53f6636f5c3642bea37270297ba15a IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x2d420c50d5d1227fb5011a70cd6d43eb5d36d05f0ac6a1c20abcf5691e00bf84Approve130284412021-11-28 16:49:4461 days 7 hrs ago0xd77f1ff7bbad283165a811dafad396acdde84255 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x39f63a0a880a7559a066b19c21147a8e47dd237bb6fe30f131537f855c22ff39Approve128205772021-11-21 1:09:1168 days 23 hrs ago0x26bf2fb9da02f4236d80e0a2b844067b8b73f4e0 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.000222855
0x422d0782a757f7edef2baf36d4895e137cea5c81debc9eae8b209e92c868ef13BUSD Withdraw126638382021-11-15 7:37:1874 days 17 hrs ago0xec705d1d48c41f62bfffff751d5dfbaeba4b98d0 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00067552
0xe86873b0bb02c9cc603ab7baa1224af364f06570bcacbaf9a471753918c525d6Approve124846662021-11-08 21:38:4981 days 3 hrs ago0x29c96932857e9c97da7473cd22589880ed98c774 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x4fcc6b8494e42887a6fe22e8692d9f0fb85ed4c61334130181f95a20008d677aApprove124687182021-11-08 8:08:4481 days 16 hrs ago0x56e11b783b3d90d58eb921c7382af50976dfd421 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0xe14cec0a4c6ac30f3a0d572353c5f58ee363afdd596f9205b2001bd8f4a9cbc2Approve123995722021-11-05 22:08:0184 days 2 hrs ago0x4e694f20036fde8c04284201d47bb7a760dbf198 IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0xc17cdacc3ddb23c310481520bf824ee2b5f197b2972781b31ef4a0f584911d20Approve123975732021-11-05 20:27:3684 days 4 hrs ago0x81544e889021d90b8474b5c665d5ed020142334b IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.000124935
0x714122aaad7c96fa06817c8dd769fcd0660a2389bd1508f2579a924d6f9bcfa7Approve123973562021-11-05 20:16:4584 days 4 hrs ago0x81544e889021d90b8474b5c665d5ed020142334b IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
0x3809021a055cbd8f61a3b46f701b5c0b3bbe37584905d75a0a3b1ff7bc27e09aApprove123970882021-11-05 20:03:2184 days 4 hrs ago0x2f9994048ee63271f5beb337c902b74b93a0136a IN  0x67fa5b3e9f15b793caae1dc2996de029ca45591c0 BNB0.00007297
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x6cd0e1c90994f3fa5804e8c43595955978ccb01a8b0b6489b16f4767560b44a0138550132021-12-28 0:21:2232 days 27 mins ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.000488642794188574 BNB
0x422d0782a757f7edef2baf36d4895e137cea5c81debc9eae8b209e92c868ef13126638382021-11-15 7:37:1874 days 17 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.000002463995098845 BNB
0x869e81dd6ab8f9e8c06a830c60cc049f5a8c6531a03c81b73e463c93bf0edeed118837362021-10-18 15:53:45102 days 8 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.002163180168869707 BNB
0x446b2bac297cb3bf37933c4362b11ab77650ac3bcbb767624bd3e9495e8cbc02109350502021-09-15 12:07:04135 days 12 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.0000016740639005 BNB
0xf6a3bb08d7144b2370ff39a8149cba6f74ca8bc3f8d5c751c67cbac22cba544a103160692021-08-24 19:01:25157 days 5 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.001770310650275481 BNB
0x09a4dc0be66c241bb8b646585df958d2aed64906f55c7d0f802670f3ab88a7c8101505422021-08-19 0:07:23163 days 41 mins ago PancakeSwap: Router v2 0x67fa5b3e9f15b793caae1dc2996de029ca45591c0.00180263464601826 BNB
0x09a4dc0be66c241bb8b646585df958d2aed64906f55c7d0f802670f3ab88a7c8101505422021-08-19 0:07:23163 days 41 mins ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.575564738530426309 BNB
0x09a4dc0be66c241bb8b646585df958d2aed64906f55c7d0f802670f3ab88a7c8101505422021-08-19 0:07:23163 days 41 mins ago PancakeSwap: Router v2 0x67fa5b3e9f15b793caae1dc2996de029ca45591c0.587310957684109523 BNB
0x11fda9c84d642a988f65974f88572add22013b933db050d110d5b213777fd016100945122021-08-17 1:20:49164 days 23 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c0x36112f6ff2ae92922d696df80e8241cf06fc45c10.2 BNB
0x413fe61a615d4c3fad65baa6746ab7ae36a99d5c9a488820732947f05d103b8a95182742021-07-27 9:29:10185 days 15 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.012715286339389124 BNB
0x01c74dea3f824674432c969149592ec2f75646abecaab9cbdc13002eed631a1295182732021-07-27 9:29:07185 days 15 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.012715286339389124 BNB
0xadb8d552562832459632bbeb0f3048d7e901da02934c31061e943c61d3e9bd4688985472021-07-05 19:17:26207 days 5 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c0x36112f6ff2ae92922d696df80e8241cf06fc45c1106.515354789150346756 BNB
0x3bba2be39aa576f6072e89af088b8105630544ee03e3c93f7f5dd106ce01931f88985452021-07-05 19:17:20207 days 5 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.009032749290984096 BNB
0x5219cd381bb96e2f922889641b0ce35a653bbc9cacbd5c408b974f4dcc5a2b1788966492021-07-05 17:41:44207 days 7 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.012257933865869036 BNB
0x39f9f6d29812bb1de6a235434d65a0fddd19d9a945d0121d1c2b38acd236537888942062021-07-05 15:38:35207 days 9 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.004565861022499977 BNB
0x8c8913426c931a96f787551a8cca8693c5c05bbacdcd075bcf4a934c692a6a9f88928172021-07-05 14:27:01207 days 10 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.002211766351090296 BNB
0x82be086d5c2248c922769919a640d285e628433a8870ff4abbcb90387b1b0d5288925132021-07-05 14:11:28207 days 10 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.001472851082808713 BNB
0xfa2dea5fcf875c4b7b61fb4d281bfe6de0d384161b2b01a6b9408f238969587488923482021-07-05 14:02:24207 days 10 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.004640841838926506 BNB
0x83fb582fe50aee4b57c456fb3baf5f77032319af594ac16fcc5d628fbdacaf5188918372021-07-05 13:36:50207 days 11 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.001026235205428019 BNB
0xf975f703ad003a0b71173d2b68f4e67b71dd38425f7985f909f6ddeaa909763588910702021-07-05 12:57:14207 days 11 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.005972281745352072 BNB
0x75ee0e63e622b32ecbb9abf54b99b0e4f25a404cbaf8c536583b2a5cecfc8e5288910402021-07-05 12:55:38207 days 11 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.004909580988351065 BNB
0xb0aa78c94f5c1c1e62da47eec48db1f66ee7c47632f48975505185490d8a2ebb88909292021-07-05 12:49:59207 days 11 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.16261081797867428 BNB
0x967c6f77bee8f6752a2abf3d2d5b86f10fa2beb13eae5314fd0536aab2959a7f88908202021-07-05 12:44:32207 days 12 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.011607623363786821 BNB
0x1fc8086c1b9a4e2068020da028820c5f3d80242eaa39555cdf6533eff1f71c2a88882802021-07-05 10:37:23207 days 14 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.00655440921331059 BNB
0x47ab4069d68551b34291b767ef140332398a3aafef55b9d8c6d2814a1f78528d88855622021-07-05 8:19:11207 days 16 hrs ago 0x67fa5b3e9f15b793caae1dc2996de029ca45591c PancakeSwap: Router v20.03066000186807915 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Printr

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-27
*/

/**
 

                                                                       
        $$$$$$$\  $$$$$$$\  $$$$$$\ $$\   $$\ $$$$$$$$\ $$$$$$$$\ $$$$$$$\  
        $$  __$$\ $$  __$$\ \_$$  _|$$$\  $$ |\__$$  __|$$  _____|$$  __$$\ 
        $$ |  $$ |$$ |  $$ |  $$ |  $$$$\ $$ |   $$ |   $$ |      $$ |  $$ |
        $$$$$$$  |$$$$$$$  |  $$ |  $$ $$\$$ |   $$ |   $$$$$\    $$$$$$$  |
        $$  ____/ $$  __$$<   $$ |  $$ \$$$$ |   $$ |   $$  __|   $$  __$$< 
        $$ |      $$ |  $$ |  $$ |  $$ |\$$$ |   $$ |   $$ |      $$ |  $$ |
        $$ |      $$ |  $$ |$$$$$$\ $$ | \$$ |   $$ |   $$$$$$$$\ $$ |  $$ |
        \__|      \__|  \__|\______|\__|  \__|   \__|   \________|\__|  \__|
                                                                    
                                                                    
                                                                    
*/


// SPDX-License-Identifier: MIT
//Printr, hold $PRINTR and earn any token as a reward
//Holding ecosystem that force buyers to hold the coins, just hold and claim a token at your choice at anytime you like

pragma solidity ^0.8.4;

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IPancakeERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IPancakeRouter01 {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IPancakeRouter02 is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}




////////////////////////////////////////////////////////////////////////////////////////////////////////
//Printr Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract Printr is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
	
	address _BUSDTokenAddress = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _whiteList;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromStaking;
    
    mapping (address => bool) public _blacklist;
    bool isBlacklist = true;
    
    //Token Info 
    string private constant _name = 'PRINTR Multifarm';
    string private constant _symbol = 'PRINTR';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100 * 10**6 * 10**_decimals;//equals 100.000.000 token

    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for the Whitelist MaxBalance based on initial Supply(2%)
    uint16 public constant WhiteListBalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
    //Sellers get locked for MaxSellLockTime so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 10 seconds;
    //TODO: Change to 7 days
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime=1 hours;
    address public constant TeamWallet=0x36112f6FF2AE92922D696DF80e8241cf06Fc45c1;
    address public constant SecondTeamWallet=0xb899E794e3d0E1c564e3C6Db4ab174DB50ca817B;
    //TODO: Change to Mainnet
    //TestNet
    //address private constant PancakeRouter=0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
    //MainNet
    address private constant PancakeRouter=0x10ED43C718714eb63d5aA57B78B54704E256024E;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;

    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=20;
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _stakingTax;

       
    address private _pancakePairAddress; 
    IPancakeRouter02 private  _pancakeRouter;
    
    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet||addr==SecondTeamWallet;
    }


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply*9/10;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        //contract gets 10% of the token to generate LP token and Marketing Budget fase
        //contract will sell token over the first 200 sells to generate maximum LP and BNB
        uint256 injectBalance=_circulatingSupply-deployerBalance;
        _balances[address(this)]=injectBalance;
       emit Transfer(address(0), address(this),injectBalance);

        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;

       //Sets sellLockTime to be 2 seconds by default
        sellLockTime=2 seconds;

        //Set Starting Tax to very high percentage(36%) to achieve maximum burn in the beginning
        //as in the beginning there is the highest token volume
        //any change in tax rate needs to be below maxTax(20%)
        _buyTax=20;
        _sellTax=20;//Sell Tax is lower, as otherwise slippage would be too high to sell
        _transferTax=20;
        //97% gets burned
        _burnTax=3;
        //a small percentage gets added to the Contract token as 10% of token are already injected to 
        //be converted to LP and MarketingBNB
        _liquidityTax=20;
        _stakingTax=77;
        //Team wallet and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(msg.sender);
        //excludes Pancake Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(_pancakeRouter));
        _excludedFromStaking.add(_pancakePairAddress);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Transfer functionality////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter) 
        || (recipient == _pancakePairAddress && sender == pancakeRouter));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_pancakePairAddress|| sender == pancakeRouter;
        bool isSell=recipient==_pancakePairAddress|| recipient == pancakeRouter;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            if(whiteListTrading){
                _whiteListTransfer(sender,recipient,amount,isBuy,isSell);
            }
            else{
                _taxedTransfer(sender,recipient,amount,isBuy,isSell);                  
            }
        }
    }
    //if whitelist is active, all taxed transfers run through this
    function _whiteListTransfer(address sender, address recipient,uint256 amount,bool isBuy,bool isSell) private{
        //only apply whitelist restrictions during buys and transfers
        if(!isSell){
            //the recipient needs to be on Whitelist. Works for both buys and transfers.
            //transfers to other whitelisted addresses are allowed.
            require(_whiteList.contains(recipient),"recipient not on whitelist");
            //Limit is 1/500 of initialSupply during whitelist, to allow for a large whitelist without causing a massive
            //price impact of the whitelist
            require((_balances[recipient]+amount<=InitialSupply/WhiteListBalanceLimitDivider),"amount exceeds whitelist max");    
        }
        _taxedTransfer(sender,recipient,amount,isBuy,isSell);

    }  
    //applies taxes, checks for limits, locks generates autoLP and stakingBNB, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            if(isBlacklist) {
                require(!_blacklist[sender]);
            }
            if(!_excludedFromSellLock.contains(sender)){
                //If seller sold less than sellLockTime(2h) ago, sell is declined, can be disabled by Team         
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(50.000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            tax=_sellTax;

        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            tax=_buyTax;

        } else {//Transfer
            //withdraws BNB when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimFarmedToken(sender, _BUSDTokenAddress);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingBNB is only possible if sender is not pancake pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);
        


    }
    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //BNB Autostake/////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////// 
    //Autostake uses the balances of each holder to redistribute auto generated BNB.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawBNB can be used for any holder to withdraw BNB at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
    //marketing share starts at 80% to push initial marketing, after start
    //its capped to 50% max, the percentage of the staking that gets used for
    //marketing/paying the team
    uint8 public marketingShare=10;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, pancake and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //Total shares equals circulating supply minus excluded Balances
    function _getTotalShares() public view returns (uint256){
        uint256 shares=_circulatingSupply;
        //substracts all excluded from shares, excluded list is limited to 30
        // to avoid creating a Honeypot through OutOfGas exeption
        for(uint i=0; i<_excludedFromStaking.length(); i++){
            shares-=_balances[_excludedFromStaking.at(i)];
        }
        return shares;
    }

    //adds Token to balances, adds new BNB to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds BNB to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes bnb between marketing share and dividents 
    function _distributeStake(uint256 BNBamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (BNBamount * marketingShare) / 100;
        uint256 amount = BNBamount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            totalStakingReward += amount;
            uint256 totalShares=_getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawFarmedToken(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimFarmedToken(address addr, address tkn) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid BNB
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }
        totalPayouts+=amount;
        address[] memory path = new address[](2);
        path[0] = _pancakeRouter.WETH(); //BNB
        path[1] = tkn;  //FarmedToken

        _pancakeRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawFarmedToken(amount, addr);
        _isWithdrawing=false;
    }



    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    //tracks auto generated BNB, useful for ticker etc
    uint256 public totalLPBNB;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing BNB and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        uint256 tokenToSwap=sellLimit;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqBNBToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for BNB
        uint256 swapToken=liqBNBToken+tokenForMarketing;
        //Gets the initial BNB balance, so swap won't touch any staked BNB
        uint256 initialBNBBalance = address(this).balance;
        _swapTokenForBNB(swapToken);
        uint256 newBNB=(address(this).balance - initialBNBBalance);
        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP
        uint256 liqBNB = (newBNB*liqBNBToken)/swapToken;
        _addLiquidity(liqToken, liqBNB);
        //Get the BNB balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 distributeBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB between stakers and Marketing
        _distributeStake(distributeBNB);
    }
    //swaps tokens on the contract for BNB
    function _swapTokenForBNB(uint256 amount) private {
        _approve(address(this), address(_pancakeRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _pancakeRouter.WETH();

        _pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 bnbamount) private {
        totalLPBNB+=bnbamount;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //public functions /////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////// 
    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getBurnedTokens() public view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_stakingTax,_buyTax,_sellTax,_transferTax);
    }

    function getWhitelistedStatus(address AddressToCheck) public view returns(bool){
        return _whiteList.contains(AddressToCheck);
    }
    //How long is a given address still locked from selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }
    
    //Functions every wallet can call
    //Resets sell lock of caller to the default sellLockTime should something go very wrong
    function AddressResetSellLock() public{
        _sellLock[msg.sender]=block.timestamp+sellLockTime;
    }
    //withdraws dividents of sender
    function FarmedTokenWithdraw(address tokenAddress) public{
        claimFarmedToken(msg.sender, tokenAddress);
    }
	
	function BUSDWithdraw() public {
		claimFarmedToken(msg.sender, _BUSDTokenAddress);
	}
    function getDividends(address addr) public view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;

    //Excludes account from Staking
    function TeamExcludeFromStaking(address addr) public onlyTeam{
        //a long exluded list could lead to a Honeypot, therefore limit entries
        require(_excludedFromStaking.length()<30);
        require(!isExcludedFromStaking(addr));
        uint256 newDividents=_newDividentsOf(addr);
        alreadyPaidShares[addr]=_balances[addr]*profitPerShare;
        toBePaid[addr]+=newDividents;
        _excludedFromStaking.add(addr);
        
    }    

    //Includes excluded Account to staking
    function TeamIncludeToStaking(address addr) public onlyTeam{
        require(isExcludedFromStaking(addr));
        _excludedFromStaking.remove(addr);
        //sets alreadyPaidShares to the current amount
        alreadyPaidShares[addr]=_balances[addr]*profitPerShare;
    }

    function TeamWithdrawMarketingBNB() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    function TeamWithdrawMarketingBNB(uint256 amount) public onlyTeam{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        (bool sent,) =TeamWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 

    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyTeam{
        sellLockDisabled=disabled;
    }
    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyTeam{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 

    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyTeam{
        uint8 totalTax=burnTaxes+liquidityTaxes+stakingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax&&transferTax<=MaxTax,"taxes higher than max tax");
        
        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _stakingTax=stakingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //How much of the staking tax should be allocated for marketing
    function TeamChangeMarketingShare(uint8 newShare) public onlyTeam{
        require(newShare<=50); 
        marketingShare=newShare;
    }
    //manually converts contract token to LP and staking BNB
    function TeamCreateLPandBNB() public onlyTeam{
    _swapContractToken();
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromSellLock(address account) public onlyTeam {
        _excludedFromSellLock.add(account);
    }
    function TeamIncludeAccountToSellLock(address account) public onlyTeam {
        _excludedFromSellLock.remove(account);
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
        //SellLimit needs to be below 2% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/50);
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    bool public tradingEnabled;
    bool public whiteListTrading;
    address private _liquidityTokenAddress;
    //Enables whitelist trading and locks Liquidity for a short time
    function SetupEnableWhitelistTrading() public onlyTeam{
        require(!tradingEnabled);
        //Sets up the excluded from staking list
        tradingEnabled=true;
        whiteListTrading=true;
        //Liquidity gets locked for 7 days at start, needs to be prolonged once
        //start is successful
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
    }
    //Enables trading for everyone
    function SetupEnableTrading() public onlyTeam{
        require(tradingEnabled&&whiteListTrading);
        whiteListTrading=false;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyTeam{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    //Functions for whitelist
    function SetupAddToWhitelist(address addressToAdd) public onlyTeam{
        _whiteList.add(addressToAdd);
    }
    function SetupAddArrayToWhitelist(address[] memory addressesToAdd) public onlyTeam{
        for(uint i=0; i<addressesToAdd.length; i++){
            _whiteList.add(addressesToAdd[i]);
        }
    }
    function SetupRemoveFromWhitelist(address addressToRemove) public onlyTeam{
        _whiteList.remove(addressToRemove);
    } 
    
    
    function rescueTokens(address tknAddress) public onlyTeam {
        IBEP20 token = IBEP20(tknAddress);
        uint256 ourBalance = token.balanceOf(address(this));
        require(ourBalance>0, "No tokens in our balance");
        token.transfer(msg.sender, ourBalance);
    }
    
    // Blacklists
    
    function setBlacklistEnabled(bool isBlacklistEnabled) public onlyTeam {
        isBlacklist = isBlacklistEnabled;
    }
    
    function setBlacklistedAddress(address toBlacklist) public onlyTeam {
        _blacklist[toBlacklist] = true;
    }
    
    function removeBlacklistedAddress(address toRemove) public onlyTeam {
        _blacklist[toRemove] = false;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release. 
    //Should be called once start was successful.
    bool public liquidityRelease20Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyTeam{
        liquidityRelease20Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyTeam{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyTeam {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IPancakeERC20 liquidityToken = IPancakeERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another week
            amount=amount*2/10;
            liquidityToken.transfer(TeamWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(TeamWallet, amount);
        }
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity(bool addToStaking) public onlyTeam {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        IPancakeERC20 liquidityToken = IPancakeERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent){
            amount=amount*2/10; //only remove 20% each
        } 
        liquidityToken.approve(address(_pancakeRouter),amount);
        //Removes Liquidity and either distributes liquidity BNB to stakers, or 
        // adds them to marketing Balance
        //Token will be converted
        //to Liquidity and Staking BNB again
        uint256 initialBNBBalance = address(this).balance;
        _pancakeRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        uint256 newBNBBalance = address(this).balance-initialBNBBalance;
        if(addToStaking){
            _distributeStake(newBNBBalance);
        }
        else{
            marketingBalance+=newBNBBalance;
        }

    }
    //Releases all remaining BNB on the contract wallet, so BNB wont be burned
    //Can only be called 30 days after Liquidity unlocks 
    function TeamRemoveRemainingBNB() public onlyTeam{
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}
    fallback() external payable {}
    // IBEP20

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IBEP20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawFarmedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BUSDWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"FarmedTokenWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SecondTeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressesToAdd","type":"address[]"}],"name":"SetupAddArrayToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAdd","type":"address"}],"name":"SetupAddToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetupEnableWhitelistTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"SetupRemoveFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamExcludeFromStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"TeamIncludeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"TeamRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualBNBConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListBalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getWhitelistedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityRelease20Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"removeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600480546001600160a01b03191673e9e7cea3dedca5984780bafc599bd69add087d56179055600e805460ff19166001179055620000456009600a620005c1565b62000055906305f5e10062000680565b600f81905560108190556011556017805460ff1916600a1790553480156200007c57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000600a600f546009620000d3919062000680565b620000df919062000557565b336000818152600160205260408082208490555192935090916000805160206200485983398151915290620001179085815260200190565b60405180910390a3600081600f54620001319190620006a2565b306000818152600160205260408082208490555192935090916000805160206200485983398151915290620001699085815260200190565b60405180910390a3601380546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001d157600080fd5b505afa158015620001e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020c919062000527565b6001600160a01b031663c9c6539630601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026a57600080fd5b505afa1580156200027f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a5919062000527565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002ee57600080fd5b505af115801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000527565b601280546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003676009600a620005c1565b62000377906305f5e10062000680565b62000383919062000557565b6010556064620003966009600a620005c1565b620003a6906305f5e10062000680565b620003b2919062000557565b6011556002601d556012805465ffffffffffff1916654d1403141414179055620003fe60057336112f6ff2ae92922d696df80e8241cf06fc45c1620004b5602090811b6200250c17901c565b506200041a336005620004b560201b6200250c1790919060201c565b506013546200044190600b906001600160a01b0316620004b5602090811b6200250c17901c565b5062000472601260069054906101000a90046001600160a01b0316600b620004b560201b6200250c1790919060201c565b506200048e30600b620004b560201b6200250c1790919060201c565b50620004ac61dead600b620004b560201b6200250c1790919060201c565b505050620006d2565b6000620004cc836001600160a01b038416620004d5565b90505b92915050565b60008181526001830160205260408120546200051e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004cf565b506000620004cf565b60006020828403121562000539578081fd5b81516001600160a01b038116811462000550578182fd5b9392505050565b6000826200057357634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115620005b95781600019048211156200059d576200059d620006bc565b80851615620005ab57918102915b93841c93908002906200057d565b509250929050565b6000620004cc60ff841683600082620005dd57506001620004cf565b81620005ec57506000620004cf565b8160018114620006055760028114620006105762000630565b6001915050620004cf565b60ff841115620006245762000624620006bc565b50506001821b620004cf565b5060208310610133831016604e8410600b841016171562000655575081810a620004cf565b62000661838362000578565b8060001904821115620006785762000678620006bc565b029392505050565b60008160001904831182151516156200069d576200069d620006bc565b500290565b600082821015620006b757620006b7620006bc565b500390565b634e487b7160e01b600052601160045260246000fd5b61417780620006e26000396000f3fe6080604052600436106104515760003560e01c806373ddf08e1161023d578063c3a3c03211610138578063e69e03ee116100bb578063f00df36511610082578063f00df36514610dab578063f24a1e7014610dc1578063f2fde38b14610dd6578063f88b0e4614610df6578063f9963ca114610e0c578063ffcfadde14610e2c57005b8063e69e03ee14610d21578063e77bf5f814610d36578063e8d834a614610d56578063ead8acb014610d76578063eb8e886314610d9657005b8063d63607d8116100ff578063d63607d814610c66578063d8e8de3414610c7b578063da1144d614610c9b578063dd62ed3e14610cbb578063dff6bcbf14610d0157005b8063c3a3c03214610be7578063c3f4f54f14610bfc578063ce7de67614610c11578063d108d24814610c31578063d51f383b14610c4657005b8063893d20e8116101c05780639fa62d5f116101875780639fa62d5f14610b37578063a20623ce14610b57578063a457c2d714610b87578063a9059cbb14610ba7578063b76289b814610bc757005b8063893d20e814610ab45780638d060d7714610ad25780638d2c503914610ae85780638da5cb5b14610ab457806395d89b4114610b0857005b80638650e92a116102045780638650e92a14610a3057806386d0ada814610a465780638724cc7214610a605780638728ecd114610a75578063887c60fb14610a9557005b806373ddf08e146109b0578063762bb282146109d05780637b9e987a146109e65780637f919373146109fb578063852147f714610a1057005b80633478154b1161034d5780634f91e48c116102d05780636f89e409116102975780636f89e409146108fb57806370a0823114610925578063715018a61461095b57806371ab1f09146109705780637335307b1461099057005b80634f91e48c1461086757806357ad67d11461087d578063588aeaf21461089d57806358e55365146108bd578063677a8870146108d357005b80634634d81c116103145780634634d81c146107d957806348e53164146107f957806349bdf8731461080e5780634ada218b146108285780634cdaf0ae1461084757005b80633478154b14610759578063395093511461076e5780633c7a309b1461078e5780633d8dbf5d146107a35780634089b170146107c357005b806314e91377116103d55780632973ef2d1161039c5780632973ef2d146106875780632c889d18146106f0578063311a869714610710578063313ce567146107255780633328b7211461073957005b806314e91377146105dd57806318160ddd146105fd5780631eb25d1314610612578063230ffc421461062757806323b872dd1461066757005b80630d54c1d8116104195780630d54c1d8146105415780630fd99e16146105615780631193c691146105895780631201cbd01461059e5780631285073c146105be57005b8062ae3bf81461045a57806306fdde031461047a57806309218ee7146104c5578063095ea7b3146104f15780630b1daa3e1461052157005b3661045857005b005b34801561046657600080fd5b50610458610475366004613b03565b610e41565b34801561048657600080fd5b5060408051808201909152601081526f5052494e5452204d756c74696661726d60801b60208201525b6040516104bc9190613e9b565b60405180910390f35b3480156104d157600080fd5b506017546104df9060ff1681565b60405160ff90911681526020016104bc565b3480156104fd57600080fd5b5061051161050c366004613bb3565b610fc3565b60405190151581526020016104bc565b34801561052d57600080fd5b5061045861053c366004613b03565b610fda565b34801561054d57600080fd5b5061045861055c366004613b03565b61100e565b34801561056d57600080fd5b50610576606481565b60405161ffff90911681526020016104bc565b34801561059557600080fd5b5061045861101b565b3480156105aa57600080fd5b506104586105b9366004613ca5565b611077565b3480156105ca57600080fd5b50601d545b6040519081526020016104bc565b3480156105e957600080fd5b506104586105f8366004613ca5565b6110af565b34801561060957600080fd5b50600f546105cf565b34801561061e57600080fd5b506105cf6110ee565b34801561063357600080fd5b5061064f73b899e794e3d0e1c564e3c6db4ab174db50ca817b81565b6040516001600160a01b0390911681526020016104bc565b34801561067357600080fd5b50610511610682366004613b73565b61110b565b34801561069357600080fd5b506012546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016104bc565b3480156106fc57600080fd5b5061045861070b366004613cdd565b6111a2565b34801561071c57600080fd5b506104df603281565b34801561073157600080fd5b5060096104df565b34801561074557600080fd5b50610458610754366004613b03565b6111d9565b34801561076557600080fd5b50610576600a81565b34801561077a57600080fd5b50610511610789366004613bb3565b61121f565b34801561079a57600080fd5b50610458611256565b3480156107af57600080fd5b506104586107be366004613b03565b61145e565b3480156107cf57600080fd5b506105cf60165481565b3480156107e557600080fd5b506105cf6107f4366004613b03565b6114a7565b34801561080557600080fd5b506104586114ff565b34801561081a57600080fd5b506020546105119060ff1681565b34801561083457600080fd5b50601e5461051190610100900460ff1681565b34801561085357600080fd5b50610458610862366004613b03565b61151e565b34801561087357600080fd5b506105cf60115481565b34801561088957600080fd5b50610458610898366004613d75565b61156f565b3480156108a957600080fd5b506104586108b8366004613b03565b611702565b3480156108c957600080fd5b506105cf60185481565b3480156108df57600080fd5b5061064f7336112f6ff2ae92922d696df80e8241cf06fc45c181565b34801561090757600080fd5b50610910611732565b604080519283526020830191909152016104bc565b34801561093157600080fd5b506105cf610940366004613b03565b6001600160a01b031660009081526001602052604090205490565b34801561096757600080fd5b5061045861176f565b34801561097c57600080fd5b50601e546105119062010000900460ff1681565b34801561099c57600080fd5b506105116109ab366004613b03565b611822565b3480156109bc57600080fd5b506104586109cb366004613d5b565b61182f565b3480156109dc57600080fd5b506105cf60105481565b3480156109f257600080fd5b5061045861187b565b348015610a0757600080fd5b506104586118d6565b348015610a1c57600080fd5b50610458610a2b366004613b03565b6119a9565b348015610a3c57600080fd5b506105cf60145481565b348015610a5257600080fd5b50601e546105119060ff1681565b348015610a6c57600080fd5b50610576603281565b348015610a8157600080fd5b506105cf610a90366004613b03565b611a2e565b348015610aa157600080fd5b50601c5461051190610100900460ff1681565b348015610ac057600080fd5b506000546001600160a01b031661064f565b348015610ade57600080fd5b506105cf601b5481565b348015610af457600080fd5b50610458610b03366004613ca5565b611a6d565b348015610b1457600080fd5b50604080518082019091526006815265282924a72a2960d11b60208201526104af565b348015610b4357600080fd5b50610458610b52366004613d0d565b611aa5565b348015610b6357600080fd5b50610511610b72366004613b03565b600d6020526000908152604090205460ff1681565b348015610b9357600080fd5b50610511610ba2366004613bb3565b611c13565b348015610bb357600080fd5b50610511610bc2366004613bb3565b611c8f565b348015610bd357600080fd5b50610458610be2366004613b03565b611c9c565b348015610bf357600080fd5b506105cf611ccc565b348015610c0857600080fd5b506105cf611cec565b348015610c1d57600080fd5b50610458610c2c366004613b03565b611d2b565b348015610c3d57600080fd5b50610458611df3565b348015610c5257600080fd5b50610458610c61366004613cdd565b611e0c565b348015610c7257600080fd5b50610458611e87565b348015610c8757600080fd5b50610511610c96366004613b03565b611ebb565b348015610ca757600080fd5b50610458610cb6366004613bde565b611ec8565b348015610cc757600080fd5b506105cf610cd6366004613b3b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610d0d57600080fd5b50610458610d1c366004613b03565b611f47565b348015610d2d57600080fd5b506105cf611f77565b348015610d4257600080fd5b50610458610d51366004613b03565b611fdd565b348015610d6257600080fd5b50610458610d71366004613ca5565b61200d565b348015610d8257600080fd5b50610458610d91366004613cdd565b61228a565b348015610da257600080fd5b506104df601481565b348015610db757600080fd5b506105cf60155481565b348015610dcd57600080fd5b506104586122f8565b348015610de257600080fd5b50610458610df1366004613b03565b612386565b348015610e0257600080fd5b506105cf601d5481565b348015610e1857600080fd5b50610458610e27366004613b03565b6124af565b348015610e3857600080fd5b506104586124df565b610e4a33612521565b610e6f5760405162461bcd60e51b8152600401610e6690613eee565b60405180910390fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b158015610eb357600080fd5b505afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb9190613cf5565b905060008111610f3d5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401610e66565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015610f8557600080fd5b505af1158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190613cc1565b50505050565b6000610fd0338484612586565b5060015b92915050565b610fe333612521565b610fff5760405162461bcd60e51b8152600401610e6690613eee565b61100a600982612679565b5050565b611018338261268e565b50565b61102433612521565b6110405760405162461bcd60e51b8152600401610e6690613eee565b601e54610100900460ff161561105557600080fd5b601e805462ffff00191662010100179055611072610e1042613f56565b601f55565b61108033612521565b61109c5760405162461bcd60e51b8152600401610e6690613eee565b600e805460ff1916911515919091179055565b6110b833612521565b6110d45760405162461bcd60e51b8152600401610e6690613eee565b601c80549115156101000261ff0019909216919091179055565b6110fa6009600a613ff6565b611108906305f5e1006140a1565b81565b600061111884848461296c565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156111835760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610e66565b611197853361119286856140c0565b612586565b506001949350505050565b6111ab33612521565b6111c75760405162461bcd60e51b8152600401610e6690613eee565b6110186111d44283613f56565b612be7565b6111e233612521565b6111fe5760405162461bcd60e51b8152600401610e6690613eee565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610fd0918590611192908690613f56565b61125f33612521565b61127b5760405162461bcd60e51b8152600401610e6690613eee565b601f544210156112c05760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610e66565b601e546040516370a0823160e01b815230600482015263010000009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561130e57600080fd5b505afa158015611322573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113469190613cf5565b60205490915060ff161561141757611360610e1042613f56565b601f55600a6113708260026140a1565b61137a9190613f93565b60405163a9059cbb60e01b81527336112f6ff2ae92922d696df80e8241cf06fc45c16004820152602481018290529091506001600160a01b0383169063a9059cbb906044015b602060405180830381600087803b1580156113da57600080fd5b505af11580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114129190613cc1565b505050565b60405163a9059cbb60e01b81527336112f6ff2ae92922d696df80e8241cf06fc45c16004820152602481018290526001600160a01b0383169063a9059cbb906044016113c0565b61146733612521565b6114835760405162461bcd60e51b8152600401610e6690613eee565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b60006114b282611822565b156114d357506001600160a01b03166000908152601a602052604090205490565b6001600160a01b0382166000908152601a60205260409020546114f583612bf5565b610fd49190613f56565b601d5461150c9042613f56565b33600090815260036020526040902055565b61152733612521565b6115435760405162461bcd60e51b8152600401610e6690613eee565b601e80546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b61157833612521565b6115945760405162461bcd60e51b8152600401610e6690613eee565b6000846115a18789613f6e565b6115ab9190613f6e565b90508060ff1660641461160f5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610e66565b601460ff8516118015906116275750601460ff841611155b80156116375750601460ff831611155b6116835760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610e66565b506012805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b61170b33612521565b6117275760405162461bcd60e51b8152600401610e6690613eee565b61100a60058261250c565b6000806117416009600a613ff6565b60105461174e9190613f93565b61175a6009600a613ff6565b6011546117679190613f93565b915091509091565b336117826000546001600160a01b031690565b6001600160a01b0316146117d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e66565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610fd4600b83612c7b565b61183833612521565b6118545760405162461bcd60e51b8152600401610e6690613eee565b60328160ff16111561186557600080fd5b6017805460ff191660ff92909216919091179055565b61188433612521565b6118a05760405162461bcd60e51b8152600401610e6690613eee565b601e54610100900460ff1680156118bf5750601e5462010000900460ff165b6118c857600080fd5b601e805462ff000019169055565b6118df33612521565b6118fb5760405162461bcd60e51b8152600401610e6690613eee565b601880546000918290556040519091907336112f6ff2ae92922d696df80e8241cf06fc45c19083905b60006040518083038185875af1925050503d8060008114611961576040519150601f19603f3d011682016040523d82523d6000602084013e611966565b606091505b505090508061100a5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610e66565b6119b233612521565b6119ce5760405162461bcd60e51b8152600401610e6690613eee565b6119d781611822565b6119e057600080fd5b6119eb600b82612679565b506014546001600160a01b038216600090815260016020526040902054611a1291906140a1565b6001600160a01b03909116600090815260196020526040902055565b6001600160a01b038116600090815260036020526040812054428111611a575750600092915050565b611a6142826140c0565b9392505050565b905090565b611a7633612521565b611a925760405162461bcd60e51b8152600401610e6690613eee565b601e805460ff1916911515919091179055565b611aae33612521565b611aca5760405162461bcd60e51b8152600401610e6690613eee565b6032600f54611ad99190613f93565b8110611ae457600080fd5b611af06009600a613ff6565b611afa90836140a1565b9150611b086009600a613ff6565b611b1290826140a1565b90506000603260ff16600f54611b289190613f93565b90506000606461ffff16600f54611b3f9190613f93565b905081841015611ba55760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610e66565b80831015611c065760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610e66565b5050601091909155601155565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c765760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610e66565b611c85338561119286856140c0565b5060019392505050565b6000610fd033848461296c565b611ca533612521565b611cc15760405162461bcd60e51b8152600401610e6690613eee565b61100a60078261250c565b6000601f54421015611ce65742601f54611a6891906140c0565b50600090565b6000611cfa6009600a613ff6565b600f54611d096009600a613ff6565b611d17906305f5e1006140a1565b611d2191906140c0565b611a689190613f93565b611d3433612521565b611d505760405162461bcd60e51b8152600401610e6690613eee565b601e611d5c600b612c9d565b10611d6657600080fd5b611d6f81611822565b15611d7957600080fd5b6000611d8482612bf5565b6014546001600160a01b038416600090815260016020526040902054919250611dac916140a1565b6001600160a01b038316600090815260196020908152604080832093909355601a90529081208054839290611de2908490613f56565b909155506114129050600b8361250c565b600454611e0a9033906001600160a01b031661268e565b565b611e1533612521565b611e315760405162461bcd60e51b8152600401610e6690613eee565b600a811115611e825760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610e66565b601d55565b611e9033612521565b611eac5760405162461bcd60e51b8152600401610e6690613eee565b6020805460ff19166001179055565b6000610fd4600783612c7b565b611ed133612521565b611eed5760405162461bcd60e51b8152600401610e6690613eee565b60005b815181101561100a57611f34828281518110611f1c57634e487b7160e01b600052603260045260246000fd5b6020026020010151600761250c90919063ffffffff16565b5080611f3f816140d7565b915050611ef0565b611f5033612521565b611f6c5760405162461bcd60e51b8152600401610e6690613eee565b61100a600582612679565b600f54600090815b611f89600b612c9d565b811015611fd75760016000611f9f600b84612ca7565b6001600160a01b03168152602081019190915260400160002054611fc390836140c0565b915080611fcf816140d7565b915050611f7f565b50919050565b611fe633612521565b6120025760405162461bcd60e51b8152600401610e6690613eee565b61100a600782612679565b61201633612521565b6120325760405162461bcd60e51b8152600401610e6690613eee565b601f544210156120775760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610e66565b612083610e1042613f56565b601f55601e546040516370a0823160e01b815230600482015263010000009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b1580156120d457600080fd5b505afa1580156120e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210c9190613cf5565b60205490915060ff161561213457600a6121278260026140a1565b6121319190613f93565b90505b60135460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b15801561218257600080fd5b505af1158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba9190613cc1565b5060135460405163af2979eb60e01b815247916001600160a01b03169063af2979eb906121f69030908690600090819084904290600401613e2b565b602060405180830381600087803b15801561221057600080fd5b505af1158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190613cf5565b50600061225582476140c0565b9050841561226b5761226681612cb3565b612283565b806018600082825461227d9190613f56565b90915550505b5050505050565b61229333612521565b6122af5760405162461bcd60e51b8152600401610e6690613eee565b6018548111156122be57600080fd5b80601860008282546122d091906140c0565b90915550506040516000907336112f6ff2ae92922d696df80e8241cf06fc45c1908390611924565b61230133612521565b61231d5760405162461bcd60e51b8152600401610e6690613eee565b6040516000907336112f6ff2ae92922d696df80e8241cf06fc45c19047908381818185875af1925050503d8060008114612373576040519150601f19603f3d011682016040523d82523d6000602084013e612378565b606091505b505090508061101857600080fd5b336123996000546001600160a01b031690565b6001600160a01b0316146123ef5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e66565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e66565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6124b833612521565b6124d45760405162461bcd60e51b8152600401610e6690613eee565b61100a60098261250c565b6124e833612521565b6125045760405162461bcd60e51b8152600401610e6690613eee565b611e0a612d7b565b6000611a61836001600160a01b038416612ebb565b600080546001600160a01b038381169116148061255a57506001600160a01b0382167336112f6ff2ae92922d696df80e8241cf06fc45c1145b80610fd457506001600160a01b03821673b899e794e3d0e1c564e3c6db4ab174db50ca817b1492915050565b6001600160a01b0383166125d05760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610e66565b6001600160a01b0382166126185760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610e66565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611a61836001600160a01b038416612f0a565b601354600160a01b900460ff16156126a557600080fd5b6013805460ff60a01b1916600160a01b17905560006126c383611822565b156126eb57506001600160a01b0382166000908152601a60205260408120805491905561276b565b60006126f684612bf5565b6001600160a01b03851660009081526001602052604090205460145491925061271e916140a1565b6001600160a01b038516600090815260196020908152604080832093909355601a9052205461274e908290613f56565b6001600160a01b0385166000908152601a60205260408120559150505b806127825750506013805460ff60a01b1916905550565b80601660008282546127949190613f56565b90915550506040805160028082526060820183526000926020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128369190613b1f565b8160008151811061285757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061289957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260135460405163b6f9de9560e01b815291169063b6f9de959084906128df9060009086908a904290600401613e66565b6000604051808303818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050604080518681526001600160a01b03891660208201527f460fc16181df188bd2ec645a6f6dbe15da259268704aabeb2a5b7c94427e712994500191506129519050565b60405180910390a150506013805460ff60a01b191690555050565b6001600160a01b0383166129b75760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610e66565b6001600160a01b038216612a005760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610e66565b6000612a0d600585612c7b565b80612a1e5750612a1e600584612c7b565b905060006001600160a01b038516301480612a4157506001600160a01b03841630145b6013546012549192506001600160a01b0390811691600091888116600160301b90920416148015612a835750816001600160a01b0316866001600160a01b0316145b80612abe57506012546001600160a01b03878116600160301b90920416148015612abe5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b909204161480612af85750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b909204161480612b325750836001600160a01b0316886001600160a01b0316145b90508480612b3d5750825b80612b455750855b15612b5a57612b55898989613021565b612bdc565b601e54610100900460ff16612bb15760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610e66565b601e5462010000900460ff1615612bcf57612b5589898985856130ec565b612bdc89898985856131e9565b505050505050505050565b601f54811161107257600080fd5b6001600160a01b0381166000908152600160205260408120546014548291612c1c916140a1565b6001600160a01b038416600090815260196020526040902054909150811015612c485750600092915050565b6001600160a01b038316600090815260196020526040902054600160401b90612c7190836140c0565b611a619190613f93565b6001600160a01b03811660009081526001830160205260408120541515611a61565b6000610fd4825490565b6000611a61838361364c565b601754600090606490612cc99060ff16846140a1565b612cd39190613f93565b90506000612ce182846140c0565b90508160186000828254612cf59190613f56565b90915550508015611412578060156000828254612d129190613f56565b9091555060009050612d22611f77565b905080612d46578160186000828254612d3b9190613f56565b90915550610fbd9050565b80612d55600160401b846140a1565b612d5f9190613f93565b60146000828254612d709190613f56565b909155505050505050565b601c805460ff191660019081179091553060009081526020919091526040812054601254909190612dc190600160281b810460ff90811691640100000000900416613f6e565b60ff1690506000601154905080831080612ddd575061ffff8216155b15612dea57505050612eaf565b60125460009061ffff841690612e0b90640100000000900460ff16846140a1565b612e159190613f93565b90506000612e2382846140c0565b90506000612e32600284613f93565b90506000612e4082856140c0565b90506000612e4e8483613f56565b905047612e5a826136e0565b6000612e6682476140c0565b9050600083612e7586846140a1565b612e7f9190613f93565b9050612e8b8682613864565b6000612e9784476140c0565b9050612ea281612cb3565b5050505050505050505050505b601c805460ff19169055565b6000818152600183016020526040812054612f0257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fd4565b506000610fd4565b60008181526001830160205260408120548015613017576000612f2e6001836140c0565b8554909150600090612f42906001906140c0565b90506000866000018281548110612f6957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612f9a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260018901909152604090208490558654879080612fdb57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610fd4565b6000915050610fd4565b6001600160a01b038316600090815260016020526040902054818110156130855760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e66565b61308f8483613922565b61309983836139e3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516130de91815260200190565b60405180910390a350505050565b806131e0576130fc600785612c7b565b6131485760405162461bcd60e51b815260206004820152601a60248201527f726563697069656e74206e6f74206f6e2077686974656c6973740000000000006044820152606401610e66565b60326131566009600a613ff6565b613164906305f5e1006140a1565b61316e9190613f93565b6001600160a01b038516600090815260016020526040902054613192908590613f56565b11156131e05760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e7420657863656564732077686974656c697374206d6178000000006044820152606401610e66565b61228385858585855b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156132575760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610e66565b6000831561338a57600e5460ff1615613290576001600160a01b0388166000908152600d602052604090205460ff161561329057600080fd5b61329b600989612c7b565b613335576001600160a01b038816600090815260036020526040902054421015806132cd5750601c54610100900460ff165b61330e5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610e66565b601d5461331b9042613f56565b6001600160a01b0389166000908152600360205260409020555b6011548611156133795760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610e66565b50601254610100900460ff166134e9565b84156133ea5760105461339d8785613f56565b11156133de5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610e66565b5060125460ff166134e9565b6133f66009600a613ff6565b8611613413576004546134139089906001600160a01b031661268e565b6010546134208785613f56565b11156134615760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610e66565b61346c600989612c7b565b6134db576001600160a01b0388166000908152600360205260409020544210158061349e5750601c54610100900460ff165b6134db5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610e66565b5060125462010000900460ff165b6012546001600160a01b03898116600160301b90920416148015906135115750601e5460ff16155b80156135205750601c5460ff16155b80156135295750835b1561353657613536612d7b565b60006135528783601260039054906101000a900460ff16613aae565b60125490915060009061358690899085906135819060ff6401000000008204811691600160281b900416613f6e565b613aae565b905060006135948284613f56565b61359e908a6140c0565b90506135aa8b8a613922565b30600090815260016020526040812080548492906135c9908490613f56565b9250508190555082600f60008282546135e291906140c0565b909155506135f290508a826139e3565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161363791815260200190565b60405180910390a35050505050505050505050565b815460009082106136aa5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610e66565b8260000182815481106136cd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6013546136f89030906001600160a01b031683612586565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061373b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561378f57600080fd5b505afa1580156137a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c79190613b1f565b816001815181106137e857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac9479061382e908590600090869030904290600401613f1a565b600060405180830381600087803b15801561384857600080fd5b505af115801561385c573d6000803e3d6000fd5b505050505050565b80601b60008282546138769190613f56565b90915550506013546138939030906001600160a01b031684612586565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906138d09030908790600090819084904290600401613e2b565b6060604051808303818588803b1580156138e957600080fd5b505af11580156138fd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122839190613d2e565b6001600160a01b0382166000908152600160205260408120546139469083906140c0565b905061395183611822565b15613976576001600160a01b0390921660009081526001602052604090209190915550565b600061398184612bf5565b6001600160a01b03851660009081526001602052604090208390556014549091506139ad9083906140a1565b6001600160a01b038516600090815260196020908152604080832093909355601a90529081208054839290612d70908490613f56565b6001600160a01b038216600090815260016020526040812054613a07908390613f56565b9050613a1283611822565b15613a37576001600160a01b0390921660009081526001602052604090209190915550565b6000613a4284612bf5565b905081601454613a5291906140a1565b6001600160a01b038516600090815260196020908152604080832093909355601a90529081208054839290613a88908490613f56565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff1686613ac691906140a1565b613ad091906140a1565b613ada9190613f93565b949350505050565b8035613aed8161411e565b919050565b803560ff81168114613aed57600080fd5b600060208284031215613b14578081fd5b8135611a618161411e565b600060208284031215613b30578081fd5b8151611a618161411e565b60008060408385031215613b4d578081fd5b8235613b588161411e565b91506020830135613b688161411e565b809150509250929050565b600080600060608486031215613b87578081fd5b8335613b928161411e565b92506020840135613ba28161411e565b929592945050506040919091013590565b60008060408385031215613bc5578182fd5b8235613bd08161411e565b946020939093013593505050565b60006020808385031215613bf0578182fd5b823567ffffffffffffffff80821115613c07578384fd5b818501915085601f830112613c1a578384fd5b813581811115613c2c57613c2c614108565b8060051b604051601f19603f83011681018181108582111715613c5157613c51614108565b604052828152858101935084860182860187018a1015613c6f578788fd5b8795505b83861015613c9857613c8481613ae2565b855260019590950194938601938601613c73565b5098975050505050505050565b600060208284031215613cb6578081fd5b8135611a6181614133565b600060208284031215613cd2578081fd5b8151611a6181614133565b600060208284031215613cee578081fd5b5035919050565b600060208284031215613d06578081fd5b5051919050565b60008060408385031215613d1f578182fd5b50508035926020909101359150565b600080600060608486031215613d42578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215613d6c578081fd5b611a6182613af2565b60008060008060008060c08789031215613d8d578182fd5b613d9687613af2565b9550613da460208801613af2565b9450613db260408801613af2565b9350613dc060608801613af2565b9250613dce60808801613af2565b9150613ddc60a08801613af2565b90509295509295509295565b6000815180845260208085019450808401835b83811015613e205781516001600160a01b031687529582019590820190600101613dfb565b509495945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b848152608060208201526000613e7f6080830186613de8565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b81811015613ec757858101830151858201604001528201613eab565b81811115613ed85783604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b85815284602082015260a060408201526000613f3960a0830186613de8565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613f6957613f696140f2565b500190565b600060ff821660ff84168060ff03821115613f8b57613f8b6140f2565b019392505050565b600082613fae57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115613fee578160001904821115613fd457613fd46140f2565b80851615613fe157918102915b93841c9390800290613fb8565b509250929050565b6000611a6160ff84168360008261400f57506001610fd4565b8161401c57506000610fd4565b8160018114614032576002811461403c57614058565b6001915050610fd4565b60ff84111561404d5761404d6140f2565b50506001821b610fd4565b5060208310610133831016604e8410600b841016171561407b575081810a610fd4565b6140858383613fb3565b8060001904821115614099576140996140f2565b029392505050565b60008160001904831182151516156140bb576140bb6140f2565b500290565b6000828210156140d2576140d26140f2565b500390565b60006000198214156140eb576140eb6140f2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461101857600080fd5b801515811461101857600080fdfea264697066735822122040ae7c8be50d8aaf223159ec8a9e7e028917b32b4c74842a0a8165b941360a9b64736f6c63430008040033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed ByteCode Sourcemap

28747:40143:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61507:281;;;;;;;;;;-1:-1:-1;61507:281:0;;;;;:::i;:::-;;:::i;66544:94::-;;;;;;;;;;-1:-1:-1;66625:5:0;;;;;;;;;;;;-1:-1:-1;;;66625:5:0;;;;66544:94;;;;;;;:::i;:::-;;;;;;;;43369:30;;;;;;;;;;-1:-1:-1;43369:30:0;;;;;;;;;;;20129:4:1;20117:17;;;20099:36;;20087:2;20072:18;43369:30:0;20054:87:1;67429:161:0;;;;;;;;;;-1:-1:-1;67429:161:0;;;;;:::i;:::-;;:::i;:::-;;;7411:14:1;;7404:22;7386:41;;7374:2;7359:18;67429:161:0;7341:92:1;58558:127:0;;;;;;;;;;-1:-1:-1;58558:127:0;;;;;:::i;:::-;;:::i;54211:118::-;;;;;;;;;;-1:-1:-1;54211:118:0;;;;;:::i;:::-;;:::i;30038:43::-;;;;;;;;;;;;30078:3;30038:43;;;;;18097:6:1;18085:19;;;18067:38;;18055:2;18040:18;30038:43:0;18022:89:1;60210:393:0;;;;;;;;;;;;;:::i;61825:121::-;;;;;;;;;;-1:-1:-1;61825:121:0;;;;;:::i;:::-;;:::i;53815:102::-;;;;;;;;;;-1:-1:-1;53897:12:0;;53815:102;;;18262:25:1;;;18250:2;18235:18;53815:102:0;18217:76:1;56653:103:0;;;;;;;;;;-1:-1:-1;56653:103:0;;;;;:::i;:::-;;:::i;66854:108::-;;;;;;;;;;-1:-1:-1;66936:18:0;;66854:108;;29624:66;;;;;;;;;;;;;:::i;30482:83::-;;;;;;;;;;;;30523:42;30482:83;;;;;-1:-1:-1;;;;;6311:32:1;;;6293:51;;6281:2;6266:18;30482:83:0;6248:102:1;67903:392:0;;;;;;;;;;-1:-1:-1;67903:392:0;;;;;:::i;:::-;;:::i;53075:244::-;;;;;;;;;;-1:-1:-1;53246:8:0;;53075:244;;;53246:8;;;;;;19704:25:1;;53255:13:0;;;;;19760:2:1;19745:18;;19738:34;-1:-1:-1;;;53269:11:0;;;;19788:18:1;;;19781:34;;;;53281:7:0;;;19846:2:1;19831:18;;19824:34;53246:8:0;53289;;;;19889:3:1;19874:19;;19867:35;53298:12:0;;;;;19933:3:1;19918:19;;19911:35;19691:3;19676:19;53075:244:0;19658:294:1;62946:157:0;;;;;;;;;;-1:-1:-1;62946:157:0;;;;;:::i;:::-;;:::i;29792:44::-;;;;;;;;;;;;29834:2;29792:44;;66752:94;;;;;;;;;;-1:-1:-1;29616:1:0;66752:94;;62087:115;;;;;;;;;;-1:-1:-1;62087:115:0;;;;;:::i;:::-;;:::i;30164:50::-;;;;;;;;;;;;30204:10;30164:50;;68330:205;;;;;;;;;;-1:-1:-1;68330:205:0;;;;;:::i;:::-;;:::i;63404:927::-;;;;;;;;;;;;;:::i;61958:117::-;;;;;;;;;;-1:-1:-1;61958:117:0;;;;;:::i;:::-;;:::i;43141:27::-;;;;;;;;;;;;;;;;54429:191;;;;;;;;;;-1:-1:-1;54429:191:0;;;;;:::i;:::-;;:::i;54061:107::-;;;;;;;;;;;;;:::i;62782:37::-;;;;;;;;;;-1:-1:-1;62782:37:0;;;;;;;;60027:26;;;;;;;;;;-1:-1:-1;60027:26:0;;;;;;;;;;;60851:145;;;;;;;;;;-1:-1:-1;60851:145:0;;;;;:::i;:::-;;:::i;31066:46::-;;;;;;;;;;;;;;;;57123:599;;;;;;;;;;-1:-1:-1;57123:599:0;;;;;:::i;:::-;;:::i;58142:110::-;;;;;;;;;;-1:-1:-1;58142:110:0;;;;;:::i;:::-;;:::i;43451:31::-;;;;;;;;;;;;;;;;30398:77;;;;;;;;;;;;30433:42;30398:77;;52918:149;;;;;;;;;;;;;:::i;:::-;;;;19338:25:1;;;19394:2;19379:18;;19372:34;;;;19311:18;52918:149:0;19293:119:1;66970:121:0;;;;;;;;;;-1:-1:-1;66970:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;67065:18:0;67038:7;67065:18;;;:9;:18;;;;;;;66970:121;10327:140;;;;;;;;;;;;;:::i;60060:28::-;;;;;;;;;;-1:-1:-1;60060:28:0;;;;;;;;;;;43933:132;;;;;;;;;;-1:-1:-1;43933:132:0;;;;;:::i;:::-;;:::i;57797:140::-;;;;;;;;;;-1:-1:-1;57797:140:0;;;;;:::i;:::-;;:::i;31010:49::-;;;;;;;;;;;;;;;;60645:138;;;;;;;;;;;;;:::i;55902:233::-;;;;;;;;;;;;;:::i;55615:279::-;;;;;;;;;;-1:-1:-1;55615:279:0;;;;;:::i;:::-;;:::i;42927:29::-;;;;;;;;;;;;;;;;55027:28;;;;;;;;;;-1:-1:-1;55027:28:0;;;;;;;;29915:54;;;;;;;;;;;;29967:2;29915:54;;53534:275;;;;;;;;;;-1:-1:-1;53534:275:0;;;;;:::i;:::-;;:::i;54958:28::-;;;;;;;;;;-1:-1:-1;54958:28:0;;;;;;;;;;;66442:94;;;;;;;;;;-1:-1:-1;66494:7:0;9751:6;-1:-1:-1;;;;;9751:6:0;66442:94;;49164:25;;;;;;;;;;;;;;;;56482:109;;;;;;;;;;-1:-1:-1;56482:109:0;;;;;:::i;:::-;;:::i;66646:98::-;;;;;;;;;;-1:-1:-1;66729:7:0;;;;;;;;;;;;-1:-1:-1;;;66729:7:0;;;;66646:98;;58794:893;;;;;;;;;;-1:-1:-1;58794:893:0;;;;;:::i;:::-;;:::i;29370:43::-;;;;;;;;;;-1:-1:-1;29370:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68543:342;;;;;;;;;;-1:-1:-1;68543:342:0;;;;;:::i;:::-;;:::i;67099:167::-;;;;;;;;;;-1:-1:-1;67099:167:0;;;;;:::i;:::-;;:::i;61033:113::-;;;;;;;;;;-1:-1:-1;61033:113:0;;;;;:::i;:::-;;:::i;52553:220::-;;;;;;;;;;;;;:::i;52781:129::-;;;;;;;;;;;;;:::i;55101:458::-;;;;;;;;;;-1:-1:-1;55101:458:0;;;;;:::i;:::-;;:::i;54335:88::-;;;;;;;;;;;;;:::i;56827:201::-;;;;;;;;;;-1:-1:-1;56827:201:0;;;;;:::i;:::-;;:::i;62826:112::-;;;;;;;;;;;;;:::i;53327:140::-;;;;;;;;;;-1:-1:-1;53327:140:0;;;;;:::i;:::-;;:::i;61152:203::-;;;;;;;;;;-1:-1:-1;61152:203:0;;;;;:::i;:::-;;:::i;67274:147::-;;;;;;;;;;-1:-1:-1;67274:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;67385:19:0;;;67358:7;67385:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;67274:147;58258:111;;;;;;;;;;-1:-1:-1;58258:111:0;;;;;:::i;:::-;;:::i;44143:411::-;;;;;;;;;;;;;:::i;61361:127::-;;;;;;;;;;-1:-1:-1;61361:127:0;;;;;:::i;:::-;;:::i;64389:1325::-;;;;;;;;;;-1:-1:-1;64389:1325:0;;;;;:::i;:::-;;:::i;56142:255::-;;;;;;;;;;-1:-1:-1;56142:255:0;;;;;:::i;:::-;;:::i;31205:31::-;;;;;;;;;;;;31234:2;31205:31;;43038:33;;;;;;;;;;;;;;;;65859:157;;;;;;;;;;;;;:::i;10622:236::-;;;;;;;;;;-1:-1:-1;10622:236:0;;;;;:::i;:::-;;:::i;54993:27::-;;;;;;;;;;;;;;;;58426:126;;;;;;;;;;-1:-1:-1;58426:126:0;;;;;:::i;:::-;;:::i;58005:80::-;;;;;;;;;;;;;:::i;61507:281::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;;;;;;;;;61641:30:::1;::::0;-1:-1:-1;;;61641:30:0;;61665:4:::1;61641:30;::::0;::::1;6293:51:1::0;61598:10:0;;61576:12:::1;::::0;-1:-1:-1;;;;;61641:15:0;::::1;::::0;::::1;::::0;6266:18:1;;61641:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61620:51;;61701:1;61690:10;:12;61682:49;;;::::0;-1:-1:-1;;;61682:49:0;;15346:2:1;61682:49:0::1;::::0;::::1;15328:21:1::0;15385:2;15365:18;;;15358:30;15424:26;15404:18;;;15397:54;15468:18;;61682:49:0::1;15318:174:1::0;61682:49:0::1;61742:38;::::0;-1:-1:-1;;;61742:38:0;;61757:10:::1;61742:38;::::0;::::1;6529:51:1::0;6596:18;;;6589:34;;;-1:-1:-1;;;;;61742:14:0;::::1;::::0;::::1;::::0;6502:18:1;;61742:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31774:1;;61507:281:::0;:::o;67429:161::-;67506:4;67523:37;67532:10;67544:7;67553:6;67523:8;:37::i;:::-;-1:-1:-1;67578:4:0;67429:161;;;;;:::o;58558:127::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;58640:37:::1;:21;58669:7:::0;58640:28:::1;:37::i;:::-;;58558:127:::0;:::o;54211:118::-;54279:42;54296:10;54308:12;54279:16;:42::i;:::-;54211:118;:::o;60210:393::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;60284:14:::1;::::0;::::1;::::0;::::1;;;60283:15;60275:24;;;::::0;::::1;;60360:14;:19:::0;;-1:-1:-1;;60390:21:0;;;;;60555:40:::1;30384:7;60555:15;:40;:::i;:::-;60534:20;:61:::0;60210:393::o;61825:121::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;61906:11:::1;:32:::0;;-1:-1:-1;;61906:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61825:121::o;56653:103::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;56723:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;56723:25:0;;::::1;::::0;;;::::1;::::0;;56653:103::o;29624:66::-;29677:13;29616:1;29677:2;:13;:::i;:::-;29663:27;;:11;:27;:::i;:::-;29624:66;:::o;67903:392::-;68003:4;68020:36;68030:6;68038:9;68049:6;68020:9;:36::i;:::-;-1:-1:-1;;;;;68096:19:0;;68069:24;68096:19;;;:11;:19;;;;;;;;68116:10;68096:31;;;;;;;;68146:26;;;;68138:59;;;;-1:-1:-1;;;68138:59:0;;11721:2:1;68138:59:0;;;11703:21:1;11760:2;11740:18;;;11733:30;-1:-1:-1;;;11779:18:1;;;11772:50;11839:18;;68138:59:0;11693:170:1;68138:59:0;68210:55;68219:6;68227:10;68239:25;68258:6;68239:16;:25;:::i;:::-;68210:8;:55::i;:::-;-1:-1:-1;68283:4:0;;67903:392;-1:-1:-1;;;;67903:392:0:o;62946:157::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;63038:57:::1;63060:34;63079:15;63060:18:::0;:34:::1;:::i;:::-;63038:21;:57::i;62087:115::-:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62166:20:0::1;62189:5;62166:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;62166:28:0::1;::::0;;62087:115::o;68330:205::-;68438:10;68412:4;68459:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;68459:32:0;;;;;;;;;;68412:4;;68429:76;;68450:7;;68459:45;;68494:10;;68459:45;:::i;63404:927::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;63548:20:::1;;63529:15;:39;;63521:68;;;::::0;-1:-1:-1;;;63521:68:0;;9513:2:1;63521:68:0::1;::::0;::::1;9495:21:1::0;9552:2;9532:18;;;9525:30;-1:-1:-1;;;9571:18:1;;;9564:46;9627:18;;63521:68:0::1;9485:166:1::0;63521:68:0::1;63655:22;::::0;63706:39:::1;::::0;-1:-1:-1;;;63706:39:0;;63739:4:::1;63706:39;::::0;::::1;6293:51:1::0;63655:22:0;;;::::1;-1:-1:-1::0;;;;;63655:22:0::1;::::0;63610:28:::1;::::0;63655:22;;63706:24:::1;::::0;6266:18:1;;63706:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63759:25;::::0;63689:56;;-1:-1:-1;63759:25:0::1;;63756:568;;;63831:40;30384:7;63831:15;:40;:::i;:::-;63810:20;:61:::0;64009:2:::1;64000:8;:6:::0;64007:1:::1;64000:8;:::i;:::-;:11;;;;:::i;:::-;64026:43;::::0;-1:-1:-1;;;64026:43:0;;30433:42:::1;64026:43;::::0;::::1;6529:51:1::0;6596:18;;;6589:34;;;63993:18:0;;-1:-1:-1;;;;;;64026:23:0;::::1;::::0;::::1;::::0;6502:18:1;;64026:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58640:37;58558:127:::0;:::o;63756:568::-:1;64269:43;::::0;-1:-1:-1;;;64269:43:0;;30433:42:::1;64269:43;::::0;::::1;6529:51:1::0;6596:18;;;6589:34;;;-1:-1:-1;;;;;64269:23:0;::::1;::::0;::::1;::::0;6502:18:1;;64269:43:0::1;6484:145:1::0;61958:117:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62037:23:0::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;62037:30:0::1;62063:4;62037:30;::::0;;61958:117::o;54429:191::-;54486:7;54508:27;54530:4;54508:21;:27::i;:::-;54505:53;;;-1:-1:-1;;;;;;54544:14:0;;;;;:8;:14;;;;;;;54429:191::o;54505:53::-;-1:-1:-1;;;;;54598:14:0;;;;;;:8;:14;;;;;;54576:21;54607:4;54576:15;:21::i;:::-;:36;;;;:::i;54061:107::-;54148:12;;54132:28;;:15;:28;:::i;:::-;54120:10;54110:21;;;;:9;:21;;;;;:50;54061:107::o;60851:145::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;60944:22:::1;:44:::0;;-1:-1:-1;;;;;60944:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;60944:44:0;;::::1;::::0;;;::::1;::::0;;60851:145::o;57123:599::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;57277:14:::1;57317:12:::0;57292:24:::1;57302:14:::0;57292:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;57277:52;;57348:8;:13;;57358:3;57348:13;57340:64;;;::::0;-1:-1:-1;;;57340:64:0;;13126:2:1;57340:64:0::1;::::0;::::1;13108:21:1::0;13165:2;13145:18;;;13138:30;13204:34;13184:18;;;13177:62;-1:-1:-1;;;13255:18:1;;;13248:36;13301:19;;57340:64:0::1;13098:228:1::0;57340:64:0::1;31234:2;57423:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;31234:2:0::1;57439:15;::::0;::::1;;;57423:31;:52;;;;-1:-1:-1::0;31234:2:0::1;57456:19;::::0;::::1;;;57423:52;57415:89;;;::::0;-1:-1:-1;;;57415:89:0;;15699:2:1;57415:89:0::1;::::0;::::1;15681:21:1::0;15738:2;15718:18;;;15711:30;15777:27;15757:18;;;15750:55;15822:18;;57415:89:0::1;15671:175:1::0;57415:89:0::1;-1:-1:-1::0;57525:8:0::1;:18:::0;;::::1;57690:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;57663:16:0;;::::1;57525:18;57663:16;-1:-1:-1::0;;57593:24:0;;::::1;-1:-1:-1::0;;;57593:24:0::1;57663:16:::0;;;;-1:-1:-1;;57554:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;57525:18:0;;::::1;::::0;::::1;57554:28:::0;;;;-1:-1:-1;;57554:28:0;;;;;;;;;;::::1;57663:16:::0;;;;;;;;57638:14;::::1;57663:16:::0;;;;;;;::::1;57690:24;::::0;;;::::1;::::0;;57123:599::o;58142:110::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;58222:22:::1;:9;58236:7:::0;58222:13:::1;:22::i;52918:149::-:0;52959:15;;53020:13;29616:1;53020:2;:13;:::i;:::-;53007:12;;:26;;;;:::i;:::-;53045:13;29616:1;53045:2;:13;:::i;:::-;53035:9;;:23;;;;:::i;:::-;53000:59;;;;52918:149;;:::o;10327:140::-;9909:10;9898:7;9724;9751:6;-1:-1:-1;;;;;9751:6:0;;9686:79;9898:7;-1:-1:-1;;;;;9898:21:0;;9890:66;;;;-1:-1:-1;;;9890:66:0;;14286:2:1;9890:66:0;;;14268:21:1;;;14305:18;;;14298:30;14364:34;14344:18;;;14337:62;14416:18;;9890:66:0;14258:182:1;9890:66:0;10426:1:::1;10410:6:::0;;10389:40:::1;::::0;-1:-1:-1;;;;;10410:6:0;;::::1;::::0;10389:40:::1;::::0;10426:1;;10389:40:::1;10457:1;10440:19:::0;;-1:-1:-1;;;;;;10440:19:0::1;::::0;;10327:140::o;43933:132::-;43999:4;44022:35;:20;44052:4;44022:29;:35::i;57797:140::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;57891:2:::1;57881:8;:12;;;;57873:21;;;::::0;::::1;;57906:14;:23:::0;;-1:-1:-1;;57906:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;57797:140::o;60645:138::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;60709:14:::1;::::0;::::1;::::0;::::1;;;:32:::0;::::1;;;-1:-1:-1::0;60725:16:0::1;::::0;;;::::1;;;60709:32;60701:41;;;::::0;::::1;;60753:16;:22:::0;;-1:-1:-1;;60753:22:0::1;::::0;;60645:138::o;55902:233::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;55979:16:::1;::::0;;55964:14:::1;56006:18:::0;;;;56049:36:::1;::::0;55979:16;;55964:14;30433:42:::1;::::0;55979:16;;56049:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56035:50;;;56104:4;56096:31;;;::::0;-1:-1:-1;;;56096:31:0;;16741:2:1;56096:31:0::1;::::0;::::1;16723:21:1::0;16780:2;16760:18;;;16753:30;-1:-1:-1;;;16799:18:1;;;16792:45;16854:18;;56096:31:0::1;16713:165:1::0;55615:279:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;55693:27:::1;55715:4;55693:21;:27::i;:::-;55685:36;;;::::0;::::1;;55732:33;:20;55760:4:::0;55732:27:::1;:33::i;:::-;-1:-1:-1::0;55872:14:0::1;::::0;-1:-1:-1;;;;;55856:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:30:::1;::::0;55872:14;55856:30:::1;:::i;:::-;-1:-1:-1::0;;;;;55832:23:0;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:54;55615:279::o;53534:275::-;-1:-1:-1;;;;;53655:25:0;;53620:7;53655:25;;;:9;:25;;;;;;53703:15;53693:25;;53690:71;;-1:-1:-1;53749:1:0;;53534:275;-1:-1:-1;;53534:275:0:o;53690:71::-;53777:24;53786:15;53777:8;:24;:::i;:::-;53770:31;53534:275;-1:-1:-1;;;53534:275:0:o;66521:7::-;66514:14;;66442:94;:::o;56482:109::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;56560:16:::1;:23:::0;;-1:-1:-1;;56560:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56482:109::o;58794:893::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;59029:2:::1;59010:18;;:21;;;;:::i;:::-;58997:12;:34;58989:43;;;::::0;::::1;;59110:13;29616:1;59110:2;:13;:::i;:::-;59094:29;::::0;:15;:29:::1;:::i;:::-;59078:45:::0;-1:-1:-1;59160:13:0::1;29616:1;59160:2;:13;:::i;:::-;59147:26;::::0;:12;:26:::1;:::i;:::-;59134:39;;59240:26;29834:2;59267:38;;:18;;:38;;;;:::i;:::-;59240:65;;59316:23;30078:3;59340:35;;:18;;:35;;;;:::i;:::-;59316:59;;59414:18;59397:15;:35;;59388:103;;;::::0;-1:-1:-1;;;59388:103:0;;10618:2:1;59388:103:0::1;::::0;::::1;10600:21:1::0;10657:2;10637:18;;;10630:30;10696:34;10676:18;;;10669:62;-1:-1:-1;;;10747:18:1;;;10740:41;10798:19;;59388:103:0::1;10590:233:1::0;59388:103:0::1;59525:15;59511:12;:29;;59502:94;;;::::0;-1:-1:-1;;;59502:94:0;;13877:2:1;59502:94:0::1;::::0;::::1;13859:21:1::0;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;-1:-1:-1;;;14006:18:1;;;13999:38;14054:19;;59502:94:0::1;13849:230:1::0;59502:94:0::1;-1:-1:-1::0;;59609:12:0::1;:30:::0;;;;59650:9:::1;:24:::0;58794:893::o;68543:342::-;68686:10;68630:4;68674:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;68674:32:0;;;;;;;;;;68725:35;;;;68717:60;;;;-1:-1:-1;;;68717:60:0;;17437:2:1;68717:60:0;;;17419:21:1;17476:2;17456:18;;;17449:30;-1:-1:-1;;;17495:18:1;;;17488:42;17547:18;;68717:60:0;17409:162:1;68717:60:0;68790:65;68799:10;68811:7;68820:34;68839:15;68820:16;:34;:::i;68790:65::-;-1:-1:-1;68873:4:0;;68543:342;-1:-1:-1;;;68543:342:0:o;67099:167::-;67179:4;67196:40;67206:10;67218:9;67229:6;67196:9;:40::i;61033:113::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;61110:28:::1;:10;61125:12:::0;61110:14:::1;:28::i;52553:220::-:0;52618:7;52656:20;;52640:15;:36;52637:110;;;52720:15;52699:20;;:36;;;;:::i;52637:110::-;-1:-1:-1;52764:1:0;;52553:220::o;52781:129::-;52828:7;52889:13;29616:1;52889:2;:13;:::i;:::-;52869:18;;29677:13;29616:1;29677:2;:13;:::i;:::-;29663:27;;:11;:27;:::i;:::-;52855:32;;;;:::i;:::-;52854:48;;;;:::i;55101:458::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;55292:2:::1;55262:29;:20;:27;:29::i;:::-;:32;55254:41;;;::::0;::::1;;55315:27;55337:4;55315:21;:27::i;:::-;55314:28;55306:37;;;::::0;::::1;;55354:20;55375:21;55391:4;55375:15;:21::i;:::-;55447:14;::::0;-1:-1:-1;;;;;55431:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;55354:42;;-1:-1:-1;55431:30:0::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;55407:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;:54;;;;55472:8:::1;:14:::0;;;;;:28;;55488:12;;55407:23;55472:28:::1;::::0;55488:12;;55472:28:::1;:::i;:::-;::::0;;;-1:-1:-1;55511:30:0::1;::::0;-1:-1:-1;55511:20:0::1;55536:4:::0;55511:24:::1;:30::i;54335:88::-:0;54400:17;;54371:47;;54388:10;;-1:-1:-1;;;;;54400:17:0;54371:16;:47::i;:::-;54335:88::o;56827:201::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;30204:10:::1;56918:32:::0;::::1;;56910:67;;;::::0;-1:-1:-1;;;56910:67:0;;17085:2:1;56910:67:0::1;::::0;::::1;17067:21:1::0;17124:2;17104:18;;;17097:30;17163:25;17143:18;;;17136:53;17206:18;;56910:67:0::1;17057:173:1::0;56910:67:0::1;56992:12;:28:::0;56827:201::o;62826:112::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;62900:25:::1;:30:::0;;-1:-1:-1;;62900:30:0::1;62926:4;62900:30;::::0;;62826:112::o;53327:140::-;53401:4;53424:35;:10;53444:14;53424:19;:35::i;61152:203::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;61249:6:::1;61245:103;61261:14;:21;61259:1;:23;61245:103;;;61303:33;61318:14;61333:1;61318:17;;;;;;-1:-1:-1::0;;;61318:17:0::1;;;;;;;;;;;;;;;61303:10;:14;;:33;;;;:::i;:::-;-1:-1:-1::0;61284:3:0;::::1;::::0;::::1;:::i;:::-;;;;61245:103;;58258:111:::0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;58336:25:::1;:9;58353:7:::0;58336:16:::1;:25::i;44143:411::-:0;44225:18;;44191:7;;;44400:123;44416:29;:20;:27;:29::i;:::-;44414:1;:31;44400:123;;;44474:9;:37;44484:26;:20;44508:1;44484:23;:26::i;:::-;-1:-1:-1;;;;;44474:37:0;;;;;;;;;;;;-1:-1:-1;44474:37:0;;44466:45;;;;:::i;:::-;;-1:-1:-1;44447:3:0;;;;:::i;:::-;;;;44400:123;;;-1:-1:-1;44540:6:0;44143:411;-1:-1:-1;44143:411:0:o;61361:127::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;61446:34:::1;:10;61464:15:::0;61446:17:::1;:34::i;64389:1325::-:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;64549:20:::1;;64530:15;:39;;64522:68;;;::::0;-1:-1:-1;;;64522:68:0;;9513:2:1;64522:68:0::1;::::0;::::1;9495:21:1::0;9552:2;9532:18;;;9525:30;-1:-1:-1;;;9571:18:1;;;9564:46;9627:18;;64522:68:0::1;9485:166:1::0;64522:68:0::1;64622:40;30384:7;64622:15;:40;:::i;:::-;64601:20;:61:::0;64718:22:::1;::::0;64769:39:::1;::::0;-1:-1:-1;;;64769:39:0;;64802:4:::1;64769:39;::::0;::::1;6293:51:1::0;64718:22:0;;;::::1;-1:-1:-1::0;;;;;64718:22:0::1;::::0;64673:28:::1;::::0;64718:22;;64769:24:::1;::::0;6266:18:1;;64769:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64822:25;::::0;64752:56;;-1:-1:-1;64822:25:0::1;;64819:97;;;64879:2;64870:8;:6:::0;64877:1:::1;64870:8;:::i;:::-;:11;;;;:::i;:::-;64863:18;;64819:97;64958:14;::::0;64927:54:::1;::::0;-1:-1:-1;;;64927:54:0;;-1:-1:-1;;;;;64958:14:0;;::::1;64927:54;::::0;::::1;6529:51:1::0;6596:18;;;6589:34;;;64927:22:0;;::::1;::::0;::::1;::::0;6502:18:1;;64927:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65258:14:0::1;::::0;:216:::1;::::0;-1:-1:-1;;;65258:216:0;;65226:21:::1;::::0;-1:-1:-1;;;;;65258:14:0::1;::::0;:62:::1;::::0;:216:::1;::::0;65343:4:::1;::::0;65363:6;;65198:25:::1;::::0;;;65343:4;;65444:15:::1;::::0;65258:216:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;65485:21:0::1;65509:39;65531:17:::0;65509:21:::1;:39;:::i;:::-;65485:63;;65562:12;65559:146;;;65590:31;65607:13;65590:16;:31::i;:::-;65559:146;;;65680:13;65662:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65559:146:0::1;31774:1;;;;64389:1325:::0;:::o;56142:255::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;56234:16:::1;;56226:6;:24;;56218:33;;;::::0;::::1;;56280:6;56262:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;56311:36:0::1;::::0;56298:9:::1;::::0;30433:42:::1;::::0;56335:6;;56311:36:::1;6128:14:1::0;65859:157:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;65933:51:::1;::::0;65920:9:::1;::::0;30433:42:::1;::::0;65957:21:::1;::::0;65920:9;65933:51;65920:9;65933:51;65957:21;30433:42;65933:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65919:65;;;66003:4;65995:13;;;::::0;::::1;10622:236:::0;9909:10;9898:7;9724;9751:6;-1:-1:-1;;;;;9751:6:0;;9686:79;9898:7;-1:-1:-1;;;;;9898:21:0;;9890:66;;;;-1:-1:-1;;;9890:66:0;;14286:2:1;9890:66:0;;;14268:21:1;;;14305:18;;;14298:30;14364:34;14344:18;;;14337:62;14416:18;;9890:66:0;14258:182:1;9890:66:0;-1:-1:-1;;;;;10703:22:0;::::1;10695:73;;;::::0;-1:-1:-1;;;10695:73:0;;10211:2:1;10695:73:0::1;::::0;::::1;10193:21:1::0;10250:2;10230:18;;;10223:30;10289:34;10269:18;;;10262:62;-1:-1:-1;;;10340:18:1;;;10333:36;10386:19;;10695:73:0::1;10183:228:1::0;10695:73:0::1;10805:6;::::0;;10784:38:::1;::::0;-1:-1:-1;;;;;10784:38:0;;::::1;::::0;10805:6;::::1;::::0;10784:38:::1;::::0;::::1;10833:6;:17:::0;;-1:-1:-1;;;;;;10833:17:0::1;-1:-1:-1::0;;;;;10833:17:0;;;::::1;::::0;;;::::1;::::0;;10622:236::o;58426:126::-;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;58510:34:::1;:21;58536:7:::0;58510:25:::1;:34::i;58005:80::-:0;31721:19;31729:10;31721:7;:19::i;:::-;31713:50;;;;-1:-1:-1;;;31713:50:0;;;;;;;:::i;:::-;58057:20:::1;:18;:20::i;25373:152::-:0;25443:4;25467:50;25472:3;-1:-1:-1;;;;;25492:23:0;;25467:4;:50::i;32001:139::-;32054:4;9751:6;;-1:-1:-1;;;;;32077:13:0;;;9751:6;;32077:13;;:31;;-1:-1:-1;;;;;;32092:16:0;;30433:42;32092:16;32077:31;:55;;;-1:-1:-1;;;;;;32110:22:0;;30523:42;32110:22;32070:62;32001:139;-1:-1:-1;;32001:139:0:o;67596:299::-;-1:-1:-1;;;;;67689:19:0;;67681:49;;;;-1:-1:-1;;;67681:49:0;;11030:2:1;67681:49:0;;;11012:21:1;11069:2;11049:18;;;11042:30;-1:-1:-1;;;11088:18:1;;;11081:47;11145:18;;67681:49:0;11002:167:1;67681:49:0;-1:-1:-1;;;;;67749:21:0;;67741:49;;;;-1:-1:-1;;;67741:49:0;;13533:2:1;67741:49:0;;;13515:21:1;13572:2;13552:18;;;13545:30;-1:-1:-1;;;13591:18:1;;;13584:45;13646:18;;67741:49:0;13505:165:1;67741:49:0;-1:-1:-1;;;;;67803:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;67855:32;;18262:25:1;;;67855:32:0;;18235:18:1;67855:32:0;;;;;;;67596:299;;;:::o;25701:158::-;25774:4;25798:53;25806:3;-1:-1:-1;;;;;25826:23:0;;25798:7;:53::i;47558:1202::-;47638:14;;-1:-1:-1;;;47638:14:0;;;;47637:15;47629:24;;;;;;47664:14;:19;;-1:-1:-1;;;;47664:19:0;-1:-1:-1;;;47664:19:0;;;;47722:27;47744:4;47722:21;:27::i;:::-;47719:495;;;-1:-1:-1;;;;;;47836:14:0;;;;;;:8;:14;;;;;;;47865:16;;;47719:495;;;47922:17;47940:21;47956:4;47940:15;:21::i;:::-;-1:-1:-1;;;;;48072:15:0;;;;;;:9;:15;;;;;;48055:14;;47922:39;;-1:-1:-1;48055:32:0;;;:::i;:::-;-1:-1:-1;;;;;48029:23:0;;;;;;:17;:23;;;;;;;;:58;;;;48147:8;:14;;;;:24;;48162:9;;48147:24;:::i;:::-;-1:-1:-1;;;;;48186:14:0;;48201:1;48186:14;;;:8;:14;;;;;:16;48140:31;-1:-1:-1;;47719:495:0;48227:9;48224:106;;-1:-1:-1;;48277:14:0;:20;;-1:-1:-1;;;;48277:20:0;;;-1:-1:-1;47558:1202:0:o;48224:106::-;48354:6;48340:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;48395:16:0;;;48409:1;48395:16;;;;;;;;48371:21;;48395:16;;;;;;;;-1:-1:-1;;48432:14:0;;:21;;;-1:-1:-1;;;48432:21:0;;;;48371:40;;-1:-1:-1;;;;;;48432:14:0;;;;:19;;-1:-1:-1;48432:21:0;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48422:4;48427:1;48422:7;;;;;;-1:-1:-1;;;48422:7:0;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;48422:31:0;;;-1:-1:-1;;;;;48422:31:0;;;;;48480:3;48470:4;48475:1;48470:7;;;;;;-1:-1:-1;;;48470:7:0;;;;;;;;;-1:-1:-1;;;;;48470:13:0;;;:7;;;;;;;;;:13;48511:14;;:149;;-1:-1:-1;;;48511:149:0;;:14;;;:65;;48584:6;;48511:149;;:14;;48614:4;;48629;;48644:15;;48511:149;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48686:35:0;;;18472:25:1;;;-1:-1:-1;;;;;18533:32:1;;18528:2;18513:18;;18506:60;48686:35:0;;-1:-1:-1;18445:18:1;;-1:-1:-1;48686:35:0;;-1:-1:-1;18427:145:1;48686:35:0;;;;;;;;-1:-1:-1;;48732:14:0;:20;;-1:-1:-1;;;;48732:20:0;;;-1:-1:-1;;47558:1202:0:o;35073:1701::-;-1:-1:-1;;;;;35169:20:0;;35161:51;;;;-1:-1:-1;;;35161:51:0;;9166:2:1;35161:51:0;;;9148:21:1;9205:2;9185:18;;;9178:30;-1:-1:-1;;;9224:18:1;;;9217:48;9282:18;;35161:51:0;9138:168:1;35161:51:0;-1:-1:-1;;;;;35231:23:0;;35223:52;;;;-1:-1:-1;;;35223:52:0;;11376:2:1;35223:52:0;;;11358:21:1;11415:2;11395:18;;;11388:30;-1:-1:-1;;;11434:18:1;;;11427:46;11490:18;;35223:52:0;11348:166:1;35223:52:0;35368:15;35387:26;:9;35406:6;35387:18;:26::i;:::-;:59;;;-1:-1:-1;35417:29:0;:9;35436;35417:18;:29::i;:::-;35368:79;-1:-1:-1;35546:23:0;-1:-1:-1;;;;;35571:21:0;;35587:4;35571:21;;:49;;-1:-1:-1;;;;;;35596:24:0;;35615:4;35596:24;35571:49;35753:14;;35818:19;;35546:75;;-1:-1:-1;;;;;;35753:14:0;;;;35723:21;;35808:29;;;-1:-1:-1;;;35818:19:0;;;;35808:29;:59;;;;;35854:13;-1:-1:-1;;;;;35841:26:0;:9;-1:-1:-1;;;;;35841:26:0;;35808:59;35807:136;;;-1:-1:-1;35896:19:0;;-1:-1:-1;;;;;35883:32:0;;;-1:-1:-1;;;35896:19:0;;;;35883:32;:59;;;;;35929:13;-1:-1:-1;;;;;35919:23:0;:6;-1:-1:-1;;;;;35919:23:0;;35883:59;36065:19;;35779:165;;-1:-1:-1;36046:10:0;;-1:-1:-1;;;;;36057:27:0;;;-1:-1:-1;;;36065:19:0;;;;36057:27;;:53;;;36097:13;-1:-1:-1;;;;;36087:23:0;:6;-1:-1:-1;;;;;36087:23:0;;36057:53;36144:19;;36046:64;;-1:-1:-1;36121:11:0;;-1:-1:-1;;;;;36133:30:0;;;-1:-1:-1;;;36144:19:0;;;;36133:30;;:59;;;36179:13;-1:-1:-1;;;;;36166:26:0;:9;-1:-1:-1;;;;;36166:26:0;;36133:59;36121:71;;36233:18;:41;;;;36255:19;36233:41;:55;;;;36278:10;36233:55;36230:537;;;36304:43;36321:6;36329:9;36340:6;36304:16;:43::i;:::-;36230:537;;;36466:14;;;;;;;36458:49;;;;-1:-1:-1;;;36458:49:0;;14647:2:1;36458:49:0;;;14629:21:1;14686:2;14666:18;;;14659:30;14725:25;14705:18;;;14698:53;14768:18;;36458:49:0;14619:173:1;36458:49:0;36525:16;;;;;;;36522:234;;;36561:56;36580:6;36587:9;36597:6;36604:5;36610:6;36561:18;:56::i;36522:234::-;36670:52;36685:6;36692:9;36702:6;36709:5;36715:6;36670:14;:52::i;:::-;35073:1701;;;;;;;;;:::o;63109:230::-;63265:20;;63251:13;:34;63243:43;;;;;46180:427;-1:-1:-1;;;;;46301:17:0;;46243:7;46301:17;;;:9;:17;;;;;;46284:14;;46243:7;;46284:34;;;:::i;:::-;-1:-1:-1;;;;;46481:25:0;;;;;;:17;:25;;;;;;46263:55;;-1:-1:-1;46470:36:0;;46467:49;;;-1:-1:-1;46515:1:0;;46180:427;-1:-1:-1;;46180:427:0:o;46467:49::-;-1:-1:-1;;;;;46548:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;42846:5:0;46535:38;;:10;:38;:::i;:::-;46534:65;;;;:::i;25945:167::-;-1:-1:-1;;;;;26079:23:0;;26025:4;22754:19;;;:12;;;:19;;;;;;:24;;26049:55;22657:129;26198:117;26261:7;26288:19;26296:3;22955:18;;22872:109;26659:158;26733:7;26784:22;26788:3;26800:5;26784:3;:22::i;46677:758::-;46812:14;;46774:22;;46830:3;;46800:26;;46812:14;;46800:9;:26;:::i;:::-;46799:34;;;;:::i;:::-;46774:59;-1:-1:-1;46844:14:0;46861:26;46774:59;46861:9;:26;:::i;:::-;46844:43;;46917:14;46899:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;46955:10:0;;46951:477;;47004:6;46982:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;47025:19:0;;-1:-1:-1;47045:17:0;:15;:17::i;:::-;47025:37;-1:-1:-1;47156:16:0;47152:265;;47213:6;47193:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;47152:265:0;;-1:-1:-1;47152:265:0;;47389:11;47354:31;-1:-1:-1;;;47354:6:0;:31;:::i;:::-;47353:47;;;;:::i;:::-;47334:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;46951:477:0;46677:758;;;:::o;49569:1616::-;49317:27;:34;;-1:-1:-1;;49317:34:0;49347:4;49317:34;;;;;;49671:4:::1;49317:27:::0;49653:24;;;::::1;::::0;;;;;;;;49718:11:::1;::::0;49653:24;;49317:27;49704:25:::1;::::0;-1:-1:-1;;;49718:11:0;::::1;49317:34:::0;49718:11;;::::1;::::0;49704:13;;::::1;;:25;:::i;:::-;49688:41;;;;49740:19;49760:9;;49740:29;;49896:11;49880:15;:27;:40;;;-1:-1:-1::0;49909:11:0::1;::::0;::::1;::::0;49880:40:::1;49877:77;;;49936:7;;;;;49877:77;50074:13;::::0;50035:25:::1;::::0;50061:36:::1;::::0;::::1;::::0;50062:25:::1;::::0;50074:13;;::::1;;;50062:11:::0;:25:::1;:::i;:::-;50061:36;;;;:::i;:::-;50035:62:::0;-1:-1:-1;50108:25:0::1;50135:29;50035:62:::0;50135:11;:29:::1;:::i;:::-;50108:56:::0;-1:-1:-1;50225:16:0::1;50242:19;50260:1;50242:17:::0;:19:::1;:::i;:::-;50225:36:::0;-1:-1:-1;50272:19:0::1;50292:26;50225:36:::0;50292:17;:26:::1;:::i;:::-;50272:46:::0;-1:-1:-1;50401:17:0::1;50419:29;50431:17:::0;50272:46;50419:29:::1;:::i;:::-;50401:47:::0;-1:-1:-1;50563:21:0::1;50595:27;50401:47:::0;50595:16:::1;:27::i;:::-;50633:14;50649:41;50673:17:::0;50649:21:::1;:41;:::i;:::-;50633:58:::0;-1:-1:-1;50791:14:0::1;50829:9:::0;50809:18:::1;50816:11:::0;50633:58;50809:18:::1;:::i;:::-;50808:30;;;;:::i;:::-;50791:47;;50849:31;50863:8;50873:6;50849:13;:31::i;:::-;51003:21;51026:41;51050:17:::0;51026:21:::1;:41;:::i;:::-;51003:65;;51146:31;51163:13;51146:16;:31::i;:::-;49362:1;;;;;;;;;;;;;49374:27:::0;:35;;-1:-1:-1;;49374:35:0;;;49569:1616::o;20428:414::-;20491:4;22754:19;;;:12;;;:19;;;;;;20508:327;;-1:-1:-1;20551:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20734:18;;20712:19;;;:12;;;:19;;;;;;:40;;;;20767:11;;20508:327;-1:-1:-1;20818:5:0;20811:12;;21018:1553;21084:4;21223:19;;;:12;;;:19;;;;;;21259:15;;21255:1309;;21621:21;21645:14;21658:1;21645:10;:14;:::i;:::-;21694:18;;21621:38;;-1:-1:-1;21674:17:0;;21694:22;;21715:1;;21694:22;:::i;:::-;21674:42;;21961:17;21981:3;:11;;21993:9;21981:22;;;;;;-1:-1:-1;;;21981:22:0;;;;;;;;;;;;;;;;;21961:42;;22127:9;22098:3;:11;;22110:13;22098:26;;;;;;-1:-1:-1;;;22098:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;22204:23;;;:12;;;:23;;;;;;:36;;;22365:17;;22204:3;;22365:17;;;-1:-1:-1;;;22365:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;22460:3;:12;;:19;22473:5;22460:19;;;;;;;;;;;22453:26;;;22503:4;22496:11;;;;;;;;21255:1309;22547:5;22540:12;;;;;41327:440;-1:-1:-1;;;;;41446:17:0;;41422:21;41446:17;;;:9;:17;;;;;;41482:23;;;;41474:60;;;;-1:-1:-1;;;41474:60:0;;9858:2:1;41474:60:0;;;9840:21:1;9897:2;9877:18;;;9870:30;-1:-1:-1;;;9916:18:1;;;9909:54;9980:18;;41474:60:0;9830:174:1;41474:60:0;41590:27;41603:6;41610;41590:12;:27::i;:::-;41670:28;41680:9;41691:6;41670:9;:28::i;:::-;41740:9;-1:-1:-1;;;;;41724:33:0;41733:6;-1:-1:-1;;;;;41724:33:0;;41750:6;41724:33;;;;18262:25:1;;18250:2;18235:18;;18217:76;41724:33:0;;;;;;;;41327:440;;;;:::o;36848:826::-;37042:6;37038:564;;37231:30;:10;37251:9;37231:19;:30::i;:::-;37223:68;;;;-1:-1:-1;;;37223:68:0;;12771:2:1;37223:68:0;;;12753:21:1;12810:2;12790:18;;;12783:30;12849:28;12829:18;;;12822:56;12895:18;;37223:68:0;12743:176:1;37223:68:0;29967:2;29677:13;29616:1;29677:2;:13;:::i;:::-;29663:27;;:11;:27;:::i;:::-;37511:42;;;;:::i;:::-;-1:-1:-1;;;;;37482:20:0;;;;;;:9;:20;;;;;;:27;;37503:6;;37482:27;:::i;:::-;:71;;37473:113;;;;-1:-1:-1;;;37473:113:0;;12070:2:1;37473:113:0;;;12052:21:1;12109:2;12089:18;;;12082:30;12148;12128:18;;;12121:58;12196:18;;37473:113:0;12042:178:1;37473:113:0;37612:52;37627:6;37634:9;37644:6;37651:5;37657:6;37777:3490;-1:-1:-1;;;;;37920:20:0;;;37893:24;37920:20;;;:9;:20;;;;;;;37975:17;;;;;;;;38011:23;;;;38003:60;;;;-1:-1:-1;;;38003:60:0;;9858:2:1;38003:60:0;;;9840:21:1;9897:2;9877:18;;;9870:30;-1:-1:-1;;;9916:18:1;;;9909:54;9980:18;;38003:60:0;9830:174:1;38003:60:0;38076:9;38099:6;38096:1837;;;38124:11;;;;38121:79;;;-1:-1:-1;;;;;38165:18:0;;;;;;:10;:18;;;;;;;;38164:19;38156:28;;;;;;38218:38;:21;38249:6;38218:30;:38::i;:::-;38214:414;;-1:-1:-1;;;;;38401:17:0;;;;;;:9;:17;;;;;;38420:15;-1:-1:-1;38401:34:0;;:52;;-1:-1:-1;38437:16:0;;;;;;;38401:52;38393:82;;;;-1:-1:-1;;;38393:82:0;;17778:2:1;38393:82:0;;;17760:21:1;17817:2;17797:18;;;17790:30;-1:-1:-1;;;17836:18:1;;;17829:48;17894:18;;38393:82:0;17750:168:1;38393:82:0;38600:12;;38584:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;38566:17:0;;;;;;:9;:17;;;;;:46;38214:414;38769:9;;38761:6;:17;;38753:44;;;;-1:-1:-1;;;38753:44:0;;12427:2:1;38753:44:0;;;12409:21:1;12466:2;12446:18;;;12439:30;-1:-1:-1;;;12485:18:1;;;12478:45;12540:18;;38753:44:0;12399:165:1;38753:44:0;-1:-1:-1;38816:8:0;;;;;;;38096:1837;;;38847:5;38844:1089;;;38992:12;;38967:23;38984:6;38967:16;:23;:::i;:::-;:37;;38959:65;;;;-1:-1:-1;;;38959:65:0;;16053:2:1;38959:65:0;;;16035:21:1;16092:2;16072:18;;;16065:30;-1:-1:-1;;;16111:18:1;;;16104:46;16167:18;;38959:65:0;16025:166:1;38959:65:0;-1:-1:-1;39043:7:0;;;;38844:1089;;;39290:15;29616:1;39290:2;:15;:::i;:::-;39282:6;:23;39279:71;;39332:17;;39307:43;;39324:6;;-1:-1:-1;;;;;39332:17:0;39307:16;:43::i;:::-;39489:12;;39464:23;39481:6;39464:16;:23;:::i;:::-;:37;;39456:65;;;;-1:-1:-1;;;39456:65:0;;16053:2:1;39456:65:0;;;16035:21:1;16092:2;16072:18;;;16065:30;-1:-1:-1;;;16111:18:1;;;16104:46;16167:18;;39456:65:0;16025:166:1;39456:65:0;39753:38;:21;39784:6;39753:30;:38::i;:::-;39749:139;;-1:-1:-1;;;;;39818:17:0;;;;;;:9;:17;;;;;;39837:15;-1:-1:-1;39818:34:0;;:52;;-1:-1:-1;39854:16:0;;;;;;;39818:52;39810:78;;;;-1:-1:-1;;;39810:78:0;;16398:2:1;39810:78:0;;;16380:21:1;16437:2;16417:18;;;16410:30;-1:-1:-1;;;16456:18:1;;;16449:44;16510:18;;39810:78:0;16370:164:1;39810:78:0;-1:-1:-1;39907:12:0;;;;;;;38844:1089;40268:19;;-1:-1:-1;;;;;40260:27:0;;;-1:-1:-1;;;40268:19:0;;;;40260:27;;;;40259:50;;-1:-1:-1;40292:16:0;;;;40291:17;40259:50;:82;;;;-1:-1:-1;40313:27:0;;;;40312:28;40259:82;:90;;;;;40343:6;40259:90;40256:128;;;40364:20;:18;:20::i;:::-;40453:23;40477:36;40491:6;40499:3;40504:8;;;;;;;;;;;40477:13;:36::i;:::-;40682:13;;40453:60;;-1:-1:-1;40621:21:0;;40643:53;;40657:6;;40665:3;;40670:25;;40682:13;;;;;;;-1:-1:-1;;;40670:11:0;;;:25;:::i;:::-;40643:13;:53::i;:::-;40621:75;-1:-1:-1;40760:19:0;40788:31;40621:75;40788:15;:31;:::i;:::-;40780:40;;:6;:40;:::i;:::-;40760:60;;40878:27;40891:6;40898;40878:12;:27::i;:::-;41000:4;40982:24;;;;:9;:24;;;;;:41;;41010:13;;40982:24;:41;;41010:13;;40982:41;:::i;:::-;;;;;;;;41078:15;41058:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;41148:33:0;;-1:-1:-1;41158:9:0;41169:11;41148:9;:33::i;:::-;41223:9;-1:-1:-1;;;;;41207:38:0;41216:6;-1:-1:-1;;;;;41207:38:0;;41233:11;41207:38;;;;18262:25:1;;18250:2;18235:18;;18217:76;41207:38:0;;;;;;;;37777:3490;;;;;;;;;;;:::o;23325:204::-;23420:18;;23392:7;;23420:26;-1:-1:-1;23412:73:0;;;;-1:-1:-1;;;23412:73:0;;8763:2:1;23412:73:0;;;8745:21:1;8802:2;8782:18;;;8775:30;8841:34;8821:18;;;8814:62;-1:-1:-1;;;8892:18:1;;;8885:32;8934:19;;23412:73:0;8735:224:1;23412:73:0;23503:3;:11;;23515:5;23503:18;;;;;;-1:-1:-1;;;23503:18:0;;;;;;;;;;;;;;;;;23496:25;;23325:204;;;;:::o;51235:455::-;51328:14;;51296:56;;51313:4;;-1:-1:-1;;;;;51328:14:0;51345:6;51296:8;:56::i;:::-;51387:16;;;51401:1;51387:16;;;;;;;;51363:21;;51387:16;;;;;;;;;;-1:-1:-1;51387:16:0;51363:40;;51432:4;51414;51419:1;51414:7;;;;;;-1:-1:-1;;;51414:7:0;;;;;;;;;-1:-1:-1;;;;;51414:23:0;;;:7;;;;;;;;;;:23;;;;51458:14;;:21;;;-1:-1:-1;;;51458:21:0;;;;:14;;;;;:19;;:21;;;;;51414:7;;51458:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51448:4;51453:1;51448:7;;;;;;-1:-1:-1;;;51448:7:0;;;;;;;;;-1:-1:-1;;;;;51448:31:0;;;:7;;;;;;;;;:31;51492:14;;:190;;-1:-1:-1;;;51492:190:0;;:14;;;:65;;:190;;51572:6;;51492:14;;51609:4;;51636;;51656:15;;51492:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51235:455;;:::o;51817:397::-;51911:9;51899:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;51963:14:0;;51931:61;;51948:4;;-1:-1:-1;;;;;51963:14:0;51980:11;51931:8;:61::i;:::-;52003:14;;:203;;-1:-1:-1;;;52003:203:0;;-1:-1:-1;;;;;52003:14:0;;;;:30;;52041:9;;52003:203;;52074:4;;52094:11;;52003:14;;;;52074:4;;52180:15;;52003:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45386:648::-;-1:-1:-1;;;;;45521:15:0;;45503:17;45521:15;;;:9;:15;;;;;;:22;;45537:6;;45521:22;:::i;:::-;45503:40;;45567:27;45589:4;45567:21;:27::i;:::-;45564:102;;;-1:-1:-1;;;;;45609:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;45386:648:0:o;45564:102::-;45731:15;45747:21;45763:4;45747:15;:21::i;:::-;-1:-1:-1;;;;;45806:15:0;;;;;;:9;:15;;;;;:25;;;45915:14;;45731:37;;-1:-1:-1;45915:26:0;;45822:9;;45915:26;:::i;:::-;-1:-1:-1;;;;;45889:23:0;;;;;;:17;:23;;;;;;;;:52;;;;46002:8;:14;;;;;:23;;46018:7;;45889:23;46002;;46018:7;;46002:23;:::i;44649:645::-;-1:-1:-1;;;;;44781:15:0;;44763:17;44781:15;;;:9;:15;;;;;;:22;;44797:6;;44781:22;:::i;:::-;44763:40;;44827:27;44849:4;44827:21;:27::i;:::-;44824:102;;;-1:-1:-1;;;;;44869:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44649:645:0:o;44824:102::-;44991:15;45007:21;45023:4;45007:15;:21::i;:::-;44991:37;;45129:9;45112:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;45086:23:0;;;;;;:17;:23;;;;;;;;:52;;;;45199:8;:14;;;;;:23;;45215:7;;45086:23;45199;;45215:7;;45199:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;45261:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;44649:645:0:o;41822:156::-;41912:7;41965:5;41951:10;41940:21;;41947:3;41940:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;41939:31;;;;:::i;:::-;41932:38;41822:156;-1:-1:-1;;;;41822:156:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:156::-;219:20;;279:4;268:16;;258:27;;248:2;;299:1;296;289:12;314:257;373:6;426:2;414:9;405:7;401:23;397:32;394:2;;;447:6;439;432:22;394:2;491:9;478:23;510:31;535:5;510:31;:::i;576:261::-;646:6;699:2;687:9;678:7;674:23;670:32;667:2;;;720:6;712;705:22;667:2;757:9;751:16;776:31;801:5;776:31;:::i;842:398::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:2;;;992:6;984;977:22;939:2;1036:9;1023:23;1055:31;1080:5;1055:31;:::i;:::-;1105:5;-1:-1:-1;1162:2:1;1147:18;;1134:32;1175:33;1134:32;1175:33;:::i;:::-;1227:7;1217:17;;;929:311;;;;;:::o;1245:466::-;1322:6;1330;1338;1391:2;1379:9;1370:7;1366:23;1362:32;1359:2;;;1412:6;1404;1397:22;1359:2;1456:9;1443:23;1475:31;1500:5;1475:31;:::i;:::-;1525:5;-1:-1:-1;1582:2:1;1567:18;;1554:32;1595:33;1554:32;1595:33;:::i;:::-;1349:362;;1647:7;;-1:-1:-1;;;1701:2:1;1686:18;;;;1673:32;;1349:362::o;1716:325::-;1784:6;1792;1845:2;1833:9;1824:7;1820:23;1816:32;1813:2;;;1866:6;1858;1851:22;1813:2;1910:9;1897:23;1929:31;1954:5;1929:31;:::i;:::-;1979:5;2031:2;2016:18;;;;2003:32;;-1:-1:-1;;;1803:238:1:o;2046:1177::-;2130:6;2161:2;2204;2192:9;2183:7;2179:23;2175:32;2172:2;;;2225:6;2217;2210:22;2172:2;2270:9;2257:23;2299:18;2340:2;2332:6;2329:14;2326:2;;;2361:6;2353;2346:22;2326:2;2404:6;2393:9;2389:22;2379:32;;2449:7;2442:4;2438:2;2434:13;2430:27;2420:2;;2476:6;2468;2461:22;2420:2;2517;2504:16;2539:2;2535;2532:10;2529:2;;;2545:18;;:::i;:::-;2591:2;2588:1;2584:10;2623:2;2617:9;2686:2;2682:7;2677:2;2673;2669:11;2665:25;2657:6;2653:38;2741:6;2729:10;2726:22;2721:2;2709:10;2706:18;2703:46;2700:2;;;2752:18;;:::i;:::-;2788:2;2781:22;2838:18;;;2872:15;;;;-1:-1:-1;2907:11:1;;;2937;;;2933:20;;2930:33;-1:-1:-1;2927:2:1;;;2981:6;2973;2966:22;2927:2;3008:6;2999:15;;3023:169;3037:2;3034:1;3031:9;3023:169;;;3094:23;3113:3;3094:23;:::i;:::-;3082:36;;3055:1;3048:9;;;;;3138:12;;;;3170;;3023:169;;;-1:-1:-1;3211:6:1;2141:1082;-1:-1:-1;;;;;;;;2141:1082:1:o;3228:251::-;3284:6;3337:2;3325:9;3316:7;3312:23;3308:32;3305:2;;;3358:6;3350;3343:22;3305:2;3402:9;3389:23;3421:28;3443:5;3421:28;:::i;3484:255::-;3551:6;3604:2;3592:9;3583:7;3579:23;3575:32;3572:2;;;3625:6;3617;3610:22;3572:2;3662:9;3656:16;3681:28;3703:5;3681:28;:::i;3744:190::-;3803:6;3856:2;3844:9;3835:7;3831:23;3827:32;3824:2;;;3877:6;3869;3862:22;3824:2;-1:-1:-1;3905:23:1;;3814:120;-1:-1:-1;3814:120:1:o;3939:194::-;4009:6;4062:2;4050:9;4041:7;4037:23;4033:32;4030:2;;;4083:6;4075;4068:22;4030:2;-1:-1:-1;4111:16:1;;4020:113;-1:-1:-1;4020:113:1:o;4138:258::-;4206:6;4214;4267:2;4255:9;4246:7;4242:23;4238:32;4235:2;;;4288:6;4280;4273:22;4235:2;-1:-1:-1;;4316:23:1;;;4386:2;4371:18;;;4358:32;;-1:-1:-1;4225:171:1:o;4401:316::-;4489:6;4497;4505;4558:2;4546:9;4537:7;4533:23;4529:32;4526:2;;;4579:6;4571;4564:22;4526:2;4613:9;4607:16;4597:26;;4663:2;4652:9;4648:18;4642:25;4632:35;;4707:2;4696:9;4692:18;4686:25;4676:35;;4516:201;;;;;:::o;4722:192::-;4779:6;4832:2;4820:9;4811:7;4807:23;4803:32;4800:2;;;4853:6;4845;4838:22;4800:2;4881:27;4898:9;4881:27;:::i;4919:545::-;5011:6;5019;5027;5035;5043;5051;5104:3;5092:9;5083:7;5079:23;5075:33;5072:2;;;5126:6;5118;5111:22;5072:2;5154:27;5171:9;5154:27;:::i;:::-;5144:37;;5200:36;5232:2;5221:9;5217:18;5200:36;:::i;:::-;5190:46;;5255:36;5287:2;5276:9;5272:18;5255:36;:::i;:::-;5245:46;;5310:36;5342:2;5331:9;5327:18;5310:36;:::i;:::-;5300:46;;5365:37;5397:3;5386:9;5382:19;5365:37;:::i;:::-;5355:47;;5421:37;5453:3;5442:9;5438:19;5421:37;:::i;:::-;5411:47;;5062:402;;;;;;;;:::o;5469:463::-;5522:3;5560:5;5554:12;5587:6;5582:3;5575:19;5613:4;5642:2;5637:3;5633:12;5626:19;;5679:2;5672:5;5668:14;5700:3;5712:195;5726:6;5723:1;5720:13;5712:195;;;5791:13;;-1:-1:-1;;;;;5787:39:1;5775:52;;5847:12;;;;5882:15;;;;5823:1;5741:9;5712:195;;;-1:-1:-1;5923:3:1;;5530:402;-1:-1:-1;;;;;5530:402:1:o;6634:607::-;-1:-1:-1;;;;;6993:15:1;;;6975:34;;7040:2;7025:18;;7018:34;;;;7083:2;7068:18;;7061:34;;;;7126:2;7111:18;;7104:34;;;;7175:15;;;7169:3;7154:19;;7147:44;6955:3;7207:19;;7200:35;;;;6924:3;6909:19;;6891:350::o;7438:510::-;7709:6;7698:9;7691:25;7752:3;7747:2;7736:9;7732:18;7725:31;7672:4;7773:57;7825:3;7814:9;7810:19;7802:6;7773:57;:::i;:::-;-1:-1:-1;;;;;7866:32:1;;;;7861:2;7846:18;;7839:60;-1:-1:-1;7930:2:1;7915:18;7908:34;7765:65;7681:267;-1:-1:-1;;7681:267:1:o;7953:603::-;8065:4;8094:2;8123;8112:9;8105:21;8155:6;8149:13;8198:6;8193:2;8182:9;8178:18;8171:34;8223:4;8236:140;8250:6;8247:1;8244:13;8236:140;;;8345:14;;;8341:23;;8335:30;8311:17;;;8330:2;8307:26;8300:66;8265:10;;8236:140;;;8394:6;8391:1;8388:13;8385:2;;;8464:4;8459:2;8450:6;8439:9;8435:22;8431:31;8424:45;8385:2;-1:-1:-1;8540:2:1;8519:15;-1:-1:-1;;8515:29:1;8500:45;;;;8547:2;8496:54;;8074:482;-1:-1:-1;;;8074:482:1:o;14797:342::-;14999:2;14981:21;;;15038:2;15018:18;;;15011:30;-1:-1:-1;;;15072:2:1;15057:18;;15050:48;15130:2;15115:18;;14971:168::o;18577:582::-;18876:6;18865:9;18858:25;18919:6;18914:2;18903:9;18899:18;18892:34;18962:3;18957:2;18946:9;18942:18;18935:31;18839:4;18983:57;19035:3;19024:9;19020:19;19012:6;18983:57;:::i;:::-;-1:-1:-1;;;;;19076:32:1;;;;19071:2;19056:18;;19049:60;-1:-1:-1;19140:3:1;19125:19;19118:35;18975:65;18848:311;-1:-1:-1;;;18848:311:1:o;20146:128::-;20186:3;20217:1;20213:6;20210:1;20207:13;20204:2;;;20223:18;;:::i;:::-;-1:-1:-1;20259:9:1;;20194:80::o;20279:204::-;20317:3;20353:4;20350:1;20346:12;20385:4;20382:1;20378:12;20420:3;20414:4;20410:14;20405:3;20402:23;20399:2;;;20428:18;;:::i;:::-;20464:13;;20325:158;-1:-1:-1;;;20325:158:1:o;20488:217::-;20528:1;20554;20544:2;;-1:-1:-1;;;20579:31:1;;20633:4;20630:1;20623:15;20661:4;20586:1;20651:15;20544:2;-1:-1:-1;20690:9:1;;20534:171::o;20710:422::-;20799:1;20842:5;20799:1;20856:270;20877:7;20867:8;20864:21;20856:270;;;20936:4;20932:1;20928:6;20924:17;20918:4;20915:27;20912:2;;;20945:18;;:::i;:::-;20995:7;20985:8;20981:22;20978:2;;;21015:16;;;;20978:2;21094:22;;;;21054:15;;;;20856:270;;;20860:3;20774:358;;;;;:::o;21137:140::-;21195:5;21224:47;21265:4;21255:8;21251:19;21245:4;21331:5;21361:8;21351:2;;-1:-1:-1;21402:1:1;21416:5;;21351:2;21450:4;21440:2;;-1:-1:-1;21487:1:1;21501:5;;21440:2;21532:4;21550:1;21545:59;;;;21618:1;21613:130;;;;21525:218;;21545:59;21575:1;21566:10;;21589:5;;;21613:130;21650:3;21640:8;21637:17;21634:2;;;21657:18;;:::i;:::-;-1:-1:-1;;21713:1:1;21699:16;;21728:5;;21525:218;;21827:2;21817:8;21814:16;21808:3;21802:4;21799:13;21795:36;21789:2;21779:8;21776:16;21771:2;21765:4;21762:12;21758:35;21755:77;21752:2;;;-1:-1:-1;21864:19:1;;;21896:5;;21752:2;21943:34;21968:8;21962:4;21943:34;:::i;:::-;22013:6;22009:1;22005:6;22001:19;21992:7;21989:32;21986:2;;;22024:18;;:::i;:::-;22062:20;;21341:747;-1:-1:-1;;;21341:747:1:o;22093:168::-;22133:7;22199:1;22195;22191:6;22187:14;22184:1;22181:21;22176:1;22169:9;22162:17;22158:45;22155:2;;;22206:18;;:::i;:::-;-1:-1:-1;22246:9:1;;22145:116::o;22266:125::-;22306:4;22334:1;22331;22328:8;22325:2;;;22339:18;;:::i;:::-;-1:-1:-1;22376:9:1;;22315:76::o;22396:135::-;22435:3;-1:-1:-1;;22456:17:1;;22453:2;;;22476:18;;:::i;:::-;-1:-1:-1;22523:1:1;22512:13;;22443:88::o;22536:127::-;22597:10;22592:3;22588:20;22585:1;22578:31;22628:4;22625:1;22618:15;22652:4;22649:1;22642:15;22668:127;22729:10;22724:3;22720:20;22717:1;22710:31;22760:4;22757:1;22750:15;22784:4;22781:1;22774:15;22800:131;-1:-1:-1;;;;;22875:31:1;;22865:42;;22855:2;;22921:1;22918;22911:12;22936:118;23022:5;23015:13;23008:21;23001:5;22998:32;22988:2;;23044:1;23041;23034:12

Swarm Source

ipfs://40ae7c8be50d8aaf223159ec8a9e7e028917b32b4c74842a0a8165b941360a9b
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.