Contract 0x0cae6c43fe2f43757a767df90cf5054280110f3e 7

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3960103a5caa99a713e3a88402bfe11c4d36063903ec8b43f69665c413a50518Transfer144700862022-01-18 10:11:4157 mins ago0x4593ec923f8d682e820b69ebe1f4533533f05ff4 IN  SafeAffinity: AFFINITY Token0 BNB0.00247877
0x0a0b456355f0378813ba8dbc6a054dc17edf73da7bdc4708ae99b2caa864ae03Approve144678852022-01-18 8:20:262 hrs 48 mins ago0xfe517129b8bb25151e2590e0b92aadc2903ed772 IN  SafeAffinity: AFFINITY Token0 BNB0.00022505
0xc6971f7ba8b54765af61ec716bcc462c41708decd91c3d7eaebd47e9ef93557bApprove144668202022-01-18 7:27:043 hrs 42 mins ago0x578349aef65e62b8616381fbe2e52128df3885d5 IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0x640ebd6fbe10f03978c613075f1cf63efbd8306168b803ba1d767570f147f3b0Approve144660632022-01-18 6:49:044 hrs 20 mins ago0xd7937a8c06825752cb8071a38d5d4478821abb84 IN  SafeAffinity: AFFINITY Token0 BNB0.00012755
0x2937ca6af8fba1cab78708f3b69f19238860de0bccf4c02cdab708e56efb50dcApprove144660132022-01-18 6:46:344 hrs 22 mins ago0xd7937a8c06825752cb8071a38d5d4478821abb84 IN  SafeAffinity: AFFINITY Token0 BNB0.00014855
0x6771ef86ff4fb3196f4bf7723c1b9e6e8635e126484a46b397ab69247b1fd912Transfer144644042022-01-18 5:24:355 hrs 44 mins ago0xfa8f032cb1a3c21ac3ce2fd3c7b5b725dc43e27b IN  SafeAffinity: AFFINITY Token0 BNB0.0019672
0xdf3946e9b2c089ab8c089d042f385a35eeee7415b906c59541976de60d438dd6Claim Earn Divid...144635802022-01-18 4:43:166 hrs 26 mins ago0x5330f27dcd2206eef96668b1ad11a268bf8b9a56 IN  SafeAffinity: AFFINITY Token0 BNB0.000357575
0xb20c36553faf3df4ec72c0a9629b564da97689b97ea5ac48c1b8596c5dd21ae0Approve144633842022-01-18 4:33:236 hrs 36 mins ago0x1b38750db51c3daa3dfeaf2cde8bf22686ec09ed IN  SafeAffinity: AFFINITY Token0 BNB0.00012749
0x472a4ac10794435183b72555cf328552b7e4f50eeff4f7e530513f3141038a6cClaim Earn Divid...144627532022-01-18 4:01:507 hrs 7 mins ago0x757f5ac4e5caf505d0b658c4263dc6ac688e79a7 IN  SafeAffinity: AFFINITY Token0 BNB0.00013709
0x2d1d076191e7483ac4d0ae5c9edde91ceed967ad37c188c89b8885ffa57a0994Claim Vault Divi...144627512022-01-18 4:01:447 hrs 7 mins ago0x757f5ac4e5caf505d0b658c4263dc6ac688e79a7 IN  SafeAffinity: AFFINITY Token0 BNB0.000358125
0xe318062309ad4e125a94a229e78d3da1fece94d04d5e8ffe6b0f9dc632cbaad2Approve144624252022-01-18 3:45:267 hrs 23 mins ago0xc1d507ee305e49d69090bc45fededc7d5fac72bf IN  SafeAffinity: AFFINITY Token0 BNB0.00022355
0xa3f598047eb6d60bc816e108762610a548188e3467caec619016d0d1523d3e7dApprove144623902022-01-18 3:43:417 hrs 25 mins ago0xc018f093d39946e1004ed0e2eee8c43defc05384 IN  SafeAffinity: AFFINITY Token0 BNB0.00022505
0x475e9a00b12d88704a97e417d642cc8e013e8d9f3f97de4c9f6579a668acb269Approve144623582022-01-18 3:42:057 hrs 27 mins ago0x0f208a393780984a41f5e5569046e2788ec73c8a IN  SafeAffinity: AFFINITY Token0 BNB0.00014849
0x55caac650d164cd667d8b6a758ca35505bbeaf4290772e07cc84da7385c93a2bApprove144621602022-01-18 3:32:117 hrs 37 mins ago0x0f208a393780984a41f5e5569046e2788ec73c8a IN  SafeAffinity: AFFINITY Token0 BNB0.00022349
0x8c98966e835c631bfd0aeb2708c4da124b3069f868a0537ccbb63f29dbce3f8dClaim Earn Divid...144619482022-01-18 3:21:357 hrs 47 mins ago0x0f208a393780984a41f5e5569046e2788ec73c8a IN  SafeAffinity: AFFINITY Token0 BNB0.000357575
0x1b0d3fc56c0e48d7c3410e1d0a7d3a41b305a3c5b86010596d0974f162bb9a25Claim Vault Divi...144619442022-01-18 3:21:237 hrs 48 mins ago0x0f208a393780984a41f5e5569046e2788ec73c8a IN  SafeAffinity: AFFINITY Token0 BNB0.00016897
0xcf0ace73f891d712ec15e95b0cae29e3eec894e57e15884e8ddacbf22a4e1d1fApprove144612162022-01-18 2:44:208 hrs 25 mins ago0x624a4b138db675700b7466aee06db97f8e65ab22 IN  SafeAffinity: AFFINITY Token0 BNB0.00014855
0x2b06e6b3a28a2da829cf55dbc731168fc0d4a09f61eee292fad7dac8b08320dbClaim Vault Divi...144595152022-01-18 1:18:469 hrs 50 mins ago0x4fa3122a5f3158ad4d536f79685655ebf559230c IN  SafeAffinity: AFFINITY Token0 BNB0.000358125
0xf127175f00772f3d782b6527fe956cf64b7a0e5d29bab91fbb9aaedd19c7fd14Transfer144586942022-01-18 0:37:3910 hrs 31 mins ago0xf9715ae3ad6087d1ecce74efe24a465edb3b9177 IN  SafeAffinity: AFFINITY Token0 BNB0.003267115
0x59f19411c0b668e74fcd9207898cf508fa119372691a43bb6e0b7fb3e3d93038Approve144562622022-01-17 22:33:5712 hrs 35 mins ago0x660e23729093ba354917d69fdf62b3214a7e37b5 IN  SafeAffinity: AFFINITY Token0 BNB0.00022355
0x97aa44b3d80936a2a5fa653c2738fcd5c7dc10be93444b1140bcba85f25f44baClaim Vault Divi...144557742022-01-17 22:09:3312 hrs 59 mins ago0x245292df9a2006bd0277e15d0b9c7a3dd809b05d IN  SafeAffinity: AFFINITY Token0 BNB0.000141955
0x127fe46bf05cca7ee4bec1d0cc1333903cc434bfc204d6901ed5d2ce7b229d30Claim Earn Divid...144557712022-01-17 22:09:2412 hrs 59 mins ago0x245292df9a2006bd0277e15d0b9c7a3dd809b05d IN  SafeAffinity: AFFINITY Token0 BNB0.000141405
0xe4425768cc6009e052421162d952bcf49a44102746975fd8a61838acfaf228bdApprove144556922022-01-17 22:05:2713 hrs 3 mins ago0xa44e0e87876bce9f520e1b46913e0569d13398df IN  SafeAffinity: AFFINITY Token0 BNB0.000268332
0x7ba1a20df1b48bb7d57e519edee93fa00e1a0d0a378ac1bae6caecb579aeba0bApprove144539622022-01-17 20:38:5214 hrs 30 mins ago0x00f1280c0d4c83e2c49fe05899dcd3134fd87099 IN  SafeAffinity: AFFINITY Token0 BNB0.00012749
0xd84f4fbb957433bc0bc7b59c0ad85f8e4b53d2b211845d1e1dc35a8a83a51a69Approve144537672022-01-17 20:29:0714 hrs 40 mins ago0x460cbf2e81d82eacd2d8c468f437b020f9843543 IN  SafeAffinity: AFFINITY Token0 BNB0.00022361
[ Download CSV Export 

OVERVIEW

Deflationary token on the BSC rewarding holders with both SafeEarn and SafeVault for holding, while also receiving Safemoon from those rewards tokens!

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8f89e6aada7647b853b7cbebcda462768e87edae7124d099d425545defd70b28144617272022-01-18 3:09:547 hrs 59 mins ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.457387281090593704 BNB
0x8f89e6aada7647b853b7cbebcda462768e87edae7124d099d425545defd70b28144617272022-01-18 3:09:547 hrs 59 mins ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.769895931373334343 BNB
0xc03af9c6883118738590ce5cb773a0425068c712bd10a191bf332a9c4bb71a86144617132022-01-18 3:09:128 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.227283212463928047 BNB
0x4e9c969efe361e111123cdd7264137aa94ed8d6681075b0c90f7c49b965e13f1144281052022-01-16 22:51:251 day 12 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.459799772645673179 BNB
0x4e9c969efe361e111123cdd7264137aa94ed8d6681075b0c90f7c49b965e13f1144281052022-01-16 22:51:251 day 12 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.795054771876306013 BNB
0x87453de6f26b4fa3644f6f82cf54d7a280a17447e246ec35d693e89fc9c83398144279732022-01-16 22:44:491 day 12 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.254854544521979192 BNB
0x50d8a392c81fb90e2738145a532007cce7d3d542b7533f9f87eacb70c0d8f872143683142022-01-14 20:52:403 days 14 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.45579579889237016 BNB
0x50d8a392c81fb90e2738145a532007cce7d3d542b7533f9f87eacb70c0d8f872143683142022-01-14 20:52:403 days 14 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.753299045591860249 BNB
0x60eb0a2aeafbd80229b95f8ed79785a3760648c8798bf2fe215da012de4697a7143679282022-01-14 20:33:223 days 14 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.209094844484230409 BNB
0x2c82840376968f434a666ef2e7e666b82101c9eb3cbb7d238d4facc5ac76da95143305002022-01-13 13:16:434 days 21 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.458003965804632057 BNB
0x2c82840376968f434a666ef2e7e666b82101c9eb3cbb7d238d4facc5ac76da95143305002022-01-13 13:16:434 days 21 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.776327071962591459 BNB
0xae3e0bd276f6a8de4a9861427b4e98d6bdf87fdd18571b1d4925ec10641db04a143304282022-01-13 13:13:074 days 21 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.234331037767223516 BNB
0xeacf25bd80f5e0ea6b393cb0e58af997f4f3ea30f7b2cf41b99e7b931d83abed143267372022-01-13 10:08:345 days 1 hr ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.473687269009472626 BNB
0xeacf25bd80f5e0ea6b393cb0e58af997f4f3ea30f7b2cf41b99e7b931d83abed143267372022-01-13 10:08:345 days 1 hr ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.939881519670214535 BNB
0xeacf25bd80f5e0ea6b393cb0e58af997f4f3ea30f7b2cf41b99e7b931d83abed143267372022-01-13 10:08:345 days 1 hr ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.413568788679687161 BNB
0x5211b3d049858b6a7d9f629d4e63158d1715dab94a6a28ffd7a452acf1d434d1142833782022-01-11 21:56:446 days 13 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.476315674836765387 BNB
0x5211b3d049858b6a7d9f629d4e63158d1715dab94a6a28ffd7a452acf1d434d1142833782022-01-11 21:56:446 days 13 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd4.967292037583410467 BNB
0x80c0418c1ab2d623b11734efe8e9eeca51596b8cabc9265947684d63fc6a9fef142833382022-01-11 21:54:446 days 13 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.443607712420175854 BNB
0x6417aefd264fd495176d6fad73b082ab0cd72d2ea573184ea26e635ea922d67a142787542022-01-11 18:05:326 days 17 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.479783028783865692 BNB
0x6417aefd264fd495176d6fad73b082ab0cd72d2ea573184ea26e635ea922d67a142787542022-01-11 18:05:326 days 17 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd5.003451585888885082 BNB
0xcf606a529dad835468dcbd25f90903cb6deb422cde2412cd317d9ca7508e6a15142786852022-01-11 18:02:056 days 17 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.483234614672750774 BNB
0xe55d7fd109541f270b133e17066cee1bc15e76ed30f84d914219b668aca43ab9142643382022-01-11 6:02:247 days 5 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.49983054991400319 BNB
0xe55d7fd109541f270b133e17066cee1bc15e76ed30f84d914219b668aca43ab9142643382022-01-11 6:02:247 days 5 hrs ago SafeAffinity: AFFINITY Token 0xb81b272fde39f698c69a67620aa9978724e770cd5.21251859196031899 BNB
0xe55d7fd109541f270b133e17066cee1bc15e76ed30f84d914219b668aca43ab9142643382022-01-11 6:02:247 days 5 hrs ago PancakeSwap: Router v2 SafeAffinity: AFFINITY Token5.71234914187432218 BNB
0x4260e976978bd1c673b4f85882118eaab49f0e759962fb3acfee7c16dd69b937142453892022-01-10 14:11:037 days 20 hrs ago SafeAffinity: AFFINITY Token0x66cf1ef841908873c34e6bbf1586f4000b9fbb5d0.504011083776736716 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SafeAffinity

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 10: SafeAffinity.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "./AffinityDistributor.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapRouter02.sol";

/** 
 * Contract: SafeAffinity 
 * 
 *  This Contract Awards SafeVault and SafeEarn to holders
 *  weighted by how much SafeAffinity you hold
 * 
 *  Transfer Fee:  8%
 *  Buy Fee:       8%
 *  Sell Fee:     20%
 * 
 *  Fees Go Toward:
 *  43.75% SafeVault Distribution
 *  43.75% SafeEarn Distribution
 *  8.75% Burn
 *  3.75% Marketing
 */
contract SafeAffinity is IERC20, Context, Ownable {
    
    using SafeMath for uint256;
    using SafeMath for uint8;
    using Address for address;

    // token data
    string constant _name = "SafeAffinity";
    string constant _symbol = "AFFINITY";
    uint8 constant _decimals = 9;
    // 1 Trillion Max Supply
    uint256 _totalSupply = 1 * 10**12 * (10 ** _decimals);
    uint256 public _maxTxAmount = _totalSupply.div(200); // 0.5% or 5 Billion
    // balances
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    // exemptions
    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;
    // fees
    uint256 public burnFee = 175;
    uint256 public reflectionFee = 1750;
    uint256 public marketingFee = 75;
    // total fees
    uint256 totalFeeSells = 2000;
    uint256 totalFeeBuys = 800;
    uint256 feeDenominator = 10000;
    // Marketing Funds Receiver
    address public marketingFeeReceiver = 0x66cF1ef841908873C34e6bbF1586F4000b9fBB5D;
    // minimum bnb needed for distribution
    uint256 public minimumToDistribute = 5 * 10**18;
    // Pancakeswap V2 Router
    IUniswapV2Router02 router;
    address public pair;
    bool public allowTransferToMarketing = true;
    // gas for distributor
    AffinityDistributor public distributor;
    uint256 distributorGas = 500000;
    // in charge of swapping
    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply.div(300); // 0.03% = 300 Million
    // true if our threshold decreases with circulating supply
    bool public canChangeSwapThreshold = false;
    uint256 public swapThresholdPercentOfCirculatingSupply = 300;
    bool inSwap;
    bool isDistributing;
    // false to stop the burn
    bool burnEnabled = true;
    modifier swapping() { inSwap = true; _; inSwap = false; }
    modifier distributing() { isDistributing = true; _; isDistributing = false; }
    // Uniswap Router V2
    address private _dexRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
    
    // initialize some stuff
    constructor (
    ) {
        // Pancakeswap V2 Router
        router = IUniswapV2Router02(_dexRouter);
        // Liquidity Pool Address for BNB -> Vault
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        // our dividend Distributor
        distributor = new AffinityDistributor(_dexRouter);
        // exempt deployer and contract from fees
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        // exempt important addresses from TX limit
        isTxLimitExempt[msg.sender] = true;
        isTxLimitExempt[marketingFeeReceiver] = true;
        isTxLimitExempt[address(distributor)] = true;
        isTxLimitExempt[address(this)] = true;
        // exempt this important addresses  from receiving Rewards
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        // approve router of total supply
        approve(_dexRouter, _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }
    function name() public pure returns (string memory) {
        return _name;
    }

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

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function internalApprove() private {
        _allowances[address(this)][address(router)] = _totalSupply;
        _allowances[address(this)][address(pair)] = _totalSupply;
    }
    
    /** Approve Total Supply */
    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }
    
    /** Transfer Function */
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }
    
    /** Transfer Function */
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }
    
    /** Internal Transfer */
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        // make standard checks
        require(recipient != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        // check if we have reached the transaction limit
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
        // whether transfer succeeded
        bool success;
        // amount of tokens received by recipient
        uint256 amountReceived;
        // if we're in swap perform a basic transfer
        if(inSwap || isDistributing){ 
            (amountReceived, success) = handleTransferBody(sender, recipient, amount); 
            emit Transfer(sender, recipient, amountReceived);
            return success;
        }
        
        // limit gas consumption by splitting up operations
        if(shouldSwapBack()) { 
            swapBack();
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
        } else if (shouldReflectAndDistribute()) {
            reflectAndDistribute();
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
        } else {
            (amountReceived, success) = handleTransferBody(sender, recipient, amount);
            try distributor.process(distributorGas) {} catch {}
        }
        
        emit Transfer(sender, recipient, amountReceived);
        return success;
    }
    
    /** Takes Associated Fees and sets holders' new Share for the Safemoon Distributor */
    function handleTransferBody(address sender, address recipient, uint256 amount) internal returns (uint256, bool) {
        // subtract balance from sender
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        // amount receiver should receive
        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(recipient, amount) : amount;
        // add amount to recipient
        _balances[recipient] = _balances[recipient].add(amountReceived);
        // set shares for distributors
        if(!isDividendExempt[sender]){ 
            distributor.setShare(sender, _balances[sender]);
        }
        if(!isDividendExempt[recipient]){ 
            distributor.setShare(recipient, _balances[recipient]);
        }
        // return the amount received by receiver
        return (amountReceived, true);
    }

    /** False if sender is Fee Exempt, True if not */
    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }
    
    /** Takes Proper Fee (8% buys / transfers, 20% on sells) and stores in contract */
    function takeFee(address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        return amount.sub(feeAmount);
    }
    
    /** True if we should swap from Vault => BNB */
    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }
    
    /**
     *  Swaps SafeAffinity for BNB if threshold is reached and the swap is enabled
     *  Burns 20% of SafeAffinity in Contract
     *  Swaps The Rest For BNB
     */
    function swapBack() private swapping {
        // path from token -> BNB
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        // tokens allocated to burning
        uint256 burnAmount = swapThreshold.mul(burnFee).div(totalFeeSells);
        // burn tokens
        burnTokens(burnAmount);
        // how many are left to swap with
        uint256 swapAmount = swapThreshold.sub(burnAmount);
        // swap tokens for BNB
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            swapAmount,
            0,
            path,
            address(this),
            block.timestamp
        ) {} catch{return;}
        
        // Tell The Blockchain
        emit SwappedBack(swapAmount, burnAmount);
    }
    
    function shouldReflectAndDistribute() private view returns(bool) {
        return msg.sender != pair
        && !isDistributing
        && swapEnabled
        && address(this).balance >= minimumToDistribute;
    }
    
    function reflectAndDistribute() private distributing {
        
        bool success; bool successful;
        uint256 amountBNBMarketing; uint256 amountBNBReflection;
        // allocate bnb
        if (allowTransferToMarketing) {
            amountBNBMarketing = address(this).balance.mul(marketingFee).div(totalFeeSells);
            amountBNBReflection = address(this).balance.sub(amountBNBMarketing);
            // fund distributors
            (success,) = payable(address(distributor)).call{value: amountBNBReflection, gas: 26000}("");
            distributor.deposit();
            // transfer to marketing
            if (allowTransferToMarketing) {
                (successful,) = payable(marketingFeeReceiver).call{value: amountBNBMarketing, gas: 26000}("");
            }
        } else {
            amountBNBReflection = address(this).balance;
            // fund distributors
            (success,) = payable(address(distributor)).call{value: amountBNBReflection, gas: 26000}("");
            distributor.deposit();
        }
        emit FundDistributors(amountBNBReflection, amountBNBMarketing);
    }

    /** Removes Tokens From Circulation */
    function burnTokens(uint256 tokenAmount) private returns (bool) {
        if (!burnEnabled) {
            return false;
        }
        // update balance of contract
        _balances[address(this)] = _balances[address(this)].sub(tokenAmount, 'cannot burn this amount');
        // update Total Supply
        _totalSupply = _totalSupply.sub(tokenAmount, 'total supply cannot be negative');
        // approve Router for total supply
        internalApprove();
        // change Swap Threshold if we should
        if (canChangeSwapThreshold) {
            swapThreshold = _totalSupply.div(swapThresholdPercentOfCirculatingSupply);
        }
        // emit Transfer to Blockchain
        emit Transfer(address(this), address(0), tokenAmount);
        return true;
    }
   
    /** Claim Your Vault Rewards Early */
    function claimVaultDividend() external returns (bool) {
        distributor.claimVAULTDividend(msg.sender);
        return true;
    }
    
    /** Claim Your Earn Rewards Manually */
    function claimEarnDividend() external returns (bool) {
        distributor.claimEarnDividend(msg.sender);
        return true;
    }

    /** Manually Depsoits To The Earn or Vault Contract */
    function manuallyDeposit() external returns (bool){
        distributor.deposit();
        return true;
    }
    
    /** Is Holder Exempt From Fees */
    function getIsFeeExempt(address holder) public view returns (bool) {
        return isFeeExempt[holder];
    }
    
    /** Is Holder Exempt From Earn Dividends */
    function getIsDividendExempt(address holder) public view returns (bool) {
        return isDividendExempt[holder];
    }
    
    /** Is Holder Exempt From Transaction Limit */
    function getIsTxLimitExempt(address holder) public view returns (bool) {
        return isTxLimitExempt[holder];
    }
        
    /** Get Fees for Buying or Selling */
    function getTotalFee(bool selling) public view returns (uint256) {
        if(selling){ return totalFeeSells; }
        return totalFeeBuys;
    }
    
    /** Sets Various Fees */
    function setFees(uint256 _burnFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _buyFee) external onlyOwner {
        burnFee = _burnFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        totalFeeSells = _burnFee.add(_reflectionFee).add(_marketingFee);
        totalFeeBuys = _buyFee;
        require(_buyFee <= 1000);
        require(totalFeeSells < feeDenominator/2);
    }
    
    /** Set Exemption For Holder */
    function setIsFeeAndTXLimitExempt(address holder, bool feeExempt, bool txLimitExempt) external onlyOwner {
        require(holder != address(0));
        isFeeExempt[holder] = feeExempt;
        isTxLimitExempt[holder] = txLimitExempt;
    }
    
    /** Set Holder To Be Exempt From Earn Dividends */
    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt) {
            distributor.setShare(holder, 0);
        } else {
            distributor.setShare(holder, _balances[holder]);
        }
    }
    
    /** Set Settings related to Swaps */
    function setSwapBackSettings(bool _swapEnabled, uint256 _swapThreshold, bool _canChangeSwapThreshold, uint256 _percentOfCirculatingSupply, bool _burnEnabled, uint256 _minimumBNBToDistribute) external onlyOwner {
        swapEnabled = _swapEnabled;
        swapThreshold = _swapThreshold;
        canChangeSwapThreshold = _canChangeSwapThreshold;
        swapThresholdPercentOfCirculatingSupply = _percentOfCirculatingSupply;
        burnEnabled = _burnEnabled;
        minimumToDistribute = _minimumBNBToDistribute;
    }

    /** Set Criteria For SafeAffinity Distributor */
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToTokenThreshold) external onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution, _bnbToTokenThreshold);
    }

    /** Should We Transfer To Marketing */
    function setAllowTransferToMarketing(bool _canSendToMarketing, address _marketingFeeReceiver) external onlyOwner {
        allowTransferToMarketing = _canSendToMarketing;
        marketingFeeReceiver = _marketingFeeReceiver;
    }
    
    /** Updates The Pancakeswap Router */
    function setDexRouter(address nRouter) external onlyOwner{
        require(nRouter != _dexRouter);
        _dexRouter = nRouter;
        router = IUniswapV2Router02(nRouter);
        address _uniswapV2Pair = IUniswapV2Factory(router.factory())
            .createPair(address(this), router.WETH());
        pair = _uniswapV2Pair;
        _allowances[address(this)][address(router)] = _totalSupply;
        distributor.updatePancakeRouterAddress(nRouter);
    }

    /** Set Address For SafeAffinity Distributor */
    function setDistributor(address payable newDistributor) external onlyOwner {
        require(newDistributor != address(distributor), 'Distributor already has this address');
        distributor = AffinityDistributor(newDistributor);
        emit SwappedDistributor(newDistributor);
    }

    /** Swaps SafeAffinity and SafeVault Addresses in case of migration */
    function setTokenAddresses(address nSafeEarn, address nSafeVault) external onlyOwner {
        distributor.setSafeEarnAddress(nSafeEarn);
        distributor.setSafeVaultAddress(nSafeVault);
        emit SwappedTokenAddresses(nSafeEarn, nSafeVault);
    }
    
    /** Deletes the entire bag from sender */
    function deleteBag(uint256 nTokens) external returns(bool){
        // make sure you are burning enough tokens
        require(nTokens > 0);
        // if the balance is greater than zero
        require(_balances[msg.sender] >= nTokens, 'user does not own enough tokens');
        // remove tokens from sender
        _balances[msg.sender] = _balances[msg.sender].sub(nTokens, 'cannot have negative tokens');
        // remove tokens from total supply
        _totalSupply = _totalSupply.sub(nTokens, 'total supply cannot be negative');
        // approve Router for the new total supply
        internalApprove();
        // set share in distributor
        distributor.setShare(msg.sender, _balances[msg.sender]);
        // tell blockchain
        emit Transfer(msg.sender, address(0), nTokens);
        return true;
    }

    // Events
    event SwappedDistributor(address newDistributor);
    event SwappedBack(uint256 tokensSwapped, uint256 amountBurned);
    event SwappedTokenAddresses(address newSafeEarn, address newSafeVault);
    event FundDistributors(uint256 reflectionAmount, uint256 marketingAmount);
}

File 2 of 10: Address.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library Address {

    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev 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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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);
            }
        }
    }

}

File 3 of 10: AffinityDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "./IAffinityDistributor.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./IUniswapRouter02.sol";

/** Distributes SafeVault and SafeEarn To Holders Varied on Weight */
contract AffinityDistributor is IAffinityDistributor {
    
    using SafeMath for uint256;
    using Address for address;
    
    // SafeVault Contract
    address _token;
    // Share of SafeVault
    struct Share {
        uint256 amount;
        uint256 totalExcludedVault;
        uint256 totalRealisedVault;
        uint256 totalExcludedEarn;
        uint256 totalRealisedEarn;
    }
    // SafeEarn contract address
    address SafeEarn = 0x099f551eA3cb85707cAc6ac507cBc36C96eC64Ff;
    // SafeVault
    address SafeVault = 0xe2e6e66551E5062Acd56925B48bBa981696CcCC2;

    // Pancakeswap Router
    IUniswapV2Router02 router;
    // shareholder fields
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => Share) public shares;
    // shares math and fields
    uint256 public totalShares;
    uint256 public totalDividendsEARN;
    uint256 public dividendsPerShareEARN;

    uint256 public totalDividendsVAULT;
    uint256 public dividendsPerShareVAULT;

    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;
    // distributes twice per day
    uint256 public minPeriod = 4 hours;
    // auto claim
    uint256 public minAutoPeriod = 1 hours;
    // 20,000 Minimum Distribution
    uint256 public minDistribution = 2 * 10**4;
    // BNB Needed to Swap to SafeAffinity
    uint256 public swapToTokenThreshold = 5 * (10 ** 18);
    // current index in shareholder array 
    uint256 currentIndexEarn;
    // current index in shareholder array 
    uint256 currentIndexVault;
    
    bool earnsTurnPurchase = false;
    bool earnsTurnDistribute = true;
    
    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
        ? IUniswapV2Router02(_router)
        : IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToTokenThreshold) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        swapToTokenThreshold = _bnbToTokenThreshold;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeVaultDividend(shareholder);
            distributeEarnDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcludedVault = getCumulativeVaultDividends(shares[shareholder].amount);
        shares[shareholder].totalExcludedEarn = getCumulativeEarnDividends(shares[shareholder].amount);

    }
    
    function deposit() external override onlyToken {
        if (address(this).balance < swapToTokenThreshold) return;
        
        if (earnsTurnPurchase) {
            
            uint256 balanceBefore = IERC20(SafeEarn).balanceOf(address(this));
            
            address[] memory path = new address[](2);
            path[0] = router.WETH();
            path[1] = SafeEarn;

            try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: swapToTokenThreshold}(
                0,
                path,
                address(this),
                block.timestamp.add(30)
            ) {} catch {return;}

            uint256 amount = IERC20(SafeEarn).balanceOf(address(this)).sub(balanceBefore);

            totalDividendsEARN = totalDividendsEARN.add(amount);
            dividendsPerShareEARN = dividendsPerShareEARN.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
            earnsTurnPurchase = false;
            
        } else {
            
            uint256 balanceBefore = IERC20(SafeVault).balanceOf(address(this));
            
            address[] memory path = new address[](2);
            path[0] = router.WETH();
            path[1] = SafeVault;

            try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: swapToTokenThreshold}(
                0,
                path,
                address(this),
                block.timestamp.add(30)
            ) {} catch {return;}

            uint256 amount = IERC20(SafeVault).balanceOf(address(this)).sub(balanceBefore);

            totalDividendsVAULT = totalDividendsVAULT.add(amount);
            dividendsPerShareVAULT = dividendsPerShareVAULT.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
            earnsTurnPurchase = true;
        }
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        earnsTurnDistribute = !earnsTurnDistribute;
        uint256 iterations = 0;
        
        if (earnsTurnDistribute) {
            
            while(gasUsed < gas && iterations < shareholderCount) {
                if(currentIndexEarn >= shareholderCount){
                    currentIndexEarn = 0;
                }

                if(shouldDistributeEarn(shareholders[currentIndexEarn])){
                    distributeEarnDividend(shareholders[currentIndexEarn]);
                }
            
                gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
                gasLeft = gasleft();
                currentIndexEarn++;
                iterations++;
            }
            
        } else {
            
            while(gasUsed < gas && iterations < shareholderCount) {
                if(currentIndexVault >= shareholderCount){
                    currentIndexVault = 0;
                }

                if(shouldDistributeVault(shareholders[currentIndexVault])){
                    distributeVaultDividend(shareholders[currentIndexVault]);
                }

                gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
                gasLeft = gasleft();
                currentIndexVault++;
                iterations++;
            }
            
        }
        
    }
    
    function processManually() external override returns(bool) {
        uint256 shareholderCount = shareholders.length;
        
        if(shareholderCount == 0) { return false; }

        uint256 iterations = 0;
        uint256 index = 0;

        while(iterations < shareholderCount) {
            if(index >= shareholderCount){
                index = 0;
            }

            if(shouldDistributeVault(shareholders[index])){
                distributeVaultDividend(shareholders[index]);
            }
            index++;
            iterations++;
        }
        return true;
    }

    function shouldDistributeVault(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidVaultEarnings(shareholder) > minDistribution;
    }
    
    function shouldDistributeEarn(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnEarnings(shareholder) > minDistribution;
    }

    function distributeVaultDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidVaultEarnings(shareholder);
        if(amount > 0){
            bool success = IERC20(SafeVault).transfer(shareholder, amount);
            if (success) {
                shareholderClaims[shareholder] = block.timestamp;
                shares[shareholder].totalRealisedVault = shares[shareholder].totalRealisedVault.add(amount);
                shares[shareholder].totalExcludedVault = getCumulativeVaultDividends(shares[shareholder].amount);
            }
        }
    }
    
    function distributeEarnDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnEarnings(shareholder);
        if(amount > 0){
            bool success = IERC20(SafeEarn).transfer(shareholder, amount);
            if (success) {
                shareholderClaims[shareholder] = block.timestamp;
                shares[shareholder].totalRealisedEarn = shares[shareholder].totalRealisedEarn.add(amount);
                shares[shareholder].totalExcludedEarn = getCumulativeEarnDividends(shares[shareholder].amount);
            }
        }   
    }
    
    function claimEarnDividend(address claimer) external override onlyToken {
        require(shareholderClaims[claimer] + minAutoPeriod < block.timestamp, 'must wait at least the minimum auto withdraw period');
        distributeEarnDividend(claimer);
    }
    
    function claimVAULTDividend(address claimer) external override onlyToken {
        require(shareholderClaims[claimer] + minAutoPeriod < block.timestamp, 'must wait at least the minimum auto withdraw period');
        distributeVaultDividend(claimer);
    }

    function getUnpaidVaultEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeVaultDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcludedVault;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }
    
    function getUnpaidEarnEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeEarnDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcludedEarn;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeVaultDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShareVAULT).div(dividendsPerShareAccuracyFactor);
    }
    
    function getCumulativeEarnDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShareEARN).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal { 
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder]; 
        shareholders.pop();
        delete shareholderIndexes[shareholder]; 
    }

    /** Updates the Address of the PCS Router */
    function updatePancakeRouterAddress(address pcsRouter) external override onlyToken {
        router = IUniswapV2Router02(pcsRouter);
    }
    
    /** New Vault Address */
    function setSafeVaultAddress(address newSafeVault) external override onlyToken {
        SafeVault = newSafeVault;
    }
    
    /** New Earn Address */
    function setSafeEarnAddress(address newSafeEarn) external override onlyToken {
        SafeEarn = newSafeEarn;
    }

    receive() external payable { 
        
    }

}

File 4 of 10: Context.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

File 5 of 10: IAffinityDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

interface IAffinityDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _bnbToSafemoonThreshold) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external;
    function process(uint256 gas) external;
    function processManually() external returns(bool);
    function claimEarnDividend(address sender) external;
    function claimVAULTDividend(address sender) external;
    function updatePancakeRouterAddress(address pcs) external;
    function setSafeEarnAddress(address nSeth) external;
    function setSafeVaultAddress(address nSeth) external;
}

File 6 of 10: IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

File 7 of 10: IUniswapRouter02.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    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 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 IUniswapV2Router02 is IUniswapV2Router01 {
    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;
}

File 8 of 10: IUniswapV2Factory.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Factory {
    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;
}

File 9 of 10: Ownable.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Context.sol";

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

File 10 of 10: SafeMath.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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":"reflectionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingAmount","type":"uint256"}],"name":"FundDistributors","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"}],"name":"SwappedBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDistributor","type":"address"}],"name":"SwappedDistributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeEarn","type":"address"},{"indexed":false,"internalType":"address","name":"newSafeVault","type":"address"}],"name":"SwappedTokenAddresses","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"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowTransferToMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeSwapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEarnDividend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVaultDividend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"nTokens","type":"uint256"}],"name":"deleteBag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract AffinityDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getIsTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manuallyDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumToDistribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canSendToMarketing","type":"bool"},{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setAllowTransferToMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nRouter","type":"address"}],"name":"setDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"},{"internalType":"uint256","name":"_bnbToTokenThreshold","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDistributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"feeExempt","type":"bool"},{"internalType":"bool","name":"txLimitExempt","type":"bool"}],"name":"setIsFeeAndTXLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"bool","name":"_canChangeSwapThreshold","type":"bool"},{"internalType":"uint256","name":"_percentOfCirculatingSupply","type":"uint256"},{"internalType":"bool","name":"_burnEnabled","type":"bool"},{"internalType":"uint256","name":"_minimumBNBToDistribute","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nSafeEarn","type":"address"},{"internalType":"address","name":"nSafeVault","type":"address"}],"name":"setTokenAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdPercentOfCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526009600a62000014919062000e23565b64e8d4a5100062000026919062000f60565b6003556200004660c860035462000a7f60201b62002d8b1790919060201c565b60045560af600a556106d6600b55604b600c556107d0600d55610320600e55612710600f557366cf1ef841908873c34e6bbf1586f4000b9fbb5d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550674563918244f400006011556001601360146101000a81548160ff0219169083151502179055506207a1206015556001601660006101000a81548160ff0219169083151502179055506200012761012c60035462000a7f60201b62002d8b1790919060201c565b6017556000601860006101000a81548160ff02191690831515021790555061012c6019556001601a60026101000a81548160ff0219169083151502179055507310ed43c718714eb63d5aa57b78b54704e256024e601a60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001c857600080fd5b506000620001db62000ad160201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034557600080fd5b505afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000c5a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040457600080fd5b505afa15801562000419573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043f919062000c5a565b306040518363ffffffff1660e01b81526004016200045f92919062000d06565b602060405180830381600087803b1580156200047a57600080fd5b505af11580156200048f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b5919062000c5a565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620005cb9062000c35565b620005d7919062000ce9565b604051809103906000f080158015620005f4573d6000803e3d6000fd5b50601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000991601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000ad960201b60201c565b50620009c8601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660035462000ad960201b60201c565b50600354600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60035460405162000a71919062000d57565b60405180910390a3620010d8565b600062000ac983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000bcd60201b60201c565b905092915050565b600033905090565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000bbb919062000d57565b60405180910390a36001905092915050565b6000808311829062000c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c0e919062000d33565b60405180910390fd5b506000838562000c28919062000d90565b9050809150509392505050565b6135a980620064fe83390190565b60008151905062000c5481620010be565b92915050565b60006020828403121562000c6d57600080fd5b600062000c7d8482850162000c43565b91505092915050565b62000c918162000fc1565b82525050565b600062000ca48262000d74565b62000cb0818562000d7f565b935062000cc28185602086016200100c565b62000ccd81620010a0565b840191505092915050565b62000ce38162000ff5565b82525050565b600060208201905062000d00600083018462000c86565b92915050565b600060408201905062000d1d600083018562000c86565b62000d2c602083018462000c86565b9392505050565b6000602082019050818103600083015262000d4f818462000c97565b905092915050565b600060208201905062000d6e600083018462000cd8565b92915050565b600081519050919050565b600082825260208201905092915050565b600062000d9d8262000ff5565b915062000daa8362000ff5565b92508262000dbd5762000dbc62001071565b5b828204905092915050565b6000808291508390505b600185111562000e1a5780860481111562000df25762000df162001042565b5b600185161562000e025780820291505b808102905062000e1285620010b1565b945062000dd2565b94509492505050565b600062000e308262000ff5565b915062000e3d8362000fff565b925062000e6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e74565b905092915050565b60008262000e86576001905062000f59565b8162000e96576000905062000f59565b816001811462000eaf576002811462000eba5762000ef0565b600191505062000f59565b60ff84111562000ecf5762000ece62001042565b5b8360020a91508482111562000ee95762000ee862001042565b5b5062000f59565b5060208310610133831016604e8410600b841016171562000f2a5782820a90508381111562000f245762000f2362001042565b5b62000f59565b62000f39848484600162000dc8565b9250905081840481111562000f535762000f5262001042565b5b81810290505b9392505050565b600062000f6d8262000ff5565b915062000f7a8362000ff5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000fb65762000fb562001042565b5b828202905092915050565b600062000fce8262000fd5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200102c5780820151818401526020810190506200100f565b838111156200103c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b620010c98162000fc1565b8114620010d557600080fd5b50565b61541680620010e86000396000f3fe6080604052600436106102815760003560e01c80637d1db4a51161014f578063b6c52324116100c1578063f1f3bca31161007a578063f1f3bca3146109c1578063f2fde38b146109fe578063f708a64f14610a27578063f72f863b14610a50578063f8654df714610a79578063fce589d814610aa457610288565b8063b6c52324146108af578063bfe10928146108da578063caf5b50214610905578063dd46706414610930578063dd62ed3e14610959578063e96fada21461099657610288565b80639fc8903e116101135780639fc8903e1461079f578063a69df4b5146107dc578063a89c8c5e146107f3578063a8aa1b311461081c578063a9059cbb14610847578063ac1eaf751461088457610288565b80637d1db4a5146106c857806383ad7994146106f35780638da5cb5b1461071e5780638db2b1731461074957806395d89b411461077457610288565b8063571ac8b0116101f357806370a08231116101ac57806370a08231146105ba578063715018a6146105f757806371bcce021461060e578063735b8e901461063757806375619ab51461066257806375a203111461068b57610288565b8063571ac8b0146104985780635ec99e7b146104d557806361cd7689146104fe5780636b67c4df1461053b5780636ddd1713146105665780636fcba3771461059157610288565b806318160ddd1161024557806318160ddd146103745780631fb868121461039f57806323b872dd146103ca578063313ce567146104075780633b68b7651461043257806341f64b851461045b57610288565b80630445b6671461028d57806306fdde03146102b8578063095ea7b3146102e35780630bfa22d7146103205780630ca61cb11461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610acf565b6040516102af9190614faa565b60405180910390f35b3480156102c457600080fd5b506102cd610ad5565b6040516102da9190614e28565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190614642565b610b12565b6040516103179190614df2565b60405180910390f35b34801561032c57600080fd5b50610335610c04565b6040516103429190614df2565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190614795565b610c8f565b005b34801561038057600080fd5b50610389610dba565b6040516103969190614faa565b60405180910390f35b3480156103ab57600080fd5b506103b4610dc4565b6040516103c19190614df2565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190614568565b610dd7565b6040516103fe9190614df2565b60405180910390f35b34801561041357600080fd5b5061041c610fb9565b604051610429919061507f565b60405180910390f35b34801561043e57600080fd5b50610459600480360381019061045491906146a7565b610fc2565b005b34801561046757600080fd5b50610482600480360381019061047d919061476c565b6110b6565b60405161048f9190614df2565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906144b1565b6113a9565b6040516104cc9190614df2565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f791906146e3565b6113be565b005b34801561050a57600080fd5b50610525600480360381019061052091906144b1565b6114be565b6040516105329190614df2565b60405180910390f35b34801561054757600080fd5b50610550611514565b60405161055d9190614faa565b60405180910390f35b34801561057257600080fd5b5061057b61151a565b6040516105889190614df2565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b391906147e4565b61152d565b005b3480156105c657600080fd5b506105e160048036038101906105dc91906144b1565b61163a565b6040516105ee9190614faa565b60405180910390f35b34801561060357600080fd5b5061060c611683565b005b34801561061a57600080fd5b50610635600480360381019061063091906145f3565b6117d6565b005b34801561064357600080fd5b5061064c611958565b6040516106599190614df2565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190614503565b6119ee565b005b34801561069757600080fd5b506106b260048036038101906106ad91906144b1565b611b8f565b6040516106bf9190614df2565b60405180910390f35b3480156106d457600080fd5b506106dd611be5565b6040516106ea9190614faa565b60405180910390f35b3480156106ff57600080fd5b50610708611beb565b6040516107159190614faa565b60405180910390f35b34801561072a57600080fd5b50610733611bf1565b6040516107409190614d41565b60405180910390f35b34801561075557600080fd5b5061075e611c1a565b60405161076b9190614faa565b60405180910390f35b34801561078057600080fd5b50610789611c20565b6040516107969190614e28565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906144b1565b611c5d565b6040516107d39190614df2565b60405180910390f35b3480156107e857600080fd5b506107f1611cb3565b005b3480156107ff57600080fd5b5061081a6004803603810190610815919061452c565b611e87565b005b34801561082857600080fd5b50610831612073565b60405161083e9190614d41565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190614642565b612099565b60405161087b9190614df2565b60405180910390f35b34801561089057600080fd5b506108996120ae565b6040516108a69190614df2565b60405180910390f35b3480156108bb57600080fd5b506108c46120c1565b6040516108d19190614faa565b60405180910390f35b3480156108e657600080fd5b506108ef6120cb565b6040516108fc9190614e0d565b60405180910390f35b34801561091157600080fd5b5061091a6120f1565b6040516109279190614df2565b60405180910390f35b34801561093c57600080fd5b506109576004803603810190610952919061476c565b612187565b005b34801561096557600080fd5b50610980600480360381019061097b919061452c565b61234e565b60405161098d9190614faa565b60405180910390f35b3480156109a257600080fd5b506109ab6123d5565b6040516109b89190614d41565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e3919061467e565b6123fb565b6040516109f59190614faa565b60405180910390f35b348015610a0a57600080fd5b50610a256004803603810190610a2091906144b1565b612418565b005b348015610a3357600080fd5b50610a4e6004803603810190610a4991906145b7565b6125da565b005b348015610a5c57600080fd5b50610a776004803603810190610a7291906144b1565b6128c7565b005b348015610a8557600080fd5b50610a8e612d7f565b604051610a9b9190614faa565b60405180910390f35b348015610ab057600080fd5b50610ab9612d85565b604051610ac69190614faa565b60405180910390f35b60175481565b60606040518060400160405280600c81526020017f53616665416666696e6974790000000000000000000000000000000000000000815250905090565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bf29190614faa565b60405180910390a36001905092915050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c7057600080fd5b505af1158015610c84573d6000803e3d6000fd5b505050506001905090565b610c97612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ca61cb18484846040518463ffffffff1660e01b8152600401610d8393929190615048565b600060405180830381600087803b158015610d9d57600080fd5b505af1158015610db1573d6000803e3d6000fd5b50505050505050565b6000600354905090565b601860009054906101000a900460ff1681565b6000600354600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610fa557610f24826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610fb0848484612e41565b90509392505050565b60006009905090565b610fca612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614eea565b60405180910390fd5b81601360146101000a81548160ff02191690831515021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008082116110c457600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90614f0a565b60405180910390fd5b6111cf826040518060400160405280601b81526020017f63616e6e6f742068617665206e6567617469766520746f6b656e730000000000815250600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061125e826040518060400160405280601f81526020017f746f74616c20737570706c792063616e6e6f74206265206e6567617469766500815250600354612ddd9092919063ffffffff16565b60038190555061126c6131b2565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9633600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401611308929190614dc9565b600060405180830381600087803b15801561132257600080fd5b505af1158015611336573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113989190614faa565b60405180910390a360019050919050565b60006113b782600354610b12565b9050919050565b6113c6612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90614eea565b60405180910390fd5b85601660006101000a81548160ff0219169083151502179055508460178190555083601860006101000a81548160ff0219169083151502179055508260198190555081601a60026101000a81548160ff02191690831515021790555080601181905550505050505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c5481565b601660009054906101000a900460ff1681565b611535612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990614eea565b60405180910390fd5b83600a8190555082600b8190555081600c819055506115fc826115ee85876132fe90919063ffffffff16565b6132fe90919063ffffffff16565b600d8190555080600e819055506103e881111561161857600080fd5b6002600f546116279190615150565b600d541061163457600080fd5b50505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6117de612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118a557600080fd5b81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348ef3447336040518263ffffffff1660e01b81526004016119b59190614d41565b600060405180830381600087803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b505050506001905090565b6119f6612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a90614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614eaa565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f845946286e49c616ec7e2675072463bfbcee62422fef2a420e3bfdb5ad170e1b81604051611b849190614d5c565b60405180910390a150565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60045481565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60195481565b60606040518060400160405280600881526020017f414646494e495459000000000000000000000000000000000000000000000000815250905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614f8a565b60405180910390fd5b6002544211611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90614f6a565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e8f612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390614eea565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639a89a30f836040518263ffffffff1660e01b8152600401611f779190614d41565b600060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b50505050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166316998179826040518263ffffffff1660e01b81526004016120049190614d41565b600060405180830381600087803b15801561201e57600080fd5b505af1158015612032573d6000803e3d6000fd5b505050507f9281a8b8751faa379cc11ff6cc4e470e9006dbc6e629305eae8fb7e6a3e3590d8282604051612067929190614d77565b60405180910390a15050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120a6338484612e41565b905092915050565b601360149054906101000a900460ff1681565b6000600254905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636c0812a8336040518263ffffffff1660e01b815260040161214e9190614d41565b600060405180830381600087803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b505050506001905090565b61218f612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614eea565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080426122ca91906150fa565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561240d57600d549050612413565b600e5490505b919050565b612420612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614eea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251490614e6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125e2612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266690614eea565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126f95750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61270257600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080156127f457601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b81526004016127bd929190614da0565b600060405180830381600087803b1580156127d757600080fd5b505af11580156127eb573d6000803e3d6000fd5b505050506128c3565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9683600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401612890929190614dc9565b600060405180830381600087803b1580156128aa57600080fd5b505af11580156128be573d6000803e3d6000fd5b505050505b5050565b6128cf612dd5565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614eea565b60405180910390fd5b601a60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129b757600080fd5b80601a60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adb91906144da565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5f57600080fd5b505afa158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9791906144da565b6040518363ffffffff1660e01b8152600401612bb4929190614d77565b602060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0691906144da565b905080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639fe1d3bf836040518263ffffffff1660e01b8152600401612d499190614d41565b600060405180830381600087803b158015612d6357600080fd5b505af1158015612d77573d6000803e3d6000fd5b505050505050565b60115481565b600a5481565b6000612dcd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061335c565b905092915050565b600033905090565b6000838311158290612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c9190614e28565b60405180910390fd5b5060008385612e3491906151db565b9050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea990614f4a565b60405180910390fd5b60008211612ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eec90614f2a565b60405180910390fd5b60045482111580612f4f5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8590614e4a565b60405180910390fd5b600080601a60009054906101000a900460ff1680612fb85750601a60019054906101000a900460ff165b1561303f57612fc88686866133bf565b80935081925050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161302d9190614faa565b60405180910390a381925050506131ab565b613047613795565b1561306c5761305461386c565b61305f8686866133bf565b8093508192505050613140565b613074613bcb565b1561309957613081613c63565b61308c8686866133bf565b809350819250505061313f565b6130a48686866133bf565b8093508192505050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796015546040518263ffffffff1660e01b81526004016131099190614faa565b600060405180830381600087803b15801561312357600080fd5b505af1925050508015613134575060015b61313d5761313e565b5b5b5b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161319d9190614faa565b60405180910390a381925050505b9392505050565b600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600354600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600080828461330d91906150fa565b905083811015613352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334990614e8a565b60405180910390fd5b8091505092915050565b600080831182906133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a9190614e28565b60405180910390fd5b50600083856133b29190615150565b9050809150509392505050565b60008061344b836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006134998661400f565b6134a357836134ae565b6134ad8585614066565b5b905061350281600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132fe90919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661366557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9687600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401613632929190614dc9565b600060405180830381600087803b15801561364c57600080fd5b505af1158015613660573d6000803e3d6000fd5b505050505b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661378557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9686600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b8152600401613752929190614dc9565b600060405180830381600087803b15801561376c57600080fd5b505af1158015613780573d6000803e3d6000fd5b505050505b8060019250925050935093915050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156138025750601a60009054906101000a900460ff16155b801561381a5750601660009054906101000a900460ff165b80156138675750601754600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601a60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156138ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156138f85781602001602082028036833780820191505090505b5090503081600081518110613936577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156139d857600080fd5b505afa1580156139ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1091906144da565b81600181518110613a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000613ab1600d54613aa3600a5460175461419b90919063ffffffff16565b612d8b90919063ffffffff16565b9050613abc81614216565b506000613ad4826017546143fe90919063ffffffff16565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478260008630426040518663ffffffff1660e01b8152600401613b3a959493929190614fc5565b600060405180830381600087803b158015613b5457600080fd5b505af1925050508015613b65575060015b613b7157505050613bae565b7fcc0721505755d5580c58ceba07df49e49bf136efae62c3cde523466297d561898183604051613ba292919061501f565b60405180910390a15050505b6000601a60006101000a81548160ff021916908315150217905550565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015613c385750601a60019054906101000a900460ff16155b8015613c505750601660009054906101000a900460ff165b8015613c5e57506011544710155b905090565b6001601a60016101000a81548160ff021916908315150217905550600080600080601360149054906101000a900460ff1615613e9c57613cc2600d54613cb4600c544761419b90919063ffffffff16565b612d8b90919063ffffffff16565b9150613cd782476143fe90919063ffffffff16565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168161659090604051613d2390614d2c565b600060405180830381858888f193505050503d8060008114613d61576040519150601f19603f3d011682016040523d82523d6000602084013e613d66565b606091505b505080945050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613dd657600080fd5b505af1158015613dea573d6000803e3d6000fd5b50505050601360149054906101000a900460ff1615613e9757601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168261659090604051613e4d90614d2c565b600060405180830381858888f193505050503d8060008114613e8b576040519150601f19603f3d011682016040523d82523d6000602084013e613e90565b606091505b5050809350505b613fb5565b479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168161659090604051613ee990614d2c565b600060405180830381858888f193505050503d8060008114613f27576040519150601f19603f3d011682016040523d82523d6000602084013e613f2c565b606091505b505080945050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613f9c57600080fd5b505af1158015613fb0573d6000803e3d6000fd5b505050505b7fd3fab875ac05b0ff251a6ca54546bd5d1d035ddc281626e2e0712a43eef95d2e8183604051613fe692919061501f565b60405180910390a1505050506000601a60016101000a81548160ff021916908315150217905550565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b6000806140e8600f546140da6140cb601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146123fb565b8661419b90919063ffffffff16565b612d8b90919063ffffffff16565b905061413c81600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132fe90919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061419281846143fe90919063ffffffff16565b91505092915050565b6000808314156141ae5760009050614210565b600082846141bc9190615181565b90508284826141cb9190615150565b1461420b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420290614eca565b60405180910390fd5b809150505b92915050565b6000601a60029054906101000a900460ff1661423557600090506143f9565b6142be826040518060400160405280601781526020017f63616e6e6f74206275726e207468697320616d6f756e74000000000000000000815250600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ddd9092919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061434d826040518060400160405280601f81526020017f746f74616c20737570706c792063616e6e6f74206265206e6567617469766500815250600354612ddd9092919063ffffffff16565b60038190555061435b6131b2565b601860009054906101000a900460ff161561438e57614387601954600354612d8b90919063ffffffff16565b6017819055505b600073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143ec9190614faa565b60405180910390a3600190505b919050565b600061444083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ddd565b905092915050565b60008135905061445781615384565b92915050565b60008151905061446c81615384565b92915050565b6000813590506144818161539b565b92915050565b600081359050614496816153b2565b92915050565b6000813590506144ab816153c9565b92915050565b6000602082840312156144c357600080fd5b60006144d184828501614448565b91505092915050565b6000602082840312156144ec57600080fd5b60006144fa8482850161445d565b91505092915050565b60006020828403121561451557600080fd5b600061452384828501614472565b91505092915050565b6000806040838503121561453f57600080fd5b600061454d85828601614448565b925050602061455e85828601614448565b9150509250929050565b60008060006060848603121561457d57600080fd5b600061458b86828701614448565b935050602061459c86828701614448565b92505060406145ad8682870161449c565b9150509250925092565b600080604083850312156145ca57600080fd5b60006145d885828601614448565b92505060206145e985828601614487565b9150509250929050565b60008060006060848603121561460857600080fd5b600061461686828701614448565b935050602061462786828701614487565b925050604061463886828701614487565b9150509250925092565b6000806040838503121561465557600080fd5b600061466385828601614448565b92505060206146748582860161449c565b9150509250929050565b60006020828403121561469057600080fd5b600061469e84828501614487565b91505092915050565b600080604083850312156146ba57600080fd5b60006146c885828601614487565b92505060206146d985828601614448565b9150509250929050565b60008060008060008060c087890312156146fc57600080fd5b600061470a89828a01614487565b965050602061471b89828a0161449c565b955050604061472c89828a01614487565b945050606061473d89828a0161449c565b935050608061474e89828a01614487565b92505060a061475f89828a0161449c565b9150509295509295509295565b60006020828403121561477e57600080fd5b600061478c8482850161449c565b91505092915050565b6000806000606084860312156147aa57600080fd5b60006147b88682870161449c565b93505060206147c98682870161449c565b92505060406147da8682870161449c565b9150509250925092565b600080600080608085870312156147fa57600080fd5b60006148088782880161449c565b94505060206148198782880161449c565b935050604061482a8782880161449c565b925050606061483b8782880161449c565b91505092959194509250565b6000614853838361486e565b60208301905092915050565b61486881615276565b82525050565b6148778161520f565b82525050565b6148868161520f565b82525050565b6000614897826150aa565b6148a181856150cd565b93506148ac8361509a565b8060005b838110156148dd5781516148c48882614847565b97506148cf836150c0565b9250506001810190506148b0565b5085935050505092915050565b6148f381615233565b82525050565b61490281615288565b82525050565b614911816152ac565b82525050565b6000614922826150b5565b61492c81856150e9565b935061493c8185602086016152e2565b61494581615373565b840191505092915050565b600061495d6011836150e9565b91507f5458204c696d69742045786365656465640000000000000000000000000000006000830152602082019050919050565b600061499d6026836150e9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a03601b836150e9565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614a436024836150e9565b91507f4469737472696275746f7220616c72656164792068617320746869732061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aa96021836150e9565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b0f6020836150e9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614b4f601f836150e9565b91507f7573657220646f6573206e6f74206f776e20656e6f75676820746f6b656e73006000830152602082019050919050565b6000614b8f6029836150e9565b91507f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bf56023836150e9565b91507f42455032303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c5b6000836150de565b9150600082019050919050565b6000614c756012836150e9565b91507f436f6e7472616374206973206c6f636b656400000000000000000000000000006000830152602082019050919050565b6000614cb56023836150e9565b91507f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60008301527f6f636b00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614d178161525f565b82525050565b614d2681615269565b82525050565b6000614d3782614c4e565b9150819050919050565b6000602082019050614d56600083018461487d565b92915050565b6000602082019050614d71600083018461485f565b92915050565b6000604082019050614d8c600083018561487d565b614d99602083018461487d565b9392505050565b6000604082019050614db5600083018561487d565b614dc26020830184614908565b9392505050565b6000604082019050614dde600083018561487d565b614deb6020830184614d0e565b9392505050565b6000602082019050614e0760008301846148ea565b92915050565b6000602082019050614e2260008301846148f9565b92915050565b60006020820190508181036000830152614e428184614917565b905092915050565b60006020820190508181036000830152614e6381614950565b9050919050565b60006020820190508181036000830152614e8381614990565b9050919050565b60006020820190508181036000830152614ea3816149f6565b9050919050565b60006020820190508181036000830152614ec381614a36565b9050919050565b60006020820190508181036000830152614ee381614a9c565b9050919050565b60006020820190508181036000830152614f0381614b02565b9050919050565b60006020820190508181036000830152614f2381614b42565b9050919050565b60006020820190508181036000830152614f4381614b82565b9050919050565b60006020820190508181036000830152614f6381614be8565b9050919050565b60006020820190508181036000830152614f8381614c68565b9050919050565b60006020820190508181036000830152614fa381614ca8565b9050919050565b6000602082019050614fbf6000830184614d0e565b92915050565b600060a082019050614fda6000830188614d0e565b614fe76020830187614908565b8181036040830152614ff9818661488c565b9050615008606083018561487d565b6150156080830184614d0e565b9695505050505050565b60006040820190506150346000830185614d0e565b6150416020830184614d0e565b9392505050565b600060608201905061505d6000830186614d0e565b61506a6020830185614d0e565b6150776040830184614d0e565b949350505050565b60006020820190506150946000830184614d1d565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006151058261525f565b91506151108361525f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561514557615144615315565b5b828201905092915050565b600061515b8261525f565b91506151668361525f565b92508261517657615175615344565b5b828204905092915050565b600061518c8261525f565b91506151978361525f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151d0576151cf615315565b5b828202905092915050565b60006151e68261525f565b91506151f18361525f565b92508282101561520457615203615315565b5b828203905092915050565b600061521a8261523f565b9050919050565b600061522c8261523f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615281826152be565b9050919050565b60006152938261529a565b9050919050565b60006152a58261523f565b9050919050565b60006152b78261525f565b9050919050565b60006152c9826152d0565b9050919050565b60006152db8261523f565b9050919050565b60005b838110156153005780820151818401526020810190506152e5565b8381111561530f576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b61538d8161520f565b811461539857600080fd5b50565b6153a481615221565b81146153af57600080fd5b50565b6153bb81615233565b81146153c657600080fd5b50565b6153d28161525f565b81146153dd57600080fd5b5056fea2646970667358221220afd9cf9e361599217f172e38412ad69d879a0e8d7546e2276f21cc36c9c66a0c64736f6c63430008000033608060405273099f551ea3cb85707cac6ac507cbc36c96ec64ff600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e2e6e66551e5062acd56925b48bba981696cccc2600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506ec097ce7bc90715b34b9f1000000000600d55613840600e55610e10600f55614e20601055674563918244f400006011556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff0219169083151502179055503480156200012257600080fd5b50604051620035a9380380620035a9833981810160405281019062000148919062000239565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000199577310ed43c718714eb63d5aa57b78b54704e256024e6200019b565b805b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620002b3565b600081519050620002338162000299565b92915050565b6000602082840312156200024c57600080fd5b60006200025c8482850162000222565b91505092915050565b6000620002728262000279565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002a48162000265565b8114620002b057600080fd5b50565b6132e680620002c36000396000f3fe6080604052600436106101445760003560e01c80636c0812a8116100b6578063d0e30db01161006f578063d0e30db014610445578063d444ca831461045c578063e73b5ae014610487578063f46c9785146104c4578063ffb2c479146104ef578063ffd49c84146105185761014b565b80636c0812a81461033357806373f3f8291461035c5780639a89a30f146103875780639afade68146103b05780639fe1d3bf146103db578063ce7c2ac2146104045761014b565b806325e243311161010857806325e24331146102215780633203b0941461024c57806337285339146102895780633a98ef39146102b457806348ef3447146102df5780634fab0ae8146103085761014b565b80630ca61cb11461015057806311ce023d1461017957806314b6ca96146101a457806316998179146101cd578063216d6b81146101f65761014b565b3661014b57005b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190612bcc565b610543565b005b34801561018557600080fd5b5061018e6105b5565b60405161019b9190612f4e565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612b15565b6105bb565b005b3480156101d957600080fd5b506101f460048036038101906101ef9190612ac3565b610914565b005b34801561020257600080fd5b5061020b6109b0565b6040516102189190612f4e565b60405180910390f35b34801561022d57600080fd5b506102366109b6565b6040516102439190612f4e565b60405180910390f35b34801561025857600080fd5b50610273600480360381019061026e9190612ac3565b6109bc565b6040516102809190612f4e565b60405180910390f35b34801561029557600080fd5b5061029e610ad6565b6040516102ab9190612f4e565b60405180910390f35b3480156102c057600080fd5b506102c9610adc565b6040516102d69190612f4e565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190612ac3565b610ae2565b005b34801561031457600080fd5b5061031d610bd4565b60405161032a9190612f4e565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190612ac3565b610bda565b005b34801561036857600080fd5b50610371610ccc565b60405161037e9190612f4e565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190612ac3565b610cd2565b005b3480156103bc57600080fd5b506103c5610d6e565b6040516103d29190612f4e565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd9190612ac3565b610d74565b005b34801561041057600080fd5b5061042b60048036038101906104269190612ac3565b610e10565b60405161043c959493929190612f69565b60405180910390f35b34801561045157600080fd5b5061045a610e46565b005b34801561046857600080fd5b5061047161183d565b60405161047e9190612f4e565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612ac3565b611843565b6040516104bb9190612f4e565b60405180910390f35b3480156104d057600080fd5b506104d961195d565b6040516104e69190612e65565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190612b7a565b611a9f565b005b34801561052457600080fd5b5061052d611e23565b60405161053a9190612f4e565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b57600080fd5b82600e819055508160108190555080601181905550505050565b600d5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461061357600080fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156106715761066782611e29565b610670826120c0565b5b6000811180156106c357506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b156106d6576106d182612357565b610738565b60008114801561072857506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156107375761073682612406565b5b5b6107a181610793600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546008546126e890919063ffffffff16565b61273290919063ffffffff16565b60088190555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550610839600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506108ca600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096c57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b60095481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610a115760009050610ad1565b6000610a5e600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b90506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549050808211610ab957600092505050610ad1565b610acc81836126e890919063ffffffff16565b925050505b919050565b600f5481565b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3a57600080fd5b42600f54600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b889190613011565b10610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90612f0e565b60405180910390fd5b610bd181611e29565b50565b60105481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3257600080fd5b42600f54600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c809190613011565b10610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790612f0e565b60405180910390fd5b610cc9816120c0565b50565b60115481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d2a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dcc57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b601154471015610ead5761183b565b601460009054906101000a900460ff1615611380576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f1f9190612e21565b60206040518083038186803b158015610f3757600080fd5b505afa158015610f4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6f9190612ba3565b90506000600267ffffffffffffffff811115610fb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610fe25781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561104d57600080fd5b505afa158015611061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110859190612aec565b816000815181106110bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611156577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95601154600084306111e9601e4261273290919063ffffffff16565b6040518663ffffffff1660e01b81526004016112089493929190612e80565b6000604051808303818588803b15801561122157600080fd5b505af193505050508015611233575060015b61123e57505061183b565b60006112fd83600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161129f9190612e21565b60206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ef9190612ba3565b6126e890919063ffffffff16565b90506113148160095461273290919063ffffffff16565b60098190555061135761134660085461133884600d546127f490919063ffffffff16565b61286f90919063ffffffff16565b600a5461273290919063ffffffff16565b600a819055506000601460006101000a81548160ff02191690831515021790555050505061183a565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113dd9190612e21565b60206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612ba3565b90506000600267ffffffffffffffff811115611472577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114a05781602001602082028036833780820191505090505b509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115439190612aec565b8160008151811061157d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611614577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de95601154600084306116a7601e4261273290919063ffffffff16565b6040518663ffffffff1660e01b81526004016116c69493929190612e80565b6000604051808303818588803b1580156116df57600080fd5b505af1935050505080156116f1575060015b6116fc57505061183b565b60006117bb83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161175d9190612e21565b60206040518083038186803b15801561177557600080fd5b505afa158015611789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ad9190612ba3565b6126e890919063ffffffff16565b90506117d281600b5461273290919063ffffffff16565b600b819055506118156118046008546117f684600d546127f490919063ffffffff16565b61286f90919063ffffffff16565b600c5461273290919063ffffffff16565b600c819055506001601460006101000a81548160ff0219169083151502179055505050505b5b565b600a5481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156118985760009050611958565b60006118e5600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b90506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905080821161194057600092505050611958565b61195381836126e890919063ffffffff16565b925050505b919050565b6000806004805490509050600081141561197b576000915050611a9c565b6000805b82821015611a945782811061199357600090505b611a00600482815481106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128b9565b15611a7357611a7260048281548110611a42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e29565b5b8080611a7e906131b3565b9150508180611a8c906131b3565b92505061197f565b600193505050505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611af757600080fd5b600060048054905090506000811415611b105750611e20565b6000805a9050601460019054906101000a900460ff1615601460016101000a81548160ff0219169083151502179055506000601460019054906101000a900460ff1615611cbb575b8483108015611b6657508381105b15611cb6578360125410611b7d5760006012819055505b611bec600460125481548110611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612926565b15611c6157611c60600460125481548110611c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120c0565b5b611c86611c775a846126e890919063ffffffff16565b8461273290919063ffffffff16565b92505a915060126000815480929190611c9e906131b3565b91905055508080611cae906131b3565b915050611b58565b611e1b565b5b8483108015611cca57508381105b15611e1a578360135410611ce15760006013819055505b611d50600460135481548110611d20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128b9565b15611dc557611dc4600460135481548110611d94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e29565b5b611dea611ddb5a846126e890919063ffffffff16565b8461273290919063ffffffff16565b92505a915060136000815480929190611e02906131b3565b91905055508080611e12906131b3565b915050611cbc565b5b505050505b50565b600e5481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611e79576120bd565b6000611e8482611843565b905060008111156120bb576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401611eee929190612e3c565b602060405180830381600087803b158015611f0857600080fd5b505af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612b51565b905080156120b95742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe182600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461273290919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612072600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612790565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b505b50565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561211057612354565b600061211b826109bc565b90506000811115612352576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401612185929190612e3c565b602060405180830381600087803b15801561219f57600080fd5b505af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190612b51565b905080156123505742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061227882600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461273290919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612309600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546127c2565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b505b505b50565b600480549050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6004600160048054905061241a91906130f2565b81548110612451577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106124f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560006004600160048054905061259591906130f2565b815481106125cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600480548061266d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905550565b600061272a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612993565b905092915050565b60008082846127419190613011565b905083811015612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90612eee565b60405180910390fd5b8091505092915050565b60006127bb600d546127ad600c54856127f490919063ffffffff16565b61286f90919063ffffffff16565b9050919050565b60006127ed600d546127df600a54856127f490919063ffffffff16565b61286f90919063ffffffff16565b9050919050565b6000808314156128075760009050612869565b600082846128159190613098565b90508284826128249190613067565b14612864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285b90612f2e565b60405180910390fd5b809150505b92915050565b60006128b183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506129f7565b905092915050565b600042600e54600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129099190613011565b10801561291f575060105461291d83611843565b115b9050919050565b600042600e54600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129769190613011565b10801561298c575060105461298a836109bc565b115b9050919050565b60008383111582906129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d29190612ecc565b60405180910390fd5b50600083856129ea91906130f2565b9050809150509392505050565b60008083118290612a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a359190612ecc565b60405180910390fd5b5060008385612a4d9190613067565b9050809150509392505050565b600081359050612a698161326b565b92915050565b600081519050612a7e8161326b565b92915050565b600081519050612a9381613282565b92915050565b600081359050612aa881613299565b92915050565b600081519050612abd81613299565b92915050565b600060208284031215612ad557600080fd5b6000612ae384828501612a5a565b91505092915050565b600060208284031215612afe57600080fd5b6000612b0c84828501612a6f565b91505092915050565b60008060408385031215612b2857600080fd5b6000612b3685828601612a5a565b9250506020612b4785828601612a99565b9150509250929050565b600060208284031215612b6357600080fd5b6000612b7184828501612a84565b91505092915050565b600060208284031215612b8c57600080fd5b6000612b9a84828501612a99565b91505092915050565b600060208284031215612bb557600080fd5b6000612bc384828501612aae565b91505092915050565b600080600060608486031215612be157600080fd5b6000612bef86828701612a99565b9350506020612c0086828701612a99565b9250506040612c1186828701612a99565b9150509250925092565b6000612c278383612c33565b60208301905092915050565b612c3c81613126565b82525050565b612c4b81613126565b82525050565b6000612c5c82612fcc565b612c668185612fef565b9350612c7183612fbc565b8060005b83811015612ca2578151612c898882612c1b565b9750612c9483612fe2565b925050600181019050612c75565b5085935050505092915050565b612cb881613138565b82525050565b612cc78161316e565b82525050565b6000612cd882612fd7565b612ce28185613000565b9350612cf2818560208601613180565b612cfb8161325a565b840191505092915050565b6000612d13601b83613000565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612d53603383613000565b91507f6d7573742077616974206174206c6561737420746865206d696e696d756d206160008301527f75746f20776974686472617720706572696f64000000000000000000000000006020830152604082019050919050565b6000612db9602183613000565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612e1b81613164565b82525050565b6000602082019050612e366000830184612c42565b92915050565b6000604082019050612e516000830185612c42565b612e5e6020830184612e12565b9392505050565b6000602082019050612e7a6000830184612caf565b92915050565b6000608082019050612e956000830187612cbe565b8181036020830152612ea78186612c51565b9050612eb66040830185612c42565b612ec36060830184612e12565b95945050505050565b60006020820190508181036000830152612ee68184612ccd565b905092915050565b60006020820190508181036000830152612f0781612d06565b9050919050565b60006020820190508181036000830152612f2781612d46565b9050919050565b60006020820190508181036000830152612f4781612dac565b9050919050565b6000602082019050612f636000830184612e12565b92915050565b600060a082019050612f7e6000830188612e12565b612f8b6020830187612e12565b612f986040830186612e12565b612fa56060830185612e12565b612fb26080830184612e12565b9695505050505050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061301c82613164565b915061302783613164565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561305c5761305b6131fc565b5b828201905092915050565b600061307282613164565b915061307d83613164565b92508261308d5761308c61322b565b5b828204905092915050565b60006130a382613164565b91506130ae83613164565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130e7576130e66131fc565b5b828202905092915050565b60006130fd82613164565b915061310883613164565b92508282101561311b5761311a6131fc565b5b828203905092915050565b600061313182613144565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061317982613164565b9050919050565b60005b8381101561319e578082015181840152602081019050613183565b838111156131ad576000848401525b50505050565b60006131be82613164565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131f1576131f06131fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b61327481613126565b811461327f57600080fd5b50565b61328b81613138565b811461329657600080fd5b50565b6132a281613164565b81146132ad57600080fd5b5056fea2646970667358221220c4db611f3733bde48c957a8a760531fa1c145460021dddfe370620a8cd9c85a264736f6c63430008000033

Deployed ByteCode Sourcemap

621:17538:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2129:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4617:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12669:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15279:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4002:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2273:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5404:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4521:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15560:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17039:826;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5057:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14699:521;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12994:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1450:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2093:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13534:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4095:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1245:145:7;;;;;;;;;;;;;:::i;:::-;;14001:241:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12284:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12826:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1002:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1409:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;622:77:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2321:60:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4430:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13175:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2235:287:7;;;;;;;;;;;;;:::i;:::-;;16728:255:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1882:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5211:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1907:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1785:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1983:38:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12472:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1945:221:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4205:133:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1640:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13349:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1539:240:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14307:341:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15842:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1769:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1375:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2129:52;;;;:::o;4343:81::-;4380:13;4412:5;;;;;;;;;;;;;;;;;4405:12;;4343:81;:::o;4617:212::-;4692:4;4743:6;4708:11;:23;4720:10;4708:23;;;;;;;;;;;;;;;:32;4732:7;4708:32;;;;;;;;;;;;;;;:41;;;;4785:7;4764:37;;4773:10;4764:37;;;4794:6;4764:37;;;;;;:::i;:::-;;;;;;;;4818:4;4811:11;;4617:212;;;;:::o;12669:109::-;12714:4;12729:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12767:4;12760:11;;12669:109;:::o;15279:232::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15417:11:8::1;;;;;;;;;;;:35;;;15453:10;15465:16;15483:20;15417:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15279:232:::0;;;:::o;4002:88::-;4057:7;4075:12;;4068:19;;4002:88;:::o;2273:42::-;;;;;;;;;;;;;:::o;5404:359::-;5504:4;5558:12;;5523:11;:19;5535:6;5523:19;;;;;;;;;;;;;;;:31;5543:10;5523:31;;;;;;;;;;;;;;;;:47;5520:179;;5619:69;5655:6;5619:69;;;;;;;;;;;;;;;;;:11;:19;5631:6;5619:19;;;;;;;;;;;;;;;:31;5639:10;5619:31;;;;;;;;;;;;;;;;:35;;:69;;;;;:::i;:::-;5585:11;:19;5597:6;5585:19;;;;;;;;;;;;;;;:31;5605:10;5585:31;;;;;;;;;;;;;;;:103;;;;5520:179;5716:40;5730:6;5738:9;5749:6;5716:13;:40::i;:::-;5709:47;;5404:359;;;;;:::o;4521:90::-;4571:5;907:1;4588:16;;4521:90;:::o;15560:230::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15710:19:8::1;15683:24;;:46;;;;;;;;;;;;;;;;;;15762:21;15739:20;;:44;;;;;;;;;;;;;;;;;;15560:230:::0;;:::o;17039:826::-;17092:4;17176:1;17166:7;:11;17158:20;;;;;;17268:7;17243:9;:21;17253:10;17243:21;;;;;;;;;;;;;;;;:32;;17235:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;17382:65;17408:7;17382:65;;;;;;;;;;;;;;;;;:9;:21;17392:10;17382:21;;;;;;;;;;;;;;;;:25;;:65;;;;;:::i;:::-;17358:9;:21;17368:10;17358:21;;;;;;;;;;;;;;;:89;;;;17515:60;17532:7;17515:60;;;;;;;;;;;;;;;;;:12;;:16;;:60;;;;;:::i;:::-;17500:12;:75;;;;17636:17;:15;:17::i;:::-;17699:11;;;;;;;;;;;:20;;;17720:10;17732:9;:21;17742:10;17732:21;;;;;;;;;;;;;;;;17699:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17825:1;17796:41;;17805:10;17796:41;;;17829:7;17796:41;;;;;;:::i;:::-;;;;;;;;17854:4;17847:11;;17039:826;;;:::o;5057:115::-;5112:4;5135:30;5143:7;5152:12;;5135:7;:30::i;:::-;5128:37;;5057:115;;;:::o;14699:521::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14933:12:8::1;14919:11;;:26;;;;;;;;;;;;;;;;;;14971:14;14955:13;:30;;;;15020:23;14995:22;;:48;;;;;;;;;;;;;;;;;;15095:27;15053:39;:69;;;;15146:12;15132:11;;:26;;;;;;;;;;;;;;;;;;15190:23;15168:19;:45;;;;14699:521:::0;;;;;;:::o;12994:120::-;13060:4;13083:16;:24;13100:6;13083:24;;;;;;;;;;;;;;;;;;;;;;;;;13076:31;;12994:120;;;:::o;1450:32::-;;;;:::o;2093:30::-;;;;;;;;;;;;;:::o;13534:421::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13672:8:8::1;13662:7;:18;;;;13706:14;13690:13;:30;;;;13745:13;13730:12;:28;;;;13784:47;13817:13;13784:28;13797:14;13784:8;:12;;:28;;;;:::i;:::-;:32;;:47;;;;:::i;:::-;13768:13;:63;;;;13856:7;13841:12;:22;;;;13892:4;13881:7;:15;;13873:24;;;::::0;::::1;;13946:1;13931:14;;:16;;;;:::i;:::-;13915:13;;:32;13907:41;;;::::0;::::1;;13534:421:::0;;;;:::o;4095:105::-;4161:7;4179:9;:18;4189:7;4179:18;;;;;;;;;;;;;;;;4172:25;;4095:105;;;:::o;1245:145:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1351:1:::1;1314:40;;1335:6;::::0;::::1;;;;;;;;1314:40;;;;;;;;;;;;1381:1;1364:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1245:145::o:0;14001:241:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14142:1:8::1;14124:20;;:6;:20;;;;14116:29;;;::::0;::::1;;14177:9;14155:11;:19;14167:6;14155:19;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;14222:13;14196:15;:23;14212:6;14196:23;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;14001:241:::0;;;:::o;12284:134::-;12332:4;12348:11;;;;;;;;;;;:30;;;12379:10;12348:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12407:4;12400:11;;12284:134;:::o;16360:287::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16479:11:8::1;;;;;;;;;;;16453:38;;:14;:38;;;;16445:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;16576:14;16542:11;;:49;;;;;;;;;;;;;;;;;;16606:34;16625:14;16606:34;;;;;;:::i;:::-;;;;;;;;16360:287:::0;:::o;12826:110::-;12887:4;12910:11;:19;12922:6;12910:19;;;;;;;;;;;;;;;;;;;;;;;;;12903:26;;12826:110;;;:::o;1002:51::-;;;;:::o;1409:35::-;;;;:::o;622:77:7:-;660:7;686:6;;;;;;;;;;;679:13;;622:77;:::o;2321:60:8:-;;;;:::o;4430:85::-;4469:13;4501:7;;;;;;;;;;;;;;;;;4494:14;;4430:85;:::o;13175:118::-;13240:4;13263:15;:23;13279:6;13263:23;;;;;;;;;;;;;;;;;;;;;;;;;13256:30;;13175:118;;;:::o;2235:287:7:-;2304:10;2286:28;;:14;;;;;;;;;;;:28;;;2278:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2390:9;;2372:15;:27;2364:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2467:14;;;;;;;;;;;2438:44;;2459:6;;;;;;;;;;2438:44;;;;;;;;;;;;2501:14;;;;;;;;;;;2492:6;;:23;;;;;;;;;;;;;;;;;;2235:287::o;16728:255:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16823:11:8::1;;;;;;;;;;;:30;;;16854:9;16823:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16874:11;;;;;;;;;;;:31;;;16906:10;16874:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16932:44;16954:9;16965:10;16932:44;;;;;;;:::i;:::-;;;;;;;;16728:255:::0;;:::o;1882:19::-;;;;;;;;;;;;;:::o;5211:154::-;5291:4;5314:44;5328:10;5340:9;5351:6;5314:13;:44::i;:::-;5307:51;;5211:154;;;;:::o;1907:43::-;;;;;;;;;;;;;:::o;1785:87:7:-;1830:7;1856:9;;1849:16;;1785:87;:::o;1983:38:8:-;;;;;;;;;;;;;:::o;12472:132::-;12519:4;12535:11;;;;;;;;;;;:29;;;12565:10;12535:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12593:4;12586:11;;12472:132;:::o;1945:221:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2025:6:::1;::::0;::::1;;;;;;;;2008:14;;:23;;;;;;;;;;;;;;;;;;2058:1;2041:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2100:4;2082:15;:22;;;;:::i;:::-;2070:9;:34;;;;2156:1;2119:40;;2140:6;::::0;::::1;;;;;;;;2119:40;;;;;;;;;;;;1945:221:::0;:::o;4205:133:8:-;4289:7;4307:11;:19;4319:6;4307:19;;;;;;;;;;;;;;;:28;4327:7;4307:28;;;;;;;;;;;;;;;;4300:35;;4205:133;;;;:::o;1640:80::-;;;;;;;;;;;;;:::o;13349:146::-;13405:7;13427;13424:36;;;13444:13;;13437:20;;;;13424:36;13476:12;;13469:19;;13349:146;;;;:::o;1539:240:7:-;836:12;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1647:1:::1;1627:22;;:8;:22;;;;1619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1736:8;1707:38;;1728:6;::::0;::::1;;;;;;;;1707:38;;;;;;;;;;;;1764:8;1755:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1539:240:::0;:::o;14307:341:8:-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14420:4:8::1;14402:23;;:6;:23;;;;:41;;;;;14439:4;;;;;;;;;;;14429:14;;:6;:14;;;;14402:41;14394:50;;;::::0;::::1;;14481:6;14454:16;:24;14471:6;14454:24;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14500:6;14497:145;;;14522:11;;;;;;;;;;;:20;;;14543:6;14551:1;14522:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14497:145;;;14584:11;;;;;;;;;;;:20;;;14605:6;14613:9;:17;14623:6;14613:17;;;;;;;;;;;;;;;;14584:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14497:145;14307:341:::0;;:::o;15842:460::-;836:12:7;:10;:12::i;:::-;826:22;;:6;;;;;;;;;;:22;;;818:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15928:10:8::1;;;;;;;;;;;15917:21;;:7;:21;;;;15909:30;;;::::0;::::1;;15962:7;15949:10;;:20;;;;;;;;;;;;;;;;;;16007:7;15979:6;;:36;;;;;;;;;;;;;;;;;;16025:22;16068:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16050:59;;;16118:4;16125:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16050:89;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16025:114;;16156:14;16149:4;;:21;;;;;;;;;;;;;;;;;;16226:12;;16180:11;:26;16200:4;16180:26;;;;;;;;;;;;;;;:43;16215:6;;;;;;;;;;;16180:43;;;;;;;;;;;;;;;:58;;;;16248:11;;;;;;;;;;;:38;;;16287:7;16248:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;895:1:7;15842:460:8::0;:::o;1769:47::-;;;;:::o;1375:28::-;;;;:::o;2535:130:9:-;2593:7;2619:39;2623:1;2626;2619:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2612:46;;2535:130;;;;:::o;88:113:2:-;141:15;183:10;168:26;;88:113;:::o;1180:187:9:-;1266:7;1298:1;1293;:6;;1301:12;1285:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1324:9;1340:1;1336;:5;;;;:::i;:::-;1324:17;;1359:1;1352:8;;;1180:187;;;;;:::o;5802:1516:8:-;5894:4;5971:1;5950:23;;:9;:23;;;;5942:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6040:1;6031:6;:10;6023:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6173:12;;6163:6;:22;;:49;;;;6189:15;:23;6205:6;6189:23;;;;;;;;;;;;;;;;;;;;;;;;;6163:49;6155:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;6282:12;6354:22;6442:6;;;;;;;;;;;:24;;;;6452:14;;;;;;;;;;;6442:24;6439:218;;;6510:45;6529:6;6537:9;6548:6;6510:18;:45::i;:::-;6482:73;;;;;;;;6592:9;6575:43;;6584:6;6575:43;;;6603:14;6575:43;;;;;;:::i;:::-;;;;;;;;6639:7;6632:14;;;;;;6439:218;6738:16;:14;:16::i;:::-;6735:486;;;6771:10;:8;:10::i;:::-;6823:45;6842:6;6850:9;6861:6;6823:18;:45::i;:::-;6795:73;;;;;;;;6735:486;;;6889:28;:26;:28::i;:::-;6885:336;;;6933:22;:20;:22::i;:::-;6997:45;7016:6;7024:9;7035:6;6997:18;:45::i;:::-;6969:73;;;;;;;;6885:336;;;7101:45;7120:6;7128:9;7139:6;7101:18;:45::i;:::-;7073:73;;;;;;;;7164:11;;;;;;;;;;;:19;;;7184:14;;7164:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7160:51;;;;;;6885:336;6735:486;7261:9;7244:43;;7253:6;7244:43;;;7272:14;7244:43;;;;;;:::i;:::-;;;;;;;;7304:7;7297:14;;;;5802:1516;;;;;;:::o;4839:176::-;4930:12;;4884:11;:26;4904:4;4884:26;;;;;;;;;;;;;;;:43;4919:6;;;;;;;;;;;4884:43;;;;;;;;;;;;;;;:58;;;;4996:12;;4952:11;:26;4972:4;4952:26;;;;;;;;;;;;;;;:41;4987:4;;;;;;;;;;;4952:41;;;;;;;;;;;;;;;:56;;;;4839:176::o;308::9:-;366:7;385:9;401:1;397;:5;;;;:::i;:::-;385:17;;425:1;420;:6;;412:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;476:1;469:8;;;308:176;;;;:::o;3147:272::-;3233:7;3264:1;3260;:5;3267:12;3252:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3290:9;3306:1;3302;:5;;;;:::i;:::-;3290:17;;3411:1;3404:8;;;3147:272;;;;;:::o;7418:845:8:-;7515:7;7524:4;7600:53;7622:6;7600:53;;;;;;;;;;;;;;;;;:9;:17;7610:6;7600:17;;;;;;;;;;;;;;;;:21;;:53;;;;;:::i;:::-;7580:9;:17;7590:6;7580:17;;;;;;;;;;;;;;;:73;;;;7705:22;7730:21;7744:6;7730:13;:21::i;:::-;:59;;7783:6;7730:59;;;7754:26;7762:9;7773:6;7754:7;:26::i;:::-;7730:59;7705:84;;7857:40;7882:14;7857:9;:20;7867:9;7857:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;7834:9;:20;7844:9;7834:20;;;;;;;;;;;;;;;:63;;;;7950:16;:24;7967:6;7950:24;;;;;;;;;;;;;;;;;;;;;;;;;7946:102;;7990:11;;;;;;;;;;;:20;;;8011:6;8019:9;:17;8029:6;8019:17;;;;;;;;;;;;;;;;7990:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7946:102;8061:16;:27;8078:9;8061:27;;;;;;;;;;;;;;;;;;;;;;;;;8057:111;;8104:11;;;;;;;;;;;:20;;;8125:9;8136;:20;8146:9;8136:20;;;;;;;;;;;;;;;;8104:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8057:111;8235:14;8251:4;8227:29;;;;;7418:845;;;;;;:::o;8884:192::-;8933:4;8970;;;;;;;;;;;8956:18;;:10;:18;;;;:37;;;;;8987:6;;;;;;;;;;;8986:7;8956:37;:60;;;;;9005:11;;;;;;;;;;;8956:60;:113;;;;;9056:13;;9028:9;:24;9046:4;9028:24;;;;;;;;;;;;;;;;:41;;8956:113;8949:120;;8884:192;:::o;9262:798::-;2519:4;2510:6;;:13;;;;;;;;;;;;;;;;;;9343:21:::1;9381:1;9367:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9343:40;;9411:4;9393;9398:1;9393:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;9436:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9426:4;9431:1;9426:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;9498:18;9519:45;9550:13;;9519:26;9537:7;;9519:13;;:17;;:26;;;;:::i;:::-;:30;;:45;;;;:::i;:::-;9498:66;;9597:22;9608:10;9597;:22::i;:::-;;9671:18;9692:29;9710:10;9692:13;;:17;;:29;;;;:::i;:::-;9671:50;;9766:6;;;;;;;;;;;:57;;;9837:10;9861:1;9876:4;9902;9921:15;9766:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;9762:202;;9956:7;;;;;9762:202;10018:35;10030:10;10042;10018:35;;;;;;;:::i;:::-;;;;;;;;2525:1;;;;2537:5:::0;2528:6;;:14;;;;;;;;;;;;;;;;;;9262:798::o;10070:213::-;10129:4;10166;;;;;;;;;;;10152:18;;:10;:18;;;;:45;;;;;10183:14;;;;;;;;;;;10182:15;10152:45;:68;;;;;10209:11;;;;;;;;;;;10152:68;:124;;;;;10257:19;;10232:21;:44;;10152:124;10145:131;;10070:213;:::o;10293:1119::-;2593:4;2576:14;;:21;;;;;;;;;;;;;;;;;;10365:12:::1;10379:15:::0;10404:26:::1;10432:27:::0;10497:24:::1;;;;;;;;;;;10493:841;;;10558:58;10602:13;;10558:39;10584:12;;10558:21;:25;;:39;;;;:::i;:::-;:43;;:58;;;;:::i;:::-;10537:79;;10652:45;10678:18;10652:21;:25;;:45;;;;:::i;:::-;10630:67;;10773:11;;;;;;;;;;;10757:34;;10799:19;10825:5;10757:78;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10744:91;;;;;10849:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10925:24;;;;;;;;;;;10921:156;;;10993:20;;;;;;;;;;;10985:34;;11027:18;11052:5;10985:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10969:93;;;;;10921:156;10493:841;;;11129:21;11107:43;;11226:11;;;;;;;;;;;11210:34;;11252:19;11278:5;11210:78;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11197:91;;;;;11302:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10493:841;11348:57;11365:19;11386:18;11348:57;;;;;;;:::i;:::-;;;;;;;;2599:1;;;;2619:5:::0;2602:14;;:22;;;;;;;;;;;;;;;;;;10293:1119::o;8323:112::-;8385:4;8409:11;:19;8421:6;8409:19;;;;;;;;;;;;;;;;;;;;;;;;;8408:20;8401:27;;8323:112;;;:::o;8532:290::-;8601:7;8620:17;8640:61;8686:14;;8640:41;8651:29;8675:4;;;;;;;;;;;8663:16;;:8;:16;;;8651:11;:29::i;:::-;8640:6;:10;;:41;;;;:::i;:::-;:45;;:61;;;;:::i;:::-;8620:81;;8738:39;8767:9;8738;:24;8756:4;8738:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;8711:9;:24;8729:4;8711:24;;;;;;;;;;;;;;;:66;;;;8794:21;8805:9;8794:6;:10;;:21;;;;:::i;:::-;8787:28;;;8532:290;;;;:::o;1614:459:9:-;1672:7;1918:1;1913;:6;1909:45;;;1942:1;1935:8;;;;1909:45;1964:9;1980:1;1976;:5;;;;:::i;:::-;1964:17;;2008:1;2003;1999;:5;;;;:::i;:::-;:10;1991:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2065:1;2058:8;;;1614:459;;;;;:::o;11461:772:8:-;11519:4;11540:11;;;;;;;;;;;11535:55;;11574:5;11567:12;;;;11535:55;11664:68;11693:11;11664:68;;;;;;;;;;;;;;;;;:9;:24;11682:4;11664:24;;;;;;;;;;;;;;;;:28;;:68;;;;;:::i;:::-;11637:9;:24;11655:4;11637:24;;;;;;;;;;;;;;;:95;;;;11788:64;11805:11;11788:64;;;;;;;;;;;;;;;;;:12;;:16;;:64;;;;;:::i;:::-;11773:12;:79;;;;11905:17;:15;:17::i;:::-;11982:22;;;;;;;;;;;11978:126;;;12036:57;12053:39;;12036:12;;:16;;:57;;;;:::i;:::-;12020:13;:73;;;;11978:126;12189:1;12157:48;;12174:4;12157:48;;;12193:11;12157:48;;;;;;:::i;:::-;;;;;;;;12222:4;12215:11;;11461:772;;;;:::o;755:134:9:-;813:7;839:43;843:1;846;839:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;832:50;;755:134;;;;:::o;7:139:10:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:155::-;;393:6;380:20;371:29;;409:41;444:5;409:41;:::i;:::-;361:95;;;;:::o;462:133::-;;543:6;530:20;521:29;;559:30;583:5;559:30;:::i;:::-;511:84;;;;:::o;601:139::-;;685:6;672:20;663:29;;701:33;728:5;701:33;:::i;:::-;653:87;;;;:::o;746:262::-;;854:2;842:9;833:7;829:23;825:32;822:2;;;870:1;867;860:12;822:2;913:1;938:53;983:7;974:6;963:9;959:22;938:53;:::i;:::-;928:63;;884:117;812:196;;;;:::o;1014:284::-;;1133:2;1121:9;1112:7;1108:23;1104:32;1101:2;;;1149:1;1146;1139:12;1101:2;1192:1;1217:64;1273:7;1264:6;1253:9;1249:22;1217:64;:::i;:::-;1207:74;;1163:128;1091:207;;;;:::o;1304:278::-;;1420:2;1408:9;1399:7;1395:23;1391:32;1388:2;;;1436:1;1433;1426:12;1388:2;1479:1;1504:61;1557:7;1548:6;1537:9;1533:22;1504:61;:::i;:::-;1494:71;;1450:125;1378:204;;;;:::o;1588:407::-;;;1713:2;1701:9;1692:7;1688:23;1684:32;1681:2;;;1729:1;1726;1719:12;1681:2;1772:1;1797:53;1842:7;1833:6;1822:9;1818:22;1797:53;:::i;:::-;1787:63;;1743:117;1899:2;1925:53;1970:7;1961:6;1950:9;1946:22;1925:53;:::i;:::-;1915:63;;1870:118;1671:324;;;;;:::o;2001:552::-;;;;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2159:1;2156;2149:12;2111:2;2202:1;2227:53;2272:7;2263:6;2252:9;2248:22;2227:53;:::i;:::-;2217:63;;2173:117;2329:2;2355:53;2400:7;2391:6;2380:9;2376:22;2355:53;:::i;:::-;2345:63;;2300:118;2457:2;2483:53;2528:7;2519:6;2508:9;2504:22;2483:53;:::i;:::-;2473:63;;2428:118;2101:452;;;;;:::o;2559:401::-;;;2681:2;2669:9;2660:7;2656:23;2652:32;2649:2;;;2697:1;2694;2687:12;2649:2;2740:1;2765:53;2810:7;2801:6;2790:9;2786:22;2765:53;:::i;:::-;2755:63;;2711:117;2867:2;2893:50;2935:7;2926:6;2915:9;2911:22;2893:50;:::i;:::-;2883:60;;2838:115;2639:321;;;;;:::o;2966:540::-;;;;3102:2;3090:9;3081:7;3077:23;3073:32;3070:2;;;3118:1;3115;3108:12;3070:2;3161:1;3186:53;3231:7;3222:6;3211:9;3207:22;3186:53;:::i;:::-;3176:63;;3132:117;3288:2;3314:50;3356:7;3347:6;3336:9;3332:22;3314:50;:::i;:::-;3304:60;;3259:115;3413:2;3439:50;3481:7;3472:6;3461:9;3457:22;3439:50;:::i;:::-;3429:60;;3384:115;3060:446;;;;;:::o;3512:407::-;;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3653:1;3650;3643:12;3605:2;3696:1;3721:53;3766:7;3757:6;3746:9;3742:22;3721:53;:::i;:::-;3711:63;;3667:117;3823:2;3849:53;3894:7;3885:6;3874:9;3870:22;3849:53;:::i;:::-;3839:63;;3794:118;3595:324;;;;;:::o;3925:256::-;;4030:2;4018:9;4009:7;4005:23;4001:32;3998:2;;;4046:1;4043;4036:12;3998:2;4089:1;4114:50;4156:7;4147:6;4136:9;4132:22;4114:50;:::i;:::-;4104:60;;4060:114;3988:193;;;;:::o;4187:401::-;;;4309:2;4297:9;4288:7;4284:23;4280:32;4277:2;;;4325:1;4322;4315:12;4277:2;4368:1;4393:50;4435:7;4426:6;4415:9;4411:22;4393:50;:::i;:::-;4383:60;;4339:114;4492:2;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;:::i;:::-;4508:63;;4463:118;4267:321;;;;;:::o;4594:972::-;;;;;;;4778:3;4766:9;4757:7;4753:23;4749:33;4746:2;;;4795:1;4792;4785:12;4746:2;4838:1;4863:50;4905:7;4896:6;4885:9;4881:22;4863:50;:::i;:::-;4853:60;;4809:114;4962:2;4988:53;5033:7;5024:6;5013:9;5009:22;4988:53;:::i;:::-;4978:63;;4933:118;5090:2;5116:50;5158:7;5149:6;5138:9;5134:22;5116:50;:::i;:::-;5106:60;;5061:115;5215:2;5241:53;5286:7;5277:6;5266:9;5262:22;5241:53;:::i;:::-;5231:63;;5186:118;5343:3;5370:50;5412:7;5403:6;5392:9;5388:22;5370:50;:::i;:::-;5360:60;;5314:116;5469:3;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5440:119;4736:830;;;;;;;;:::o;5572:262::-;;5680:2;5668:9;5659:7;5655:23;5651:32;5648:2;;;5696:1;5693;5686:12;5648:2;5739:1;5764:53;5809:7;5800:6;5789:9;5785:22;5764:53;:::i;:::-;5754:63;;5710:117;5638:196;;;;:::o;5840:552::-;;;;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;5998:1;5995;5988:12;5950:2;6041:1;6066:53;6111:7;6102:6;6091:9;6087:22;6066:53;:::i;:::-;6056:63;;6012:117;6168:2;6194:53;6239:7;6230:6;6219:9;6215:22;6194:53;:::i;:::-;6184:63;;6139:118;6296:2;6322:53;6367:7;6358:6;6347:9;6343:22;6322:53;:::i;:::-;6312:63;;6267:118;5940:452;;;;;:::o;6398:698::-;;;;;6557:3;6545:9;6536:7;6532:23;6528:33;6525:2;;;6574:1;6571;6564:12;6525:2;6617:1;6642:53;6687:7;6678:6;6667:9;6663:22;6642:53;:::i;:::-;6632:63;;6588:117;6744:2;6770:53;6815:7;6806:6;6795:9;6791:22;6770:53;:::i;:::-;6760:63;;6715:118;6872:2;6898:53;6943:7;6934:6;6923:9;6919:22;6898:53;:::i;:::-;6888:63;;6843:118;7000:2;7026:53;7071:7;7062:6;7051:9;7047:22;7026:53;:::i;:::-;7016:63;;6971:118;6515:581;;;;;;;:::o;7102:179::-;;7192:46;7234:3;7226:6;7192:46;:::i;:::-;7270:4;7265:3;7261:14;7247:28;;7182:99;;;;:::o;7287:147::-;7382:45;7421:5;7382:45;:::i;:::-;7377:3;7370:58;7360:74;;:::o;7440:108::-;7517:24;7535:5;7517:24;:::i;:::-;7512:3;7505:37;7495:53;;:::o;7554:118::-;7641:24;7659:5;7641:24;:::i;:::-;7636:3;7629:37;7619:53;;:::o;7708:732::-;;7856:54;7904:5;7856:54;:::i;:::-;7926:86;8005:6;8000:3;7926:86;:::i;:::-;7919:93;;8036:56;8086:5;8036:56;:::i;:::-;8115:7;8146:1;8131:284;8156:6;8153:1;8150:13;8131:284;;;8232:6;8226:13;8259:63;8318:3;8303:13;8259:63;:::i;:::-;8252:70;;8345:60;8398:6;8345:60;:::i;:::-;8335:70;;8191:224;8178:1;8175;8171:9;8166:14;;8131:284;;;8135:14;8431:3;8424:10;;7832:608;;;;;;;:::o;8446:109::-;8527:21;8542:5;8527:21;:::i;:::-;8522:3;8515:34;8505:50;;:::o;8561:203::-;8684:73;8751:5;8684:73;:::i;:::-;8679:3;8672:86;8662:102;;:::o;8770:147::-;8865:45;8904:5;8865:45;:::i;:::-;8860:3;8853:58;8843:74;;:::o;8923:364::-;;9039:39;9072:5;9039:39;:::i;:::-;9094:71;9158:6;9153:3;9094:71;:::i;:::-;9087:78;;9174:52;9219:6;9214:3;9207:4;9200:5;9196:16;9174:52;:::i;:::-;9251:29;9273:6;9251:29;:::i;:::-;9246:3;9242:39;9235:46;;9015:272;;;;;:::o;9293:315::-;;9456:67;9520:2;9515:3;9456:67;:::i;:::-;9449:74;;9553:19;9549:1;9544:3;9540:11;9533:40;9599:2;9594:3;9590:12;9583:19;;9439:169;;;:::o;9614:370::-;;9777:67;9841:2;9836:3;9777:67;:::i;:::-;9770:74;;9874:34;9870:1;9865:3;9861:11;9854:55;9940:8;9935:2;9930:3;9926:12;9919:30;9975:2;9970:3;9966:12;9959:19;;9760:224;;;:::o;9990:325::-;;10153:67;10217:2;10212:3;10153:67;:::i;:::-;10146:74;;10250:29;10246:1;10241:3;10237:11;10230:50;10306:2;10301:3;10297:12;10290:19;;10136:179;;;:::o;10321:368::-;;10484:67;10548:2;10543:3;10484:67;:::i;:::-;10477:74;;10581:34;10577:1;10572:3;10568:11;10561:55;10647:6;10642:2;10637:3;10633:12;10626:28;10680:2;10675:3;10671:12;10664:19;;10467:222;;;:::o;10695:365::-;;10858:67;10922:2;10917:3;10858:67;:::i;:::-;10851:74;;10955:34;10951:1;10946:3;10942:11;10935:55;11021:3;11016:2;11011:3;11007:12;11000:25;11051:2;11046:3;11042:12;11035:19;;10841:219;;;:::o;11066:330::-;;11229:67;11293:2;11288:3;11229:67;:::i;:::-;11222:74;;11326:34;11322:1;11317:3;11313:11;11306:55;11387:2;11382:3;11378:12;11371:19;;11212:184;;;:::o;11402:329::-;;11565:67;11629:2;11624:3;11565:67;:::i;:::-;11558:74;;11662:33;11658:1;11653:3;11649:11;11642:54;11722:2;11717:3;11713:12;11706:19;;11548:183;;;:::o;11737:373::-;;11900:67;11964:2;11959:3;11900:67;:::i;:::-;11893:74;;11997:34;11993:1;11988:3;11984:11;11977:55;12063:11;12058:2;12053:3;12049:12;12042:33;12101:2;12096:3;12092:12;12085:19;;11883:227;;;:::o;12116:367::-;;12279:67;12343:2;12338:3;12279:67;:::i;:::-;12272:74;;12376:34;12372:1;12367:3;12363:11;12356:55;12442:5;12437:2;12432:3;12428:12;12421:27;12474:2;12469:3;12465:12;12458:19;;12262:221;;;:::o;12489:297::-;;12669:83;12750:1;12745:3;12669:83;:::i;:::-;12662:90;;12778:1;12773:3;12769:11;12762:18;;12652:134;;;:::o;12792:316::-;;12955:67;13019:2;13014:3;12955:67;:::i;:::-;12948:74;;13052:20;13048:1;13043:3;13039:11;13032:41;13099:2;13094:3;13090:12;13083:19;;12938:170;;;:::o;13114:367::-;;13277:67;13341:2;13336:3;13277:67;:::i;:::-;13270:74;;13374:34;13370:1;13365:3;13361:11;13354:55;13440:5;13435:2;13430:3;13426:12;13419:27;13472:2;13467:3;13463:12;13456:19;;13260:221;;;:::o;13487:118::-;13574:24;13592:5;13574:24;:::i;:::-;13569:3;13562:37;13552:53;;:::o;13611:112::-;13694:22;13710:5;13694:22;:::i;:::-;13689:3;13682:35;13672:51;;:::o;13729:379::-;;13935:147;14078:3;13935:147;:::i;:::-;13928:154;;14099:3;14092:10;;13917:191;;;:::o;14114:222::-;;14245:2;14234:9;14230:18;14222:26;;14258:71;14326:1;14315:9;14311:17;14302:6;14258:71;:::i;:::-;14212:124;;;;:::o;14342:238::-;;14481:2;14470:9;14466:18;14458:26;;14494:79;14570:1;14559:9;14555:17;14546:6;14494:79;:::i;:::-;14448:132;;;;:::o;14586:332::-;;14745:2;14734:9;14730:18;14722:26;;14758:71;14826:1;14815:9;14811:17;14802:6;14758:71;:::i;:::-;14839:72;14907:2;14896:9;14892:18;14883:6;14839:72;:::i;:::-;14712:206;;;;;:::o;14924:348::-;;15091:2;15080:9;15076:18;15068:26;;15104:71;15172:1;15161:9;15157:17;15148:6;15104:71;:::i;:::-;15185:80;15261:2;15250:9;15246:18;15237:6;15185:80;:::i;:::-;15058:214;;;;;:::o;15278:332::-;;15437:2;15426:9;15422:18;15414:26;;15450:71;15518:1;15507:9;15503:17;15494:6;15450:71;:::i;:::-;15531:72;15599:2;15588:9;15584:18;15575:6;15531:72;:::i;:::-;15404:206;;;;;:::o;15616:210::-;;15741:2;15730:9;15726:18;15718:26;;15754:65;15816:1;15805:9;15801:17;15792:6;15754:65;:::i;:::-;15708:118;;;;:::o;15832:294::-;;15999:2;15988:9;15984:18;15976:26;;16012:107;16116:1;16105:9;16101:17;16092:6;16012:107;:::i;:::-;15966:160;;;;:::o;16132:313::-;;16283:2;16272:9;16268:18;16260:26;;16332:9;16326:4;16322:20;16318:1;16307:9;16303:17;16296:47;16360:78;16433:4;16424:6;16360:78;:::i;:::-;16352:86;;16250:195;;;;:::o;16451:419::-;;16655:2;16644:9;16640:18;16632:26;;16704:9;16698:4;16694:20;16690:1;16679:9;16675:17;16668:47;16732:131;16858:4;16732:131;:::i;:::-;16724:139;;16622:248;;;:::o;16876:419::-;;17080:2;17069:9;17065:18;17057:26;;17129:9;17123:4;17119:20;17115:1;17104:9;17100:17;17093:47;17157:131;17283:4;17157:131;:::i;:::-;17149:139;;17047:248;;;:::o;17301:419::-;;17505:2;17494:9;17490:18;17482:26;;17554:9;17548:4;17544:20;17540:1;17529:9;17525:17;17518:47;17582:131;17708:4;17582:131;:::i;:::-;17574:139;;17472:248;;;:::o;17726:419::-;;17930:2;17919:9;17915:18;17907:26;;17979:9;17973:4;17969:20;17965:1;17954:9;17950:17;17943:47;18007:131;18133:4;18007:131;:::i;:::-;17999:139;;17897:248;;;:::o;18151:419::-;;18355:2;18344:9;18340:18;18332:26;;18404:9;18398:4;18394:20;18390:1;18379:9;18375:17;18368:47;18432:131;18558:4;18432:131;:::i;:::-;18424:139;;18322:248;;;:::o;18576:419::-;;18780:2;18769:9;18765:18;18757:26;;18829:9;18823:4;18819:20;18815:1;18804:9;18800:17;18793:47;18857:131;18983:4;18857:131;:::i;:::-;18849:139;;18747:248;;;:::o;19001:419::-;;19205:2;19194:9;19190:18;19182:26;;19254:9;19248:4;19244:20;19240:1;19229:9;19225:17;19218:47;19282:131;19408:4;19282:131;:::i;:::-;19274:139;;19172:248;;;:::o;19426:419::-;;19630:2;19619:9;19615:18;19607:26;;19679:9;19673:4;19669:20;19665:1;19654:9;19650:17;19643:47;19707:131;19833:4;19707:131;:::i;:::-;19699:139;;19597:248;;;:::o;19851:419::-;;20055:2;20044:9;20040:18;20032:26;;20104:9;20098:4;20094:20;20090:1;20079:9;20075:17;20068:47;20132:131;20258:4;20132:131;:::i;:::-;20124:139;;20022:248;;;:::o;20276:419::-;;20480:2;20469:9;20465:18;20457:26;;20529:9;20523:4;20519:20;20515:1;20504:9;20500:17;20493:47;20557:131;20683:4;20557:131;:::i;:::-;20549:139;;20447:248;;;:::o;20701:419::-;;20905:2;20894:9;20890:18;20882:26;;20954:9;20948:4;20944:20;20940:1;20929:9;20925:17;20918:47;20982:131;21108:4;20982:131;:::i;:::-;20974:139;;20872:248;;;:::o;21126:222::-;;21257:2;21246:9;21242:18;21234:26;;21270:71;21338:1;21327:9;21323:17;21314:6;21270:71;:::i;:::-;21224:124;;;;:::o;21354:831::-;;21655:3;21644:9;21640:19;21632:27;;21669:71;21737:1;21726:9;21722:17;21713:6;21669:71;:::i;:::-;21750:80;21826:2;21815:9;21811:18;21802:6;21750:80;:::i;:::-;21877:9;21871:4;21867:20;21862:2;21851:9;21847:18;21840:48;21905:108;22008:4;21999:6;21905:108;:::i;:::-;21897:116;;22023:72;22091:2;22080:9;22076:18;22067:6;22023:72;:::i;:::-;22105:73;22173:3;22162:9;22158:19;22149:6;22105:73;:::i;:::-;21622:563;;;;;;;;:::o;22191:332::-;;22350:2;22339:9;22335:18;22327:26;;22363:71;22431:1;22420:9;22416:17;22407:6;22363:71;:::i;:::-;22444:72;22512:2;22501:9;22497:18;22488:6;22444:72;:::i;:::-;22317:206;;;;;:::o;22529:442::-;;22716:2;22705:9;22701:18;22693:26;;22729:71;22797:1;22786:9;22782:17;22773:6;22729:71;:::i;:::-;22810:72;22878:2;22867:9;22863:18;22854:6;22810:72;:::i;:::-;22892;22960:2;22949:9;22945:18;22936:6;22892:72;:::i;:::-;22683:288;;;;;;:::o;22977:214::-;;23104:2;23093:9;23089:18;23081:26;;23117:67;23181:1;23170:9;23166:17;23157:6;23117:67;:::i;:::-;23071:120;;;;:::o;23197:132::-;;23287:3;23279:11;;23317:4;23312:3;23308:14;23300:22;;23269:60;;;:::o;23335:114::-;;23436:5;23430:12;23420:22;;23409:40;;;:::o;23455:99::-;;23541:5;23535:12;23525:22;;23514:40;;;:::o;23560:113::-;;23662:4;23657:3;23653:14;23645:22;;23635:38;;;:::o;23679:184::-;;23812:6;23807:3;23800:19;23852:4;23847:3;23843:14;23828:29;;23790:73;;;;:::o;23869:147::-;;24007:3;23992:18;;23982:34;;;;:::o;24022:169::-;;24140:6;24135:3;24128:19;24180:4;24175:3;24171:14;24156:29;;24118:73;;;;:::o;24197:305::-;;24256:20;24274:1;24256:20;:::i;:::-;24251:25;;24290:20;24308:1;24290:20;:::i;:::-;24285:25;;24444:1;24376:66;24372:74;24369:1;24366:81;24363:2;;;24450:18;;:::i;:::-;24363:2;24494:1;24491;24487:9;24480:16;;24241:261;;;;:::o;24508:185::-;;24565:20;24583:1;24565:20;:::i;:::-;24560:25;;24599:20;24617:1;24599:20;:::i;:::-;24594:25;;24638:1;24628:2;;24643:18;;:::i;:::-;24628:2;24685:1;24682;24678:9;24673:14;;24550:143;;;;:::o;24699:348::-;;24762:20;24780:1;24762:20;:::i;:::-;24757:25;;24796:20;24814:1;24796:20;:::i;:::-;24791:25;;24984:1;24916:66;24912:74;24909:1;24906:81;24901:1;24894:9;24887:17;24883:105;24880:2;;;24991:18;;:::i;:::-;24880:2;25039:1;25036;25032:9;25021:20;;24747:300;;;;:::o;25053:191::-;;25113:20;25131:1;25113:20;:::i;:::-;25108:25;;25147:20;25165:1;25147:20;:::i;:::-;25142:25;;25186:1;25183;25180:8;25177:2;;;25191:18;;:::i;:::-;25177:2;25236:1;25233;25229:9;25221:17;;25098:146;;;;:::o;25250:96::-;;25316:24;25334:5;25316:24;:::i;:::-;25305:35;;25295:51;;;:::o;25352:104::-;;25426:24;25444:5;25426:24;:::i;:::-;25415:35;;25405:51;;;:::o;25462:90::-;;25539:5;25532:13;25525:21;25514:32;;25504:48;;;:::o;25558:126::-;;25635:42;25628:5;25624:54;25613:65;;25603:81;;;:::o;25690:77::-;;25756:5;25745:16;;25735:32;;;:::o;25773:86::-;;25848:4;25841:5;25837:16;25826:27;;25816:43;;;:::o;25865:134::-;;25956:37;25987:5;25956:37;:::i;:::-;25943:50;;25933:66;;;:::o;26005:190::-;;26124:65;26183:5;26124:65;:::i;:::-;26111:78;;26101:94;;;:::o;26201:141::-;;26312:24;26330:5;26312:24;:::i;:::-;26299:37;;26289:53;;;:::o;26348:121::-;;26439:24;26457:5;26439:24;:::i;:::-;26426:37;;26416:53;;;:::o;26475:126::-;;26558:37;26589:5;26558:37;:::i;:::-;26545:50;;26535:66;;;:::o;26607:113::-;;26690:24;26708:5;26690:24;:::i;:::-;26677:37;;26667:53;;;:::o;26726:307::-;26794:1;26804:113;26818:6;26815:1;26812:13;26804:113;;;26903:1;26898:3;26894:11;26888:18;26884:1;26879:3;26875:11;26868:39;26840:2;26837:1;26833:10;26828:15;;26804:113;;;26935:6;26932:1;26929:13;26926:2;;;27015:1;27006:6;27001:3;26997:16;26990:27;26926:2;26775:258;;;;:::o;27039:180::-;27087:77;27084:1;27077:88;27184:4;27181:1;27174:15;27208:4;27205:1;27198:15;27225:180;27273:77;27270:1;27263:88;27370:4;27367:1;27360:15;27394:4;27391:1;27384:15;27411:102;;27503:2;27499:7;27494:2;27487:5;27483:14;27479:28;27469:38;;27459:54;;;:::o;27519:122::-;27592:24;27610:5;27592:24;:::i;:::-;27585:5;27582:35;27572:2;;27631:1;27628;27621:12;27572:2;27562:79;:::o;27647:138::-;27728:32;27754:5;27728:32;:::i;:::-;27721:5;27718:43;27708:2;;27775:1;27772;27765:12;27708:2;27698:87;:::o;27791:116::-;27861:21;27876:5;27861:21;:::i;:::-;27854:5;27851:32;27841:2;;27897:1;27894;27887:12;27841:2;27831:76;:::o;27913:122::-;27986:24;28004:5;27986:24;:::i;:::-;27979:5;27976:35;27966:2;;28025:1;28022;28015:12;27966:2;27956:79;:::o

Swarm Source

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