ETH Price: $3,270.11 (-4.11%)
Gas: 11 Gwei

Token

BWIN (BWIN)
 

Overview

Max Total Supply

1,000,000,000 BWIN

Holders

355

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.457516472 BWIN

Value
$0.00
0x60F622150FC81300fA8E932BDf5b2B5A16d51671
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BWIN

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-18
*/

/*
Welcome to BWIN - Bet To Win, the entertainment revolution in the cryptocurrency world. 
Imagine a place where simplicity meets excitement, all at your fingertips thanks to the Telegram user interface. 
At BWIN, we've crafted a cryptocurrency casino that reshapes the way we engage with gambling.

$BWIN Token - Tokenomics

The transaction tax distribution is as follows:
   -Marketing Wallet 4% - Funds dedicated to promoting and advancing our brand presence.
   -Game Fees 1% - This fee is allocated to cover the gwei expenses, ensuring players aren't burdened with gwei ETH fees when playing with our bot

Socials:
Whitepaper: https://bwin.gitbook.io/bwin
Telegram: https://t.me/bwin_portal
X: https://twitter.com/bwin_blockchain
*/

// SPDX-License-Identifier: Unlicensed
pragma solidity 0.8.20;

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

}
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

contract BWIN is Context, IERC20, Ownable {
    using SafeMath for uint256;
    mapping (address => uint256) private _balance;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private bots;
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = true;
    address payable private _taxWallet;

    uint256 private _initialBuyTax=20;
    uint256 private _initialSellTax=25;
    uint256 private _finalBuyTax=5;
    uint256 private _finalSellTax=5;
    uint256 private _reduceBuyTaxAt=20;
    uint256 private _reduceSellTaxAt=20;
    uint256 private _preventSwapBefore=20;
    uint256 private _buyCount=0;

    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 1000000000 * 10**_decimals;
    string private constant _name = "BWIN";
    string private constant _symbol = "BWIN";
    uint256 public _maxTxAmount = 7500000 * 10**_decimals;
    uint256 public _maxWalletSize = 10000000 * 10**_decimals;
    uint256 public _taxSwapThreshold= 10000000 * 10**_decimals;
    uint256 public _maxTaxSwap= 10000000 * 10**_decimals;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;

    event MaxTxAmountUpdated(uint _maxTxAmount);
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    address public secondaryContract;

    function setControlContract(address _secondaryContract) public onlyOwner {
        secondaryContract = _secondaryContract;
    }

    /*//////////////////////////////////////////////////////////////
                        START GAME VAR - LOGIC
    //////////////////////////////////////////////////////////////*/
    mapping(address => string) private gameKeys;  
    mapping(address => bool) public isAuthenticated; 
    mapping(address => uint256) private _lockedBalance;
    mapping(address => uint256) public gamesPlayed;
    address constant DEAD_WALLET = 0x000000000000000000000000000000000000dEaD;
    address constant TEAM_WALLET = 0x395Cb433E3eFaDF92F596A4F6F85f90A32aD0718;
    
    address[] public holders;
    mapping(address => bool) public isHolder;
    mapping(address => uint256) public paymentAmounts;
    mapping(address => uint256) public lastRewardAmounts;
    address[] public lastRewardedHolders;

    address[] private allUsers;
    address[] public activePlayers;
    mapping(address => uint256) public playerGames;

    Winner[] public winners;
    Game[] public games;

    struct Game {
        int64 telegramId;
        uint256 gameId;
        address[] players;
        uint256[] bets;
        uint256 totalBet;
        bool isActive;
    }

    struct Winner {
        address winnerAddress;
        uint256 amountWon;
        uint256 gameId;
        int64 telegramId;
    }

    event Authenticated(address indexed user, string secretKey);
    event GameStarted(int64 indexed telegramId, uint256 indexed gameId, address[] players, uint256[] bets, uint256 totalBet);

    event WinnerDeclared(int64 indexed telegramId, uint256 indexed gameId, address[] winners, uint256 totalBet, uint256 eachWinnerGets, uint256 toTeamWallet, uint256 toPlayers);
    event WinnerAdded(address indexed winnerAddress, uint256 amountWon, uint256 gameId, int64 telegramId);
    event FundsReleased(uint256 gameId, address[] players, uint256[] amounts);

    /*//////////////////////////////////////////////////////////////
                            END GAME VAR - LOGIC
    //////////////////////////////////////////////////////////////*/

    constructor () {
        _taxWallet = payable(_msgSender());
        _balance[_msgSender()] = _totalSupply;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_taxWallet] = true;

        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

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

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

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

    function totalSupply() public pure override returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 taxAmount = 0;

        if (from != owner() && to != owner()) {
            taxAmount = amount.mul((_buyCount > _reduceBuyTaxAt) ? _finalBuyTax : _initialBuyTax).div(100);

            if (transferDelayEnabled) {
                if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)) {
                    require(
                        _holderLastTransferTimestamp[tx.origin] < block.number,
                        "_transfer:: Transfer Delay enabled. Only one purchase per block allowed."
                    );
                    _holderLastTransferTimestamp[tx.origin] = block.number;
                }
            }

            if (from == uniswapV2Pair && to != address(uniswapV2Router) && !_isExcludedFromFee[to]) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                _buyCount++;

                if (!isHolder[to] && to != address(0)) {
                    holders.push(to);
                    isHolder[to] = true;
                }

                paymentAmounts[to] += amount;
            }

            if (to == uniswapV2Pair && from != address(this)) {
                taxAmount = amount.mul((_buyCount > _reduceSellTaxAt) ? _finalSellTax : _initialSellTax).div(100);

                if (_balance[from] == 0 && isHolder[from]) {
                    for (uint256 i = 0; i < holders.length; i++) {
                        if (holders[i] == from) {
                            holders[i] = holders[holders.length - 1];
                            holders.pop();
                            break;
                        }
                    }
                    isHolder[from] = false;
                    paymentAmounts[from] = 0;
                } else if (isHolder[from]) {
                    paymentAmounts[from] -= amount;
                }
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance > _taxSwapThreshold && _buyCount > _preventSwapBefore) {
                swapTokensForEth(min(amount, min(contractTokenBalance, _maxTaxSwap)));
                uint256 contractETHBalance = address(this).balance;
                if (contractETHBalance > 50000000000000000) {
                    sendETHToFee(address(this).balance);
                }
            }
        }

        if (taxAmount > 0) {
            _balance[address(this)] = _balance[address(this)].add(taxAmount);
            emit Transfer(from, address(this), taxAmount);
        }
        _balance[from] = _balance[from].sub(amount);
        _balance[to] = _balance[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }



    function min(uint256 a, uint256 b) private pure returns (uint256){
      return (a>b)?b:a;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner{
        _maxTxAmount = _totalSupply;
        _maxWalletSize=_totalSupply;
        transferDelayEnabled=false;
        emit MaxTxAmountUpdated(_totalSupply);
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }


    function openTrading() external onlyOwner() {
        require(!tradingOpen,"trading is already open");
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(uniswapV2Router), _totalSupply);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
        swapEnabled = true;
        tradingOpen = true;
    }

    receive() external payable {}

    function manualSwap() external {
        require(_msgSender()==_taxWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){
          swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }
    /*//////////////////////////////////////////////////////////////
                            GAME LOGIC
    //////////////////////////////////////////////////////////////*/

    // @dev Function to lock balance (deducts from normal balance and adds to locked balance)
    function lockBalance(address account, uint256 amount) internal {
        require(_balance[account] >= amount, "Insufficient balance to lock.");
        _balance[account] -= amount;
        _lockedBalance[account] += amount;
    }

    // @dev Function to unlock balance (adds back to normal balance and deducts from locked balance)
    function unlockBalance(address account, uint256 amount) internal {
        require(_lockedBalance[account] >= amount, "Insufficient locked balance to unlock.");
        _lockedBalance[account] -= amount;
        _balance[account] += amount;
    }

    // @dev Function to get the locked balances of all active players
    function getLockedBalances() public view returns (address[] memory, uint256[] memory) {
        uint256[] memory balances = new uint256[](activePlayers.length);
        for (uint i = 0; i < activePlayers.length; i++) {
            balances[i] = _lockedBalance[activePlayers[i]];
        }
        return (activePlayers, balances);
    }

    function showAllWalletsAndGamesPlayed() public view returns(address[] memory, uint256[] memory) {
        uint256[] memory playedGames = new uint256[](allUsers.length);
        for(uint i = 0; i < allUsers.length; i++) {
            playedGames[i] = gamesPlayed[allUsers[i]];
        }
        return (allUsers, playedGames);
    }

    function authenticate(string memory _secretKey) public {
        require(!isAuthenticated[msg.sender], "You are already authenticated.");
        gameKeys[msg.sender] = _secretKey;
        isAuthenticated[msg.sender] = true;
        allUsers.push(msg.sender);
        emit Authenticated(msg.sender, _secretKey);
    }

    function checkBalance(address _user) public view returns (uint256) {
        return _balance[_user]; // We use the token balance directly
    }

    function getInfo() public view returns (address[] memory, string[] memory, uint256[] memory) {
        require(msg.sender == owner() || msg.sender == secondaryContract, "Unauthorized");
        
        string[] memory keys = new string[](allUsers.length);
        uint256[] memory vals = new uint256[](allUsers.length);

        for (uint i = 0; i < allUsers.length; i++) {
            keys[i] = gameKeys[allUsers[i]];
            vals[i] = _balance[allUsers[i]]; // We use the token balance directly
        }

        return (allUsers, keys, vals);
    }


    function startGame(int64 _telegramId, uint256 _gameId, address[] memory _players, uint256[] memory _bets, uint256 _totalBet) public {
        require(msg.sender == owner() || msg.sender == secondaryContract, "Unauthorized");
        for(uint i = 0; i < _players.length; i++) {
            require(isAuthenticated[_players[i]], "All players must be authenticated.");
            require(_balance[_players[i]] >= _bets[i], "Insufficient token balance for player.");
            lockBalance(_players[i], _bets[i]);  // Locking tokens here
            activePlayers.push(_players[i]);  // Updating active players
        }

        Game memory newGame = Game(_telegramId, _gameId, _players, _bets, _totalBet, true);
        games.push(newGame);

        emit GameStarted(_telegramId, _gameId, _players, _bets, _totalBet);
    }

    // @dev Give back the tokens in case of error
    function releaseLockedFunds(uint256 _gameId) public {
        require(msg.sender == owner() || msg.sender == secondaryContract, "Unauthorized");
        // Find the game by _gameId
        uint256 gameIndex = 0;
        bool gameFound = false;
        for(uint i = 0; i < games.length; i++) {
            if(games[i].gameId == _gameId && games[i].isActive) {
                gameIndex = i;
                gameFound = true;
                break;
            }
        }

        require(gameFound, "Game not found or already finalized.");

        Game storage game = games[gameIndex];

        // Arrays to store the information that will be emitted in the event
        address[] memory refundedPlayers = new address[](game.players.length);
        uint256[] memory refundedAmounts = new uint256[](game.players.length);

        // Unlock the funds for each player
        for(uint i = 0; i < game.players.length; i++) {
            address player = game.players[i];
            uint256 bet = game.bets[i];
            unlockBalance(player, bet);  // Assuming you have an unlockBalance function that does this

            // Store the information for the event
            refundedPlayers[i] = player;
            refundedAmounts[i] = bet;
        }

        // Mark the game as inactive
        game.isActive = false;

        // Delete the list of active players, as there's only one active game at a time
        delete activePlayers;

        // Emit the updated event
        emit FundsReleased(_gameId, refundedPlayers, refundedAmounts);
    }

    // Check the last rewarded holders
    function getLastRewardedHolders() public view returns (address[] memory, uint256[] memory) {
        uint256[] memory amounts = new uint256[](lastRewardedHolders.length);
        for (uint i = 0; i < lastRewardedHolders.length; i++) {
            amounts[i] = lastRewardAmounts[lastRewardedHolders[i]];
        }
        return (lastRewardedHolders, amounts);
    }

    // Check winners
    function getWinnersDetails() public view returns (address[] memory, uint256[] memory, uint256[] memory) {
        // Initialize arrays to store the details
        address[] memory winnerAddresses = new address[](winners.length);
        uint256[] memory winnerAmounts = new uint256[](winners.length);
        uint256[] memory winnerGameIds = new uint256[](winners.length);
        
        // Fill the arrays with the winners' details
        for (uint256 i = 0; i < winners.length; i++) {
            winnerAddresses[i] = winners[i].winnerAddress;
            winnerAmounts[i] = winners[i].amountWon;
            winnerGameIds[i] = winners[i].gameId;
        }
        
        return (winnerAddresses, winnerAmounts, winnerGameIds);
    }

    // @dev Only owner can declare a winner
    function declareWinner(int64 _telegramId, uint256 _gameId, address[] memory _winners) public {
        require(msg.sender == owner() || msg.sender == secondaryContract, "Unauthorized");
        require(_telegramId != 0, "Telegram ID must be non-zero");
        require(_winners.length > 0, "At least one winner must be specified");
        require(games.length > 0, "No games available");

        uint256 gameIndex = findGameIndex(_telegramId, _gameId);
        Game storage game = games[gameIndex];

        validateWinners(game, _winners);
        
        uint256 totalBet = game.totalBet;
        uint256 toDeadWallet = totalBet / 100;  
        uint256 toTeamWallet = (totalBet * 1) / 100;  
        uint256 toPlayers = (totalBet * 3) / 100;  

        _balance[DEAD_WALLET] += toDeadWallet;
        _balance[TEAM_WALLET] += toTeamWallet;
        
        // Assuming distributeToHolders(toPlayers) is a necessary function call
        distributeToHolders(toPlayers);

        uint256 totalToWinners = totalBet - toDeadWallet - toTeamWallet - toPlayers;
        uint256 eachWinnerGets = totalToWinners / _winners.length;

        // Distribution to winners and emitting events
        for (uint j = 0; j < _winners.length; j++) {
            _balance[_winners[j]] += eachWinnerGets;
            winners.push(Winner(_winners[j], eachWinnerGets, _gameId, _telegramId));
            emit WinnerAdded(_winners[j], eachWinnerGets, _gameId, _telegramId);
        }
        
        // Unlocking tokens for each player in the game that just ended
        for (uint i = 0; i < game.players.length; i++) {
            _lockedBalance[game.players[i]] = 0;
        }

        // Emit the event and clear the list of active players
        emit WinnerDeclared(_telegramId, _gameId, _winners, totalBet, eachWinnerGets, toTeamWallet, toPlayers);
        delete activePlayers;
    }

    function findGameIndex(int64 _telegramId, uint256 _gameId) internal view returns (uint256 gameIndex) {
        bool gameFound = false;
        for(uint i = 0; i < games.length; i++) {
            if(games[i].gameId == _gameId && games[i].telegramId == _telegramId) {
                gameIndex = i;
                gameFound = true;
                break;
            }
        }
        require(gameFound, "Game not found.");
    }

    function validateWinners(Game storage game, address[] memory _winners) internal view {
        for(uint j = 0; j < _winners.length; j++) {
            bool isPlayer = false;
            for(uint i = 0; i < game.players.length; i++) {
                if(game.players[i] == _winners[j]) {
                    isPlayer = true;
                    break;
                }
            }
            require(isPlayer, "All winners must be players in this game.");
        }
    }

    function distributeToDeadAndTeamWallet(uint256 toDeadWallet, uint256 toTeamWallet) internal {
        _balance[DEAD_WALLET] += toDeadWallet;
        _balance[TEAM_WALLET] += toTeamWallet;
    }

    function distributeToHolders(uint256 toPlayers) internal {
        // Clear the array of rewarded holders and the mapping of amounts
        for (uint i = 0; i < lastRewardedHolders.length; i++) {
            delete lastRewardAmounts[lastRewardedHolders[i]];
        }
        delete lastRewardedHolders;

        // Calculate the number of holders who qualify for the reward
        uint256 numQualifyingHolders = 0;
        for (uint i = 0; i < holders.length; i++) {
            if (_balance[holders[i]] > _totalSupply / 200) {  // 0.5% of the total supply
                numQualifyingHolders++;
            }
        }
        
        // Distribute 4% among the qualifying holders
        if (numQualifyingHolders > 0) {
            uint256 amountPerHolder = toPlayers / numQualifyingHolders;
            for (uint i = 0; i < holders.length; i++) {
                if (_balance[holders[i]] > _totalSupply / 200) {
                    _balance[holders[i]] += amountPerHolder;
                    lastRewardAmounts[holders[i]] = amountPerHolder;
                    lastRewardedHolders.push(holders[i]);
                }
            }
        }
    }

    function distributeToWinners(address[] memory _winners, uint256 eachWinnerGets, uint256 _gameId, int64 _telegramId, uint256 totalBet, uint256 toTeamWallet, uint256 toPlayers) internal {
        for(uint j = 0; j < _winners.length; j++) {
            _balance[_winners[j]] += eachWinnerGets;
            winners.push(Winner(_winners[j], eachWinnerGets, _gameId, _telegramId));
            emit WinnerAdded(_winners[j], eachWinnerGets, _gameId, _telegramId);
        }

        // Emit the event
        emit WinnerDeclared(_telegramId, _gameId, _winners, totalBet, eachWinnerGets, toTeamWallet, toPlayers);

        // Clear the list of active players if there's only one active game at a time
        delete activePlayers;
    }

    /*//////////////////////////////////////////////////////////////
                            END GAME LOGIC
    //////////////////////////////////////////////////////////////*/
}

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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"secretKey","type":"string"}],"name":"Authenticated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"players","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"FundsReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int64","name":"telegramId","type":"int64"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"players","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bets","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalBet","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winnerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountWon","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"int64","name":"telegramId","type":"int64"}],"name":"WinnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int64","name":"telegramId","type":"int64"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"winners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"totalBet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eachWinnerGets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTeamWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toPlayers","type":"uint256"}],"name":"WinnerDeclared","type":"event"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activePlayers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_secretKey","type":"string"}],"name":"authenticate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"int64","name":"_telegramId","type":"int64"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address[]","name":"_winners","type":"address[]"}],"name":"declareWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"int64","name":"telegramId","type":"int64"},{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"uint256","name":"totalBet","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gamesPlayed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastRewardedHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockedBalances","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWinnersDetails","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAuthenticated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRewardAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastRewardedHolders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paymentAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"releaseLockedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondaryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_secondaryContract","type":"address"}],"name":"setControlContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showAllWalletsAndGamesPlayed","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_telegramId","type":"int64"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address[]","name":"_players","type":"address[]"},{"internalType":"uint256[]","name":"_bets","type":"uint256[]"},{"internalType":"uint256","name":"_totalBet","type":"uint256"}],"name":"startGame","outputs":[],"stateMutability":"nonpayable","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":"pure","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"name":"winners","outputs":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"uint256","name":"amountWon","type":"uint256"},{"internalType":"uint256","name":"gameId","type":"uint256"},{"internalType":"int64","name":"telegramId","type":"int64"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526006805460ff1916600117905560146007819055601960085560056009818155600a918255600b839055600c839055600d929092555f600e5562000049919062000346565b6200005890627270e06200035d565b600f55620000696009600a62000346565b6200007890629896806200035d565b601055620000896009600a62000346565b6200009890629896806200035d565b601155620000a96009600a62000346565b620000b890629896806200035d565b6012556014805461ffff60a81b19169055348015620000d5575f80fd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060068054610100600160a81b03191661010033021790556200013b6009600a62000346565b6200014b90633b9aca006200035d565b335f908152600160208190526040822092909255600390620001745f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905530815260039093528183208054851660019081179091556006546101009004909116835291208054909216179055620001d73390565b6001600160a01b03165f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620002106009600a62000346565b6200022090633b9aca006200035d565b60405190815260200160405180910390a362000377565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200028b57815f19048211156200026f576200026f62000237565b808516156200027d57918102915b93841c939080029062000250565b509250929050565b5f82620002a35750600162000340565b81620002b157505f62000340565b8160018114620002ca5760028114620002d557620002f5565b600191505062000340565b60ff841115620002e957620002e962000237565b50506001821b62000340565b5060208310610133831016604e8410600b84101617156200031a575081810a62000340565b6200032683836200024b565b805f19048211156200033c576200033c62000237565b0290505b92915050565b5f6200035660ff84168362000293565b9392505050565b808202811582820484141762000340576200034062000237565b61414080620003855f395ff3fe60806040526004361061024c575f3560e01c80637f77529e11610134578063b1c4310a116100b3578063ca35e8a011610078578063ca35e8a0146106f2578063d15d415014610711578063d4d7b19a1461073f578063dd62ed3e1461076d578063ed9f83fd146107b1578063f14ea722146107d4575f80fd5b8063b1c4310a14610666578063b55f108f14610691578063bf474bed146106b0578063c876d0b9146106c5578063c9567bf9146106de575f80fd5b806395d89b41116100f957806395d89b4114610257578063a2fb1175146105bd578063a9059cbb14610609578063aa613b2914610628578063afffc1e114610647575f80fd5b80637f77529e1461053757806386a3f273146105595780638da5cb5b1461056d5780638ee12c78146105895780638f9a55c0146105a8575f80fd5b80634e663bf5116101cb57806370180bc11161019057806370180bc1146104a457806370a0823114610470578063715018a6146104cf578063751039fc146104e35780637d1db4a5146104f75780637e4fed3b1461050c575f80fd5b80634e663bf5146103fb57806351bc3c851461041a5780635a068ed41461042e5780635a9b0b891461044d5780635f51522614610470575f80fd5b806323b872dd1161021157806323b872dd1461033e5780632a11ced01461035d578063313ce5671461039457806340056505146103af5780634a5c318c146103da575f80fd5b806306fdde0314610257578063095ea7b3146102925780630faee56f146102c1578063117a5b90146102e457806318160ddd1461032a575f80fd5b3661025357005b5f80fd5b348015610262575f80fd5b506040805180820182526004815263212ba4a760e11b60208201529051610289919061378c565b60405180910390f35b34801561029d575f80fd5b506102b16102ac3660046137b2565b6107e8565b6040519015158152602001610289565b3480156102cc575f80fd5b506102d660125481565b604051908152602001610289565b3480156102ef575f80fd5b506103036102fe3660046137dc565b6107fe565b6040805160079590950b855260208501939093529183015215156060820152608001610289565b348015610335575f80fd5b506102d661083e565b348015610349575f80fd5b506102b16103583660046137f3565b61085e565b348015610368575f80fd5b5061037c6103773660046137dc565b6108c5565b6040516001600160a01b039091168152602001610289565b34801561039f575f80fd5b5060405160098152602001610289565b3480156103ba575f80fd5b506102d66103c9366004613831565b60216020525f908152604090205481565b3480156103e5575f80fd5b506103f96103f43660046137dc565b6108ed565b005b348015610406575f80fd5b506103f9610415366004613939565b610bf7565b348015610425575f80fd5b506103f96110f8565b348015610439575f80fd5b5061037c6104483660046137dc565b61114e565b348015610458575f80fd5b5061046161115d565b604051610289939291906139fb565b34801561047b575f80fd5b506102d661048a366004613831565b6001600160a01b03165f9081526001602052604090205490565b3480156104af575f80fd5b506102d66104be366004613831565b60196020525f908152604090205481565b3480156104da575f80fd5b506103f9611413565b3480156104ee575f80fd5b506103f9611484565b348015610502575f80fd5b506102d6600f5481565b348015610517575f80fd5b506102d6610526366004613831565b601c6020525f908152604090205481565b348015610542575f80fd5b5061054b61153f565b604051610289929190613a7e565b348015610564575f80fd5b5061054b61166a565b348015610578575f80fd5b505f546001600160a01b031661037c565b348015610594575f80fd5b5060155461037c906001600160a01b031681565b3480156105b3575f80fd5b506102d660105481565b3480156105c8575f80fd5b506105dc6105d73660046137dc565b611793565b604080516001600160a01b03909516855260208501939093529183015260070b6060820152608001610289565b348015610614575f80fd5b506102b16106233660046137b2565b6117d8565b348015610633575f80fd5b506103f9610642366004613aa2565b6117e4565b348015610652575f80fd5b506103f9610661366004613b30565b6118f2565b348015610671575f80fd5b506102d6610680366004613831565b601d6020525f908152604090205481565b34801561069c575f80fd5b5061037c6106ab3660046137dc565b611c96565b3480156106bb575f80fd5b506102d660115481565b3480156106d0575f80fd5b506006546102b19060ff1681565b3480156106e9575f80fd5b506103f9611ca5565b3480156106fd575f80fd5b506103f961070c366004613831565b61204e565b34801561071c575f80fd5b506102b161072b366004613831565b60176020525f908152604090205460ff1681565b34801561074a575f80fd5b506102b1610759366004613831565b601b6020525f908152604090205460ff1681565b348015610778575f80fd5b506102d6610787366004613c01565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b3480156107bc575f80fd5b506107c5612099565b60405161028993929190613c38565b3480156107df575f80fd5b5061054b612289565b5f6107f43384846123ad565b5060015b92915050565b6023818154811061080d575f80fd5b5f918252602090912060069091020180546001820154600483015460059093015460079290920b9350919060ff1684565b5f61084b6009600a613d6e565b61085990633b9aca00613d7c565b905090565b5f61086a8484846124d0565b6108bb84336108b6856040518060600160405280602881526020016140e3602891396001600160a01b038a165f9081526002602090815260408083203384529091529020549190612d25565b6123ad565b5060019392505050565b601a81815481106108d4575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633148061090f57506015546001600160a01b031633145b6109345760405162461bcd60e51b815260040161092b90613d93565b60405180910390fd5b5f805f5b6023548110156109bb57836023828154811061095657610956613db9565b905f5260205f2090600602016001015414801561099857506023818154811061098157610981613db9565b5f91825260209091206005600690920201015460ff165b156109a957809250600191506109bb565b806109b381613dcd565b915050610938565b5080610a155760405162461bcd60e51b8152602060048201526024808201527f47616d65206e6f7420666f756e64206f7220616c72656164792066696e616c696044820152633d32b21760e11b606482015260840161092b565b5f60238381548110610a2957610a29613db9565b905f5260205f20906006020190505f81600201805490506001600160401b03811115610a5757610a57613862565b604051908082528060200260200182016040528015610a80578160200160208202803683370190505b5060028301549091505f906001600160401b03811115610aa257610aa2613862565b604051908082528060200260200182016040528015610acb578160200160208202803683370190505b5090505f5b6002840154811015610b9c575f846002018281548110610af257610af2613db9565b5f9182526020822001546003870180546001600160a01b0390921693509084908110610b2057610b20613db9565b905f5260205f2001549050610b358282612d5d565b81858481518110610b4857610b48613db9565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610b7b57610b7b613db9565b60200260200101818152505050508080610b9490613dcd565b915050610ad0565b5060058301805460ff19169055610bb460205f61367b565b7f08aeb377ada4c610ddcb51cc6f8b0410585f9dec0926330dfaf9c426aca57a65868383604051610be793929190613de5565b60405180910390a1505050505050565b5f546001600160a01b0316331480610c1957506015546001600160a01b031633145b610c355760405162461bcd60e51b815260040161092b90613d93565b8260070b5f03610c875760405162461bcd60e51b815260206004820152601c60248201527f54656c656772616d204944206d757374206265206e6f6e2d7a65726f00000000604482015260640161092b565b5f815111610ce55760405162461bcd60e51b815260206004820152602560248201527f4174206c65617374206f6e652077696e6e6572206d75737420626520737065636044820152641a599a595960da1b606482015260840161092b565b602354610d295760405162461bcd60e51b81526020600482015260126024820152714e6f2067616d657320617661696c61626c6560701b604482015260640161092b565b5f610d348484612e2f565b90505f60238281548110610d4a57610d4a613db9565b905f5260205f2090600602019050610d628184612eff565b60048101545f610d73606483613e0f565b90505f6064610d83846001613d7c565b610d8d9190613e0f565b90505f6064610d9d856003613d7c565b610da79190613e0f565b61dead5f90815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d80549293508592909190610de9908490613e2e565b909155505073395cb433e3efadf92f596a4f6f85f90a32ad07185f90815260016020527f53197f57903862f3965760cda71fe713c5ff8e73add44a27b90d054689a1be988054849290610e3d908490613e2e565b90915550610e4c905081612ffd565b5f8183610e598688613e41565b610e639190613e41565b610e6d9190613e41565b90505f885182610e7d9190613e0f565b90505f5b895181101561103d578160015f8c8481518110610ea057610ea0613db9565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f828254610ed59190613e2e565b92505081905550602260405180608001604052808c8481518110610efb57610efb613db9565b60200260200101516001600160a01b031681526020018481526020018d81526020018e60070b815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201556060820151816003015f6101000a8154816001600160401b03021916908360070b6001600160401b031602179055505050898181518110610fcb57610fcb613db9565b60200260200101516001600160a01b03167f480adbe5bc6105a153dc7afbd4be8e84cff423a156224013fa5e38ae17829247838d8f60405161102393929190928352602083019190915260070b604082015260600190565b60405180910390a28061103581613dcd565b915050610e81565b505f5b600288015481101561109b575f60185f8a600201848154811061106557611065613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020558061109381613dcd565b915050611040565b50898b60070b7f5ac84d540224b4f6345564a20a6f94b1c422486ed57a8118b714e549332311c78b898589896040516110d8959493929190613e54565b60405180910390a36110eb60205f61367b565b5050505050505050505050565b60065461010090046001600160a01b0316336001600160a01b03161461111c575f80fd5b305f90815260016020526040902054801561113a5761113a81613271565b47801561114a5761114a816133e1565b5050565b601e81815481106108d4575f80fd5b60608060606111735f546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061119c57506015546001600160a01b031633145b6111b85760405162461bcd60e51b815260040161092b90613d93565b601f545f906001600160401b038111156111d4576111d4613862565b60405190808252806020026020018201604052801561120757816020015b60608152602001906001900390816111f25790505b50601f549091505f906001600160401b0381111561122757611227613862565b604051908082528060200260200182016040528015611250578160200160208202803683370190505b5090505f5b601f548110156113a75760165f601f838154811061127557611275613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902080546112a390613e8a565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613e8a565b801561131a5780601f106112f15761010080835404028352916020019161131a565b820191905f5260205f20905b8154815290600101906020018083116112fd57829003601f168201915b505050505083828151811061133157611331613db9565b602002602001018190525060015f601f838154811061135257611352613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061138a5761138a613db9565b60209081029190910101528061139f81613dcd565b915050611255565b50601f8282828054806020026020016040519081016040528092919081815260200182805480156113ff57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113e1575b505050505092509450945094505050909192565b5f546001600160a01b0316331461143c5760405162461bcd60e51b815260040161092b90613ebc565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b031633146114ad5760405162461bcd60e51b815260040161092b90613ebc565b6114b96009600a613d6e565b6114c790633b9aca00613d7c565b600f556114d66009600a613d6e565b6114e490633b9aca00613d7c565b6010556006805460ff191690557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61151e6009600a613d6e565b61152c90633b9aca00613d7c565b60405190815260200160405180910390a1565b6060805f601e805490506001600160401b0381111561156057611560613862565b604051908082528060200260200182016040528015611589578160200160208202803683370190505b5090505f5b601e5481101561160357601d5f601e83815481106115ae576115ae613db9565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106115e6576115e6613db9565b6020908102919091010152806115fb81613dcd565b91505061158e565b50601e818180548060200260200160405190810160405280929190818152602001828054801561165a57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161163c575b5050505050915092509250509091565b6060805f601f805490506001600160401b0381111561168b5761168b613862565b6040519080825280602002602001820160405280156116b4578160200160208202803683370190505b5090505f5b601f5481101561172e5760195f601f83815481106116d9576116d9613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061171157611711613db9565b60209081029190910101528061172681613dcd565b9150506116b9565b50601f818180548060200260200160405190810160405280929190818152602001828054801561165a57602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831161163c575050505050915092509250509091565b602281815481106117a2575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919060070b84565b5f6107f43384846124d0565b335f9081526017602052604090205460ff16156118435760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520616c72656164792061757468656e746963617465642e0000604482015260640161092b565b335f90815260166020526040902061185b8282613f3e565b50335f81815260176020526040808220805460ff19166001908117909155601f805491820181559092527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d80790910180546001600160a01b03191683179055517f318b77ac8f7870eb1fc0905f3afeb8a7aedde0185b27f8f0599e557172ec321d906118e790849061378c565b60405180910390a250565b5f546001600160a01b031633148061191457506015546001600160a01b031633145b6119305760405162461bcd60e51b815260040161092b90613d93565b5f5b8351811015611b1d5760175f85838151811061195057611950613db9565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff166119cd5760405162461bcd60e51b815260206004820152602260248201527f416c6c20706c6179657273206d7573742062652061757468656e746963617465604482015261321760f11b606482015260840161092b565b8281815181106119df576119df613db9565b602002602001015160015f8684815181106119fc576119fc613db9565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20541015611a815760405162461bcd60e51b815260206004820152602660248201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f7220706044820152653630bcb2b91760d11b606482015260840161092b565b611abd848281518110611a9657611a96613db9565b6020026020010151848381518110611ab057611ab0613db9565b602002602001015161341c565b6020848281518110611ad157611ad1613db9565b60209081029190910181015182546001810184555f938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580611b1581613dcd565b915050611932565b506040805160c081018252600787900b815260208082018781529282018681526060830186905260808301859052600160a084018190526023805491820181555f5283517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42306006909202918201805467ffffffffffffffff19166001600160401b0390921691909117815594517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423182015590518051939485949093611c06937fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423201920190613699565b5060608201518051611c229160038401916020909101906136fc565b506080820151816004015560a0820151816005015f6101000a81548160ff0219169083151502179055505050848660070b7fd85d3c9c295b5c4a4b3a6bad30641d6fd15ae14802b73fc57f85cbee262a94c7868686604051611c8693929190613ff9565b60405180910390a3505050505050565b602081815481106108d4575f80fd5b5f546001600160a01b03163314611cce5760405162461bcd60e51b815260040161092b90613ebc565b601454600160a01b900460ff1615611d285760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161092b565b601380546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611d71903090611d636009600a613d6e565b6108b690633b9aca00613d7c565b60135f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de5919061402e565b6001600160a01b031663c9c653963060135f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e68919061402e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed6919061402e565b601480546001600160a01b039283166001600160a01b03199091161790556013541663f305d7194730611f1d816001600160a01b03165f9081526001602052604090205490565b5f80611f305f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611f96573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611fbb9190614049565b505060145460135460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116915063095ea7b3906044016020604051808303815f875af1158015612010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120349190614074565b506014805462ff00ff60a01b19166201000160a01b179055565b5f546001600160a01b031633146120775760405162461bcd60e51b815260040161092b90613ebc565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60608060605f6022805490506001600160401b038111156120bc576120bc613862565b6040519080825280602002602001820160405280156120e5578160200160208202803683370190505b506022549091505f906001600160401b0381111561210557612105613862565b60405190808252806020026020018201604052801561212e578160200160208202803683370190505b506022549091505f906001600160401b0381111561214e5761214e613862565b604051908082528060200260200182016040528015612177578160200160208202803683370190505b5090505f5b60225481101561227c576022818154811061219957612199613db9565b5f91825260209091206004909102015484516001600160a01b03909116908590839081106121c9576121c9613db9565b60200260200101906001600160a01b031690816001600160a01b031681525050602281815481106121fc576121fc613db9565b905f5260205f2090600402016001015483828151811061221e5761221e613db9565b6020026020010181815250506022818154811061223d5761223d613db9565b905f5260205f2090600402016002015482828151811061225f5761225f613db9565b60209081029190910101528061227481613dcd565b91505061217c565b5091959094509092509050565b6060805f6020805490506001600160401b038111156122aa576122aa613862565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b5090505f5b60205481101561234d5760185f602083815481106122f8576122f8613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061233057612330613db9565b60209081029190910101528061234581613dcd565b9150506122d8565b50602080546040805182840281018401909152818152839183908282018282801561165a57602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831161163c575050505050915092509250509091565b6001600160a01b03831661240f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161092b565b6001600160a01b0382166124705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161092b565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166125345760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161092b565b6001600160a01b0382166125965760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161092b565b5f81116125f75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161092b565b5f80546001600160a01b0385811691161480159061262257505f546001600160a01b03848116911614155b15612be857612653606461264d600b54600e541161264257600754612646565b6009545b85906134d6565b9061355b565b60065490915060ff1615612738576013546001600160a01b0384811691161480159061268d57506014546001600160a01b03848116911614155b1561273857325f9081526005602052604090205443116127265760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a40161092b565b325f9081526005602052604090204390555b6014546001600160a01b03858116911614801561276357506013546001600160a01b03848116911614155b801561278757506001600160a01b0383165f9081526003602052604090205460ff16155b1561293157600f548211156127de5760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e00000000000000604482015260640161092b565b60105482612800856001600160a01b03165f9081526001602052604090205490565b61280a9190613e2e565b11156128585760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161092b565b600e8054905f61286783613dcd565b90915550506001600160a01b0383165f908152601b602052604090205460ff1615801561289c57506001600160a01b03831615155b1561290457601a805460018082019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0386169081179091555f908152601b60205260409020805460ff191690911790555b6001600160a01b0383165f908152601c60205260408120805484929061292b908490613e2e565b90915550505b6014546001600160a01b03848116911614801561295757506001600160a01b0384163014155b15612b4257612981606461264d600c54600e541161297757600854612646565b600a5485906134d6565b6001600160a01b0385165f908152600160205260409020549091501580156129c057506001600160a01b0384165f908152601b602052604090205460ff165b15612af5575f5b601a54811015612ac557846001600160a01b0316601a82815481106129ee576129ee613db9565b5f918252602090912001546001600160a01b031603612ab357601a8054612a1790600190613e41565b81548110612a2757612a27613db9565b5f91825260209091200154601a80546001600160a01b039092169183908110612a5257612a52613db9565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550601a805480612a8e57612a8e614093565b5f8281526020902081015f1990810180546001600160a01b0319169055019055612ac5565b80612abd81613dcd565b9150506129c7565b506001600160a01b0384165f908152601b60209081526040808320805460ff19169055601c909152812055612b42565b6001600160a01b0384165f908152601b602052604090205460ff1615612b42576001600160a01b0384165f908152601c602052604081208054849290612b3c908490613e41565b90915550505b305f90815260016020526040902054601454600160a81b900460ff16158015612b7857506014546001600160a01b038581169116145b8015612b8d5750601454600160b01b900460ff165b8015612b9a575060115481115b8015612ba95750600d54600e54115b15612be657612bcb612bc684612bc18460125461359c565b61359c565b613271565b4766b1a2bc2ec50000811115612be457612be4476133e1565b505b505b8015612c6057305f90815260016020526040902054612c0790826135b0565b305f81815260016020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c579085815260200190565b60405180910390a35b6001600160a01b0384165f90815260016020526040902054612c82908361360e565b6001600160a01b0385165f90815260016020526040902055612cc5612ca7838361360e565b6001600160a01b0385165f90815260016020526040902054906135b0565b6001600160a01b038085165f8181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612d0e858561360e565b60405190815260200160405180910390a350505050565b5f8184841115612d485760405162461bcd60e51b815260040161092b919061378c565b505f612d548486613e41565b95945050505050565b6001600160a01b0382165f90815260186020526040902054811115612dd35760405162461bcd60e51b815260206004820152602660248201527f496e73756666696369656e74206c6f636b65642062616c616e636520746f2075604482015265373637b1b59760d11b606482015260840161092b565b6001600160a01b0382165f9081526018602052604081208054839290612dfa908490613e41565b90915550506001600160a01b0382165f9081526001602052604081208054839290612e26908490613e2e565b90915550505050565b5f80805b602354811015612eb8578360238281548110612e5157612e51613db9565b905f5260205f20906006020160010154148015612e9557508460070b60238281548110612e8057612e80613db9565b5f91825260209091206006909102015460070b145b15612ea65780925060019150612eb8565b80612eb081613dcd565b915050612e33565b5080612ef85760405162461bcd60e51b815260206004820152600f60248201526e23b0b6b2903737ba103337bab7321760891b604482015260640161092b565b5092915050565b5f5b8151811015612ff8575f805b6002850154811015612f8557838381518110612f2b57612f2b613db9565b60200260200101516001600160a01b0316856002018281548110612f5157612f51613db9565b5f918252602090912001546001600160a01b031603612f735760019150612f85565b80612f7d81613dcd565b915050612f0d565b5080612fe55760405162461bcd60e51b815260206004820152602960248201527f416c6c2077696e6e657273206d75737420626520706c617965727320696e20746044820152683434b99033b0b6b29760b91b606482015260840161092b565b5080612ff081613dcd565b915050612f01565b505050565b5f5b601e5481101561305557601d5f601e838154811061301f5761301f613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040018120558061304d81613dcd565b915050612fff565b50613061601e5f61367b565b5f805b601a548110156130f45760c861307c6009600a613d6e565b61308a90633b9aca00613d7c565b6130949190613e0f565b60015f601a84815481106130aa576130aa613db9565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411156130e257816130de81613dcd565b9250505b806130ec81613dcd565b915050613064565b50801561114a575f6131068284613e0f565b90505f5b601a5481101561326b5760c86131226009600a613d6e565b61313090633b9aca00613d7c565b61313a9190613e0f565b60015f601a848154811061315057613150613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115613259578160015f601a848154811061319157613191613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906131c4908490613e2e565b9250508190555081601d5f601a84815481106131e2576131e2613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055601a8054601e91908390811061321e5761321e613db9565b5f9182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b039092169190911790555b8061326381613dcd565b91505061310a565b50505050565b6014805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f815181106132b7576132b7613db9565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561330e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613332919061402e565b8160018151811061334557613345613db9565b6001600160a01b03928316602091820292909201015260135461336b91309116846123ad565b60135460405163791ac94760e01b81526001600160a01b039091169063791ac947906133a39085905f908690309042906004016140a7565b5f604051808303815f87803b1580156133ba575f80fd5b505af11580156133cc573d5f803e3d5ffd5b50506014805460ff60a81b1916905550505050565b6006546040516101009091046001600160a01b0316906108fc8315029083905f818181858888f1935050505015801561114a573d5f803e3d5ffd5b6001600160a01b0382165f908152600160205260409020548111156134835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e742062616c616e636520746f206c6f636b2e000000604482015260640161092b565b6001600160a01b0382165f90815260016020526040812080548392906134aa908490613e41565b90915550506001600160a01b0382165f9081526018602052604081208054839290612e26908490613e2e565b5f825f036134e557505f6107f8565b5f6134f08385613d7c565b9050826134fd8583613e0f565b146135545760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161092b565b9392505050565b5f61355483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061364f565b5f8183116135aa5782613554565b50919050565b5f806135bc8385613e2e565b9050838110156135545760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161092b565b5f61355483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d25565b5f818361366f5760405162461bcd60e51b815260040161092b919061378c565b505f612d548486613e0f565b5080545f8255905f5260205f20908101906136969190613735565b50565b828054828255905f5260205f209081019282156136ec579160200282015b828111156136ec57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906136b7565b506136f8929150613735565b5090565b828054828255905f5260205f209081019282156136ec579160200282015b828111156136ec57825182559160200191906001019061371a565b5b808211156136f8575f8155600101613736565b5f81518084525f5b8181101561376d57602081850181015186830182015201613751565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6135546020830184613749565b6001600160a01b0381168114613696575f80fd5b5f80604083850312156137c3575f80fd5b82356137ce8161379e565b946020939093013593505050565b5f602082840312156137ec575f80fd5b5035919050565b5f805f60608486031215613805575f80fd5b83356138108161379e565b925060208401356138208161379e565b929592945050506040919091013590565b5f60208284031215613841575f80fd5b81356135548161379e565b8035600781900b811461385d575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561389e5761389e613862565b604052919050565b5f6001600160401b038211156138be576138be613862565b5060051b60200190565b5f82601f8301126138d7575f80fd5b813560206138ec6138e7836138a6565b613876565b82815260059290921b8401810191818101908684111561390a575f80fd5b8286015b8481101561392e5780356139218161379e565b835291830191830161390e565b509695505050505050565b5f805f6060848603121561394b575f80fd5b6139548461384c565b92506020840135915060408401356001600160401b03811115613975575f80fd5b613981868287016138c8565b9150509250925092565b5f8151808452602080850194508084015f5b838110156139c25781516001600160a01b03168752958201959082019060010161399d565b509495945050505050565b5f8151808452602080850194508084015f5b838110156139c2578151875295820195908201906001016139df565b606081525f613a0d606083018661398b565b6020838203818501528186518084528284019150828160051b8501018389015f5b83811015613a5c57601f19878403018552613a4a838351613749565b94860194925090850190600101613a2e565b50508681036040880152613a7081896139cd565b9a9950505050505050505050565b604081525f613a90604083018561398b565b8281036020840152612d5481856139cd565b5f6020808385031215613ab3575f80fd5b82356001600160401b0380821115613ac9575f80fd5b818501915085601f830112613adc575f80fd5b813581811115613aee57613aee613862565b613b00601f8201601f19168501613876565b91508082528684828501011115613b15575f80fd5b80848401858401375f90820190930192909252509392505050565b5f805f805f60a08688031215613b44575f80fd5b613b4d8661384c565b9450602080870135945060408701356001600160401b0380821115613b70575f80fd5b613b7c8a838b016138c8565b95506060890135915080821115613b91575f80fd5b508701601f81018913613ba2575f80fd5b8035613bb06138e7826138a6565b81815260059190911b8201830190838101908b831115613bce575f80fd5b928401925b82841015613bec57833582529284019290840190613bd3565b989b979a509598608001359695505050505050565b5f8060408385031215613c12575f80fd5b8235613c1d8161379e565b91506020830135613c2d8161379e565b809150509250929050565b606081525f613c4a606083018661398b565b8281036020840152613c5c81866139cd565b90508281036040840152613c7081856139cd565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115613cc857815f1904821115613cae57613cae613c7a565b80851615613cbb57918102915b93841c9390800290613c93565b509250929050565b5f82613cde575060016107f8565b81613cea57505f6107f8565b8160018114613d005760028114613d0a57613d26565b60019150506107f8565b60ff841115613d1b57613d1b613c7a565b50506001821b6107f8565b5060208310610133831016604e8410600b8410161715613d49575081810a6107f8565b613d538383613c8e565b805f1904821115613d6657613d66613c7a565b029392505050565b5f61355460ff841683613cd0565b80820281158282048414176107f8576107f8613c7a565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613dde57613dde613c7a565b5060010190565b838152606060208201525f613dfd606083018561398b565b8281036040840152613c7081856139cd565b5f82613e2957634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156107f8576107f8613c7a565b818103818111156107f8576107f8613c7a565b60a081525f613e6660a083018861398b565b90508560208301528460408301528360608301528260808301529695505050505050565b600181811c90821680613e9e57607f821691505b6020821081036135aa57634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115612ff8575f81815260208120601f850160051c81016020861015613f175750805b601f850160051c820191505b81811015613f3657828155600101613f23565b505050505050565b81516001600160401b03811115613f5757613f57613862565b613f6b81613f658454613e8a565b84613ef1565b602080601f831160018114613f9e575f8415613f875750858301515b5f19600386901b1c1916600185901b178555613f36565b5f85815260208120601f198616915b82811015613fcc57888601518255948401946001909101908401613fad565b5085821015613fe957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f61400b606083018661398b565b828103602084015261401d81866139cd565b915050826040830152949350505050565b5f6020828403121561403e575f80fd5b81516135548161379e565b5f805f6060848603121561405b575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215614084575f80fd5b81518015158114613554575f80fd5b634e487b7160e01b5f52603160045260245ffd5b85815284602082015260a060408201525f6140c560a083018661398b565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122007ee328d3bdc09a43388077aaa646ff8bb231d03af4988f76c884a7e5438d1d464736f6c63430008140033

Deployed Bytecode

0x60806040526004361061024c575f3560e01c80637f77529e11610134578063b1c4310a116100b3578063ca35e8a011610078578063ca35e8a0146106f2578063d15d415014610711578063d4d7b19a1461073f578063dd62ed3e1461076d578063ed9f83fd146107b1578063f14ea722146107d4575f80fd5b8063b1c4310a14610666578063b55f108f14610691578063bf474bed146106b0578063c876d0b9146106c5578063c9567bf9146106de575f80fd5b806395d89b41116100f957806395d89b4114610257578063a2fb1175146105bd578063a9059cbb14610609578063aa613b2914610628578063afffc1e114610647575f80fd5b80637f77529e1461053757806386a3f273146105595780638da5cb5b1461056d5780638ee12c78146105895780638f9a55c0146105a8575f80fd5b80634e663bf5116101cb57806370180bc11161019057806370180bc1146104a457806370a0823114610470578063715018a6146104cf578063751039fc146104e35780637d1db4a5146104f75780637e4fed3b1461050c575f80fd5b80634e663bf5146103fb57806351bc3c851461041a5780635a068ed41461042e5780635a9b0b891461044d5780635f51522614610470575f80fd5b806323b872dd1161021157806323b872dd1461033e5780632a11ced01461035d578063313ce5671461039457806340056505146103af5780634a5c318c146103da575f80fd5b806306fdde0314610257578063095ea7b3146102925780630faee56f146102c1578063117a5b90146102e457806318160ddd1461032a575f80fd5b3661025357005b5f80fd5b348015610262575f80fd5b506040805180820182526004815263212ba4a760e11b60208201529051610289919061378c565b60405180910390f35b34801561029d575f80fd5b506102b16102ac3660046137b2565b6107e8565b6040519015158152602001610289565b3480156102cc575f80fd5b506102d660125481565b604051908152602001610289565b3480156102ef575f80fd5b506103036102fe3660046137dc565b6107fe565b6040805160079590950b855260208501939093529183015215156060820152608001610289565b348015610335575f80fd5b506102d661083e565b348015610349575f80fd5b506102b16103583660046137f3565b61085e565b348015610368575f80fd5b5061037c6103773660046137dc565b6108c5565b6040516001600160a01b039091168152602001610289565b34801561039f575f80fd5b5060405160098152602001610289565b3480156103ba575f80fd5b506102d66103c9366004613831565b60216020525f908152604090205481565b3480156103e5575f80fd5b506103f96103f43660046137dc565b6108ed565b005b348015610406575f80fd5b506103f9610415366004613939565b610bf7565b348015610425575f80fd5b506103f96110f8565b348015610439575f80fd5b5061037c6104483660046137dc565b61114e565b348015610458575f80fd5b5061046161115d565b604051610289939291906139fb565b34801561047b575f80fd5b506102d661048a366004613831565b6001600160a01b03165f9081526001602052604090205490565b3480156104af575f80fd5b506102d66104be366004613831565b60196020525f908152604090205481565b3480156104da575f80fd5b506103f9611413565b3480156104ee575f80fd5b506103f9611484565b348015610502575f80fd5b506102d6600f5481565b348015610517575f80fd5b506102d6610526366004613831565b601c6020525f908152604090205481565b348015610542575f80fd5b5061054b61153f565b604051610289929190613a7e565b348015610564575f80fd5b5061054b61166a565b348015610578575f80fd5b505f546001600160a01b031661037c565b348015610594575f80fd5b5060155461037c906001600160a01b031681565b3480156105b3575f80fd5b506102d660105481565b3480156105c8575f80fd5b506105dc6105d73660046137dc565b611793565b604080516001600160a01b03909516855260208501939093529183015260070b6060820152608001610289565b348015610614575f80fd5b506102b16106233660046137b2565b6117d8565b348015610633575f80fd5b506103f9610642366004613aa2565b6117e4565b348015610652575f80fd5b506103f9610661366004613b30565b6118f2565b348015610671575f80fd5b506102d6610680366004613831565b601d6020525f908152604090205481565b34801561069c575f80fd5b5061037c6106ab3660046137dc565b611c96565b3480156106bb575f80fd5b506102d660115481565b3480156106d0575f80fd5b506006546102b19060ff1681565b3480156106e9575f80fd5b506103f9611ca5565b3480156106fd575f80fd5b506103f961070c366004613831565b61204e565b34801561071c575f80fd5b506102b161072b366004613831565b60176020525f908152604090205460ff1681565b34801561074a575f80fd5b506102b1610759366004613831565b601b6020525f908152604090205460ff1681565b348015610778575f80fd5b506102d6610787366004613c01565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b3480156107bc575f80fd5b506107c5612099565b60405161028993929190613c38565b3480156107df575f80fd5b5061054b612289565b5f6107f43384846123ad565b5060015b92915050565b6023818154811061080d575f80fd5b5f918252602090912060069091020180546001820154600483015460059093015460079290920b9350919060ff1684565b5f61084b6009600a613d6e565b61085990633b9aca00613d7c565b905090565b5f61086a8484846124d0565b6108bb84336108b6856040518060600160405280602881526020016140e3602891396001600160a01b038a165f9081526002602090815260408083203384529091529020549190612d25565b6123ad565b5060019392505050565b601a81815481106108d4575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b031633148061090f57506015546001600160a01b031633145b6109345760405162461bcd60e51b815260040161092b90613d93565b60405180910390fd5b5f805f5b6023548110156109bb57836023828154811061095657610956613db9565b905f5260205f2090600602016001015414801561099857506023818154811061098157610981613db9565b5f91825260209091206005600690920201015460ff165b156109a957809250600191506109bb565b806109b381613dcd565b915050610938565b5080610a155760405162461bcd60e51b8152602060048201526024808201527f47616d65206e6f7420666f756e64206f7220616c72656164792066696e616c696044820152633d32b21760e11b606482015260840161092b565b5f60238381548110610a2957610a29613db9565b905f5260205f20906006020190505f81600201805490506001600160401b03811115610a5757610a57613862565b604051908082528060200260200182016040528015610a80578160200160208202803683370190505b5060028301549091505f906001600160401b03811115610aa257610aa2613862565b604051908082528060200260200182016040528015610acb578160200160208202803683370190505b5090505f5b6002840154811015610b9c575f846002018281548110610af257610af2613db9565b5f9182526020822001546003870180546001600160a01b0390921693509084908110610b2057610b20613db9565b905f5260205f2001549050610b358282612d5d565b81858481518110610b4857610b48613db9565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610b7b57610b7b613db9565b60200260200101818152505050508080610b9490613dcd565b915050610ad0565b5060058301805460ff19169055610bb460205f61367b565b7f08aeb377ada4c610ddcb51cc6f8b0410585f9dec0926330dfaf9c426aca57a65868383604051610be793929190613de5565b60405180910390a1505050505050565b5f546001600160a01b0316331480610c1957506015546001600160a01b031633145b610c355760405162461bcd60e51b815260040161092b90613d93565b8260070b5f03610c875760405162461bcd60e51b815260206004820152601c60248201527f54656c656772616d204944206d757374206265206e6f6e2d7a65726f00000000604482015260640161092b565b5f815111610ce55760405162461bcd60e51b815260206004820152602560248201527f4174206c65617374206f6e652077696e6e6572206d75737420626520737065636044820152641a599a595960da1b606482015260840161092b565b602354610d295760405162461bcd60e51b81526020600482015260126024820152714e6f2067616d657320617661696c61626c6560701b604482015260640161092b565b5f610d348484612e2f565b90505f60238281548110610d4a57610d4a613db9565b905f5260205f2090600602019050610d628184612eff565b60048101545f610d73606483613e0f565b90505f6064610d83846001613d7c565b610d8d9190613e0f565b90505f6064610d9d856003613d7c565b610da79190613e0f565b61dead5f90815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d80549293508592909190610de9908490613e2e565b909155505073395cb433e3efadf92f596a4f6f85f90a32ad07185f90815260016020527f53197f57903862f3965760cda71fe713c5ff8e73add44a27b90d054689a1be988054849290610e3d908490613e2e565b90915550610e4c905081612ffd565b5f8183610e598688613e41565b610e639190613e41565b610e6d9190613e41565b90505f885182610e7d9190613e0f565b90505f5b895181101561103d578160015f8c8481518110610ea057610ea0613db9565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f828254610ed59190613e2e565b92505081905550602260405180608001604052808c8481518110610efb57610efb613db9565b60200260200101516001600160a01b031681526020018481526020018d81526020018e60070b815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010155604082015181600201556060820151816003015f6101000a8154816001600160401b03021916908360070b6001600160401b031602179055505050898181518110610fcb57610fcb613db9565b60200260200101516001600160a01b03167f480adbe5bc6105a153dc7afbd4be8e84cff423a156224013fa5e38ae17829247838d8f60405161102393929190928352602083019190915260070b604082015260600190565b60405180910390a28061103581613dcd565b915050610e81565b505f5b600288015481101561109b575f60185f8a600201848154811061106557611065613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020558061109381613dcd565b915050611040565b50898b60070b7f5ac84d540224b4f6345564a20a6f94b1c422486ed57a8118b714e549332311c78b898589896040516110d8959493929190613e54565b60405180910390a36110eb60205f61367b565b5050505050505050505050565b60065461010090046001600160a01b0316336001600160a01b03161461111c575f80fd5b305f90815260016020526040902054801561113a5761113a81613271565b47801561114a5761114a816133e1565b5050565b601e81815481106108d4575f80fd5b60608060606111735f546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061119c57506015546001600160a01b031633145b6111b85760405162461bcd60e51b815260040161092b90613d93565b601f545f906001600160401b038111156111d4576111d4613862565b60405190808252806020026020018201604052801561120757816020015b60608152602001906001900390816111f25790505b50601f549091505f906001600160401b0381111561122757611227613862565b604051908082528060200260200182016040528015611250578160200160208202803683370190505b5090505f5b601f548110156113a75760165f601f838154811061127557611275613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902080546112a390613e8a565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613e8a565b801561131a5780601f106112f15761010080835404028352916020019161131a565b820191905f5260205f20905b8154815290600101906020018083116112fd57829003601f168201915b505050505083828151811061133157611331613db9565b602002602001018190525060015f601f838154811061135257611352613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061138a5761138a613db9565b60209081029190910101528061139f81613dcd565b915050611255565b50601f8282828054806020026020016040519081016040528092919081815260200182805480156113ff57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116113e1575b505050505092509450945094505050909192565b5f546001600160a01b0316331461143c5760405162461bcd60e51b815260040161092b90613ebc565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b031633146114ad5760405162461bcd60e51b815260040161092b90613ebc565b6114b96009600a613d6e565b6114c790633b9aca00613d7c565b600f556114d66009600a613d6e565b6114e490633b9aca00613d7c565b6010556006805460ff191690557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61151e6009600a613d6e565b61152c90633b9aca00613d7c565b60405190815260200160405180910390a1565b6060805f601e805490506001600160401b0381111561156057611560613862565b604051908082528060200260200182016040528015611589578160200160208202803683370190505b5090505f5b601e5481101561160357601d5f601e83815481106115ae576115ae613db9565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106115e6576115e6613db9565b6020908102919091010152806115fb81613dcd565b91505061158e565b50601e818180548060200260200160405190810160405280929190818152602001828054801561165a57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161163c575b5050505050915092509250509091565b6060805f601f805490506001600160401b0381111561168b5761168b613862565b6040519080825280602002602001820160405280156116b4578160200160208202803683370190505b5090505f5b601f5481101561172e5760195f601f83815481106116d9576116d9613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061171157611711613db9565b60209081029190910101528061172681613dcd565b9150506116b9565b50601f818180548060200260200160405190810160405280929190818152602001828054801561165a57602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831161163c575050505050915092509250509091565b602281815481106117a2575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919060070b84565b5f6107f43384846124d0565b335f9081526017602052604090205460ff16156118435760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520616c72656164792061757468656e746963617465642e0000604482015260640161092b565b335f90815260166020526040902061185b8282613f3e565b50335f81815260176020526040808220805460ff19166001908117909155601f805491820181559092527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d80790910180546001600160a01b03191683179055517f318b77ac8f7870eb1fc0905f3afeb8a7aedde0185b27f8f0599e557172ec321d906118e790849061378c565b60405180910390a250565b5f546001600160a01b031633148061191457506015546001600160a01b031633145b6119305760405162461bcd60e51b815260040161092b90613d93565b5f5b8351811015611b1d5760175f85838151811061195057611950613db9565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff166119cd5760405162461bcd60e51b815260206004820152602260248201527f416c6c20706c6179657273206d7573742062652061757468656e746963617465604482015261321760f11b606482015260840161092b565b8281815181106119df576119df613db9565b602002602001015160015f8684815181106119fc576119fc613db9565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20541015611a815760405162461bcd60e51b815260206004820152602660248201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f7220706044820152653630bcb2b91760d11b606482015260840161092b565b611abd848281518110611a9657611a96613db9565b6020026020010151848381518110611ab057611ab0613db9565b602002602001015161341c565b6020848281518110611ad157611ad1613db9565b60209081029190910181015182546001810184555f938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580611b1581613dcd565b915050611932565b506040805160c081018252600787900b815260208082018781529282018681526060830186905260808301859052600160a084018190526023805491820181555f5283517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42306006909202918201805467ffffffffffffffff19166001600160401b0390921691909117815594517fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423182015590518051939485949093611c06937fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f423201920190613699565b5060608201518051611c229160038401916020909101906136fc565b506080820151816004015560a0820151816005015f6101000a81548160ff0219169083151502179055505050848660070b7fd85d3c9c295b5c4a4b3a6bad30641d6fd15ae14802b73fc57f85cbee262a94c7868686604051611c8693929190613ff9565b60405180910390a3505050505050565b602081815481106108d4575f80fd5b5f546001600160a01b03163314611cce5760405162461bcd60e51b815260040161092b90613ebc565b601454600160a01b900460ff1615611d285760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161092b565b601380546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611d71903090611d636009600a613d6e565b6108b690633b9aca00613d7c565b60135f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de5919061402e565b6001600160a01b031663c9c653963060135f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e68919061402e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed6919061402e565b601480546001600160a01b039283166001600160a01b03199091161790556013541663f305d7194730611f1d816001600160a01b03165f9081526001602052604090205490565b5f80611f305f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611f96573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611fbb9190614049565b505060145460135460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116915063095ea7b3906044016020604051808303815f875af1158015612010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120349190614074565b506014805462ff00ff60a01b19166201000160a01b179055565b5f546001600160a01b031633146120775760405162461bcd60e51b815260040161092b90613ebc565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60608060605f6022805490506001600160401b038111156120bc576120bc613862565b6040519080825280602002602001820160405280156120e5578160200160208202803683370190505b506022549091505f906001600160401b0381111561210557612105613862565b60405190808252806020026020018201604052801561212e578160200160208202803683370190505b506022549091505f906001600160401b0381111561214e5761214e613862565b604051908082528060200260200182016040528015612177578160200160208202803683370190505b5090505f5b60225481101561227c576022818154811061219957612199613db9565b5f91825260209091206004909102015484516001600160a01b03909116908590839081106121c9576121c9613db9565b60200260200101906001600160a01b031690816001600160a01b031681525050602281815481106121fc576121fc613db9565b905f5260205f2090600402016001015483828151811061221e5761221e613db9565b6020026020010181815250506022818154811061223d5761223d613db9565b905f5260205f2090600402016002015482828151811061225f5761225f613db9565b60209081029190910101528061227481613dcd565b91505061217c565b5091959094509092509050565b6060805f6020805490506001600160401b038111156122aa576122aa613862565b6040519080825280602002602001820160405280156122d3578160200160208202803683370190505b5090505f5b60205481101561234d5760185f602083815481106122f8576122f8613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061233057612330613db9565b60209081029190910101528061234581613dcd565b9150506122d8565b50602080546040805182840281018401909152818152839183908282018282801561165a57602002820191905f5260205f209081546001600160a01b0316815260019091019060200180831161163c575050505050915092509250509091565b6001600160a01b03831661240f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161092b565b6001600160a01b0382166124705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161092b565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166125345760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161092b565b6001600160a01b0382166125965760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161092b565b5f81116125f75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161092b565b5f80546001600160a01b0385811691161480159061262257505f546001600160a01b03848116911614155b15612be857612653606461264d600b54600e541161264257600754612646565b6009545b85906134d6565b9061355b565b60065490915060ff1615612738576013546001600160a01b0384811691161480159061268d57506014546001600160a01b03848116911614155b1561273857325f9081526005602052604090205443116127265760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a40161092b565b325f9081526005602052604090204390555b6014546001600160a01b03858116911614801561276357506013546001600160a01b03848116911614155b801561278757506001600160a01b0383165f9081526003602052604090205460ff16155b1561293157600f548211156127de5760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e00000000000000604482015260640161092b565b60105482612800856001600160a01b03165f9081526001602052604090205490565b61280a9190613e2e565b11156128585760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e000000000000604482015260640161092b565b600e8054905f61286783613dcd565b90915550506001600160a01b0383165f908152601b602052604090205460ff1615801561289c57506001600160a01b03831615155b1561290457601a805460018082019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0386169081179091555f908152601b60205260409020805460ff191690911790555b6001600160a01b0383165f908152601c60205260408120805484929061292b908490613e2e565b90915550505b6014546001600160a01b03848116911614801561295757506001600160a01b0384163014155b15612b4257612981606461264d600c54600e541161297757600854612646565b600a5485906134d6565b6001600160a01b0385165f908152600160205260409020549091501580156129c057506001600160a01b0384165f908152601b602052604090205460ff165b15612af5575f5b601a54811015612ac557846001600160a01b0316601a82815481106129ee576129ee613db9565b5f918252602090912001546001600160a01b031603612ab357601a8054612a1790600190613e41565b81548110612a2757612a27613db9565b5f91825260209091200154601a80546001600160a01b039092169183908110612a5257612a52613db9565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550601a805480612a8e57612a8e614093565b5f8281526020902081015f1990810180546001600160a01b0319169055019055612ac5565b80612abd81613dcd565b9150506129c7565b506001600160a01b0384165f908152601b60209081526040808320805460ff19169055601c909152812055612b42565b6001600160a01b0384165f908152601b602052604090205460ff1615612b42576001600160a01b0384165f908152601c602052604081208054849290612b3c908490613e41565b90915550505b305f90815260016020526040902054601454600160a81b900460ff16158015612b7857506014546001600160a01b038581169116145b8015612b8d5750601454600160b01b900460ff165b8015612b9a575060115481115b8015612ba95750600d54600e54115b15612be657612bcb612bc684612bc18460125461359c565b61359c565b613271565b4766b1a2bc2ec50000811115612be457612be4476133e1565b505b505b8015612c6057305f90815260016020526040902054612c0790826135b0565b305f81815260016020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c579085815260200190565b60405180910390a35b6001600160a01b0384165f90815260016020526040902054612c82908361360e565b6001600160a01b0385165f90815260016020526040902055612cc5612ca7838361360e565b6001600160a01b0385165f90815260016020526040902054906135b0565b6001600160a01b038085165f8181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612d0e858561360e565b60405190815260200160405180910390a350505050565b5f8184841115612d485760405162461bcd60e51b815260040161092b919061378c565b505f612d548486613e41565b95945050505050565b6001600160a01b0382165f90815260186020526040902054811115612dd35760405162461bcd60e51b815260206004820152602660248201527f496e73756666696369656e74206c6f636b65642062616c616e636520746f2075604482015265373637b1b59760d11b606482015260840161092b565b6001600160a01b0382165f9081526018602052604081208054839290612dfa908490613e41565b90915550506001600160a01b0382165f9081526001602052604081208054839290612e26908490613e2e565b90915550505050565b5f80805b602354811015612eb8578360238281548110612e5157612e51613db9565b905f5260205f20906006020160010154148015612e9557508460070b60238281548110612e8057612e80613db9565b5f91825260209091206006909102015460070b145b15612ea65780925060019150612eb8565b80612eb081613dcd565b915050612e33565b5080612ef85760405162461bcd60e51b815260206004820152600f60248201526e23b0b6b2903737ba103337bab7321760891b604482015260640161092b565b5092915050565b5f5b8151811015612ff8575f805b6002850154811015612f8557838381518110612f2b57612f2b613db9565b60200260200101516001600160a01b0316856002018281548110612f5157612f51613db9565b5f918252602090912001546001600160a01b031603612f735760019150612f85565b80612f7d81613dcd565b915050612f0d565b5080612fe55760405162461bcd60e51b815260206004820152602960248201527f416c6c2077696e6e657273206d75737420626520706c617965727320696e20746044820152683434b99033b0b6b29760b91b606482015260840161092b565b5080612ff081613dcd565b915050612f01565b505050565b5f5b601e5481101561305557601d5f601e838154811061301f5761301f613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040018120558061304d81613dcd565b915050612fff565b50613061601e5f61367b565b5f805b601a548110156130f45760c861307c6009600a613d6e565b61308a90633b9aca00613d7c565b6130949190613e0f565b60015f601a84815481106130aa576130aa613db9565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411156130e257816130de81613dcd565b9250505b806130ec81613dcd565b915050613064565b50801561114a575f6131068284613e0f565b90505f5b601a5481101561326b5760c86131226009600a613d6e565b61313090633b9aca00613d7c565b61313a9190613e0f565b60015f601a848154811061315057613150613db9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115613259578160015f601a848154811061319157613191613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906131c4908490613e2e565b9250508190555081601d5f601a84815481106131e2576131e2613db9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055601a8054601e91908390811061321e5761321e613db9565b5f9182526020808320909101548354600181018555938352912090910180546001600160a01b0319166001600160a01b039092169190911790555b8061326381613dcd565b91505061310a565b50505050565b6014805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f815181106132b7576132b7613db9565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561330e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613332919061402e565b8160018151811061334557613345613db9565b6001600160a01b03928316602091820292909201015260135461336b91309116846123ad565b60135460405163791ac94760e01b81526001600160a01b039091169063791ac947906133a39085905f908690309042906004016140a7565b5f604051808303815f87803b1580156133ba575f80fd5b505af11580156133cc573d5f803e3d5ffd5b50506014805460ff60a81b1916905550505050565b6006546040516101009091046001600160a01b0316906108fc8315029083905f818181858888f1935050505015801561114a573d5f803e3d5ffd5b6001600160a01b0382165f908152600160205260409020548111156134835760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e742062616c616e636520746f206c6f636b2e000000604482015260640161092b565b6001600160a01b0382165f90815260016020526040812080548392906134aa908490613e41565b90915550506001600160a01b0382165f9081526018602052604081208054839290612e26908490613e2e565b5f825f036134e557505f6107f8565b5f6134f08385613d7c565b9050826134fd8583613e0f565b146135545760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161092b565b9392505050565b5f61355483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061364f565b5f8183116135aa5782613554565b50919050565b5f806135bc8385613e2e565b9050838110156135545760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161092b565b5f61355483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612d25565b5f818361366f5760405162461bcd60e51b815260040161092b919061378c565b505f612d548486613e0f565b5080545f8255905f5260205f20908101906136969190613735565b50565b828054828255905f5260205f209081019282156136ec579160200282015b828111156136ec57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906136b7565b506136f8929150613735565b5090565b828054828255905f5260205f209081019282156136ec579160200282015b828111156136ec57825182559160200191906001019061371a565b5b808211156136f8575f8155600101613736565b5f81518084525f5b8181101561376d57602081850181015186830182015201613751565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6135546020830184613749565b6001600160a01b0381168114613696575f80fd5b5f80604083850312156137c3575f80fd5b82356137ce8161379e565b946020939093013593505050565b5f602082840312156137ec575f80fd5b5035919050565b5f805f60608486031215613805575f80fd5b83356138108161379e565b925060208401356138208161379e565b929592945050506040919091013590565b5f60208284031215613841575f80fd5b81356135548161379e565b8035600781900b811461385d575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561389e5761389e613862565b604052919050565b5f6001600160401b038211156138be576138be613862565b5060051b60200190565b5f82601f8301126138d7575f80fd5b813560206138ec6138e7836138a6565b613876565b82815260059290921b8401810191818101908684111561390a575f80fd5b8286015b8481101561392e5780356139218161379e565b835291830191830161390e565b509695505050505050565b5f805f6060848603121561394b575f80fd5b6139548461384c565b92506020840135915060408401356001600160401b03811115613975575f80fd5b613981868287016138c8565b9150509250925092565b5f8151808452602080850194508084015f5b838110156139c25781516001600160a01b03168752958201959082019060010161399d565b509495945050505050565b5f8151808452602080850194508084015f5b838110156139c2578151875295820195908201906001016139df565b606081525f613a0d606083018661398b565b6020838203818501528186518084528284019150828160051b8501018389015f5b83811015613a5c57601f19878403018552613a4a838351613749565b94860194925090850190600101613a2e565b50508681036040880152613a7081896139cd565b9a9950505050505050505050565b604081525f613a90604083018561398b565b8281036020840152612d5481856139cd565b5f6020808385031215613ab3575f80fd5b82356001600160401b0380821115613ac9575f80fd5b818501915085601f830112613adc575f80fd5b813581811115613aee57613aee613862565b613b00601f8201601f19168501613876565b91508082528684828501011115613b15575f80fd5b80848401858401375f90820190930192909252509392505050565b5f805f805f60a08688031215613b44575f80fd5b613b4d8661384c565b9450602080870135945060408701356001600160401b0380821115613b70575f80fd5b613b7c8a838b016138c8565b95506060890135915080821115613b91575f80fd5b508701601f81018913613ba2575f80fd5b8035613bb06138e7826138a6565b81815260059190911b8201830190838101908b831115613bce575f80fd5b928401925b82841015613bec57833582529284019290840190613bd3565b989b979a509598608001359695505050505050565b5f8060408385031215613c12575f80fd5b8235613c1d8161379e565b91506020830135613c2d8161379e565b809150509250929050565b606081525f613c4a606083018661398b565b8281036020840152613c5c81866139cd565b90508281036040840152613c7081856139cd565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115613cc857815f1904821115613cae57613cae613c7a565b80851615613cbb57918102915b93841c9390800290613c93565b509250929050565b5f82613cde575060016107f8565b81613cea57505f6107f8565b8160018114613d005760028114613d0a57613d26565b60019150506107f8565b60ff841115613d1b57613d1b613c7a565b50506001821b6107f8565b5060208310610133831016604e8410600b8410161715613d49575081810a6107f8565b613d538383613c8e565b805f1904821115613d6657613d66613c7a565b029392505050565b5f61355460ff841683613cd0565b80820281158282048414176107f8576107f8613c7a565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613dde57613dde613c7a565b5060010190565b838152606060208201525f613dfd606083018561398b565b8281036040840152613c7081856139cd565b5f82613e2957634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156107f8576107f8613c7a565b818103818111156107f8576107f8613c7a565b60a081525f613e6660a083018861398b565b90508560208301528460408301528360608301528260808301529695505050505050565b600181811c90821680613e9e57607f821691505b6020821081036135aa57634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115612ff8575f81815260208120601f850160051c81016020861015613f175750805b601f850160051c820191505b81811015613f3657828155600101613f23565b505050505050565b81516001600160401b03811115613f5757613f57613862565b613f6b81613f658454613e8a565b84613ef1565b602080601f831160018114613f9e575f8415613f875750858301515b5f19600386901b1c1916600185901b178555613f36565b5f85815260208120601f198616915b82811015613fcc57888601518255948401946001909101908401613fad565b5085821015613fe957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f61400b606083018661398b565b828103602084015261401d81866139cd565b915050826040830152949350505050565b5f6020828403121561403e575f80fd5b81516135548161379e565b5f805f6060848603121561405b575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215614084575f80fd5b81518015158114613554575f80fd5b634e487b7160e01b5f52603160045260245ffd5b85815284602082015260a060408201525f6140c560a083018661398b565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122007ee328d3bdc09a43388077aaa646ff8bb231d03af4988f76c884a7e5438d1d464736f6c63430008140033

Deployed Bytecode Sourcemap

4233:22689:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8409:83;;;;;;;;;;-1:-1:-1;8479:5:0;;;;;;;;;;;-1:-1:-1;;;8479:5:0;;;;8409:83;;;;8479:5;8409:83;:::i;:::-;;;;;;;;9246:161;;;;;;;;;;-1:-1:-1;9246:161:0;;;;;:::i;:::-;;:::i;:::-;;;1288:14:1;;1281:22;1263:41;;1251:2;1236:18;9246:161:0;1123:187:1;5422:52:0;;;;;;;;;;;;;;;;;;;1461:25:1;;;1449:2;1434:18;5422:52:0;1315:177:1;6965:19:0;;;;;;;;;;-1:-1:-1;6965:19:0;;;;;:::i;:::-;;:::i;:::-;;;;1932:1:1;1921:21;;;;1903:40;;1974:2;1959:18;;1952:34;;;;2002:18;;;1995:34;2072:14;2065:22;2060:2;2045:18;;2038:50;1890:3;1875:19;6965::0;1682:412:1;8686:100:0;;;;;;;;;;;;;:::i;9415:313::-;;;;;;;;;;-1:-1:-1;9415:313:0;;;;;:::i;:::-;;:::i;6572:24::-;;;;;;;;;;-1:-1:-1;6572:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2724:32:1;;;2706:51;;2694:2;2679:18;6572:24:0;2560:203:1;8595:83:0;;;;;;;;;;-1:-1:-1;8595:83:0;;5061:1;2910:36:1;;2898:2;2883:18;8595:83:0;2768:184:1;6880:46:0;;;;;;;;;;-1:-1:-1;6880:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;18887:1593;;;;;;;;;;-1:-1:-1;18887:1593:0;;;;;:::i;:::-;;:::i;:::-;;21737:1913;;;;;;;;;;-1:-1:-1;21737:1913:0;;;;;:::i;:::-;;:::i;14931:348::-;;;;;;;;;;;;;:::i;6765:36::-;;;;;;;;;;-1:-1:-1;6765:36:0;;;;;:::i;:::-;;:::i;17413:569::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;17260:145::-;;;;;;;;;;-1:-1:-1;17260:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;17345:15:0;17318:7;17345:15;;;:8;:15;;;;;;;17260:145;6353:46;;;;;;;;;;-1:-1:-1;6353:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;3316:148;;;;;;;;;;;;;:::i;13889:211::-;;;;;;;;;;;;;:::i;5234:53::-;;;;;;;;;;;;;;;;6650:49;;;;;;;;;;-1:-1:-1;6650:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;20528:371;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;16584:337::-;;;;;;;;;;;;;:::i;3102:79::-;;;;;;;;;;-1:-1:-1;3140:7:0;3167:6;-1:-1:-1;;;;;3167:6:0;3102:79;;5822:32;;;;;;;;;;-1:-1:-1;5822:32:0;;;;-1:-1:-1;;;;;5822:32:0;;;5294:56;;;;;;;;;;;;;;;;6935:23;;;;;;;;;;-1:-1:-1;6935:23:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7977:32:1;;;7959:51;;8041:2;8026:18;;8019:34;;;;8069:18;;;8062:34;8143:1;8132:21;8127:2;8112:18;;8105:49;7946:3;7931:19;6935:23:0;7732:428:1;8920:167:0;;;;;;;;;;-1:-1:-1;8920:167:0;;;;;:::i;:::-;;:::i;16929:323::-;;;;;;;;;;-1:-1:-1;16929:323:0;;;;;:::i;:::-;;:::i;17992:836::-;;;;;;;;;;-1:-1:-1;17992:836:0;;;;;:::i;:::-;;:::i;6706:52::-;;;;;;;;;;-1:-1:-1;6706:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;6843:30;;;;;;;;;;-1:-1:-1;6843:30:0;;;;;:::i;:::-;;:::i;5357:58::-;;;;;;;;;;;;;;;;4618:39;;;;;;;;;;-1:-1:-1;4618:39:0;;;;;;;;14210:676;;;;;;;;;;;;;:::i;5863:130::-;;;;;;;;;;-1:-1:-1;5863:130:0;;;;;:::i;:::-;;:::i;6241:47::-;;;;;;;;;;-1:-1:-1;6241:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;6603:40;;;;;;;;;;-1:-1:-1;6603:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9095:143;;;;;;;;;;-1:-1:-1;9095:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;9203:18:0;;;9176:7;9203:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9095:143;20929:755;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;16234:342::-;;;;;;;;;;;;;:::i;9246:161::-;9321:4;9338:39;937:10;9361:7;9370:6;9338:8;:39::i;:::-;-1:-1:-1;9395:4:0;9246:161;;;;;:::o;6965:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6965:19:0;;;;;:::o;8686:100::-;8739:7;5122:13;5061:1;5122:2;:13;:::i;:::-;5109:26;;:10;:26;:::i;:::-;8759:19;;8686:100;:::o;9415:313::-;9513:4;9530:36;9540:6;9548:9;9559:6;9530:9;:36::i;:::-;9577:121;9586:6;937:10;9608:89;9646:6;9608:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9608:19:0;;;;;;:11;:19;;;;;;;;937:10;9608:33;;;;;;;;;;:37;:89::i;:::-;9577:8;:121::i;:::-;-1:-1:-1;9716:4:0;9415:313;;;;;:::o;6572:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6572:24:0;;-1:-1:-1;6572:24:0;:::o;18887:1593::-;3140:7;3167:6;-1:-1:-1;;;;;3167:6:0;18958:10;:21;;:56;;-1:-1:-1;18997:17:0;;-1:-1:-1;;;;;18997:17:0;18983:10;:31;18958:56;18950:81;;;;-1:-1:-1;;;18950:81:0;;;;;;;:::i;:::-;;;;;;;;;19079:17;19111:14;19148:6;19144:224;19164:5;:12;19160:16;;19144:224;;;19220:7;19201:5;19207:1;19201:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;:26;:47;;;;;19231:5;19237:1;19231:8;;;;;;;;:::i;:::-;;;;;;;;;:17;:8;;;;;:17;;;;19201:47;19198:159;;;19281:1;19269:13;;19313:4;19301:16;;19336:5;;19198:159;19178:3;;;;:::i;:::-;;;;19144:224;;;;19388:9;19380:58;;;;-1:-1:-1;;;19380:58:0;;13855:2:1;19380:58:0;;;13837:21:1;13894:2;13874:18;;;13867:30;13933:34;13913:18;;;13906:62;-1:-1:-1;;;13984:18:1;;;13977:34;14028:19;;19380:58:0;13653:400:1;19380:58:0;19451:17;19471:5;19477:9;19471:16;;;;;;;;:::i;:::-;;;;;;;;;;;19451:36;;19578:32;19627:4;:12;;:19;;;;-1:-1:-1;;;;;19613:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19613:34:0;-1:-1:-1;19707:12:0;;;:19;19578:69;;-1:-1:-1;19658:32:0;;-1:-1:-1;;;;;19693:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19693:34:0;;19658:69;;19789:6;19785:385;19805:12;;;:19;19801:23;;19785:385;;;19846:14;19863:4;:12;;19876:1;19863:15;;;;;;;;:::i;:::-;;;;;;;;;;19907:9;;;:12;;-1:-1:-1;;;;;19863:15:0;;;;-1:-1:-1;19907:9:0;19917:1;;19907:12;;;;;;:::i;:::-;;;;;;;;;19893:26;;19934;19948:6;19956:3;19934:13;:26::i;:::-;20113:6;20092:15;20108:1;20092:18;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;20092:27:0;;;-1:-1:-1;;;;;20092:27:0;;;;;20155:3;20134:15;20150:1;20134:18;;;;;;;;:::i;:::-;;;;;;:24;;;;;19831:339;;19826:3;;;;;:::i;:::-;;;;19785:385;;;-1:-1:-1;20220:13:0;;;:21;;-1:-1:-1;;20220:21:0;;;20343:20;20350:13;20236:5;20343:20;:::i;:::-;20416:56;20430:7;20439:15;20456;20416:56;;;;;;;;:::i;:::-;;;;;;;;18939:1541;;;;;18887:1593;:::o;21737:1913::-;3140:7;3167:6;-1:-1:-1;;;;;3167:6:0;21849:10;:21;;:56;;-1:-1:-1;21888:17:0;;-1:-1:-1;;;;;21888:17:0;21874:10;:31;21849:56;21841:81;;;;-1:-1:-1;;;21841:81:0;;;;;;;:::i;:::-;21941:11;:16;;21956:1;21941:16;21933:57;;;;-1:-1:-1;;;21933:57:0;;14801:2:1;21933:57:0;;;14783:21:1;14840:2;14820:18;;;14813:30;14879;14859:18;;;14852:58;14927:18;;21933:57:0;14599:352:1;21933:57:0;22027:1;22009:8;:15;:19;22001:69;;;;-1:-1:-1;;;22001:69:0;;15158:2:1;22001:69:0;;;15140:21:1;15197:2;15177:18;;;15170:30;15236:34;15216:18;;;15209:62;-1:-1:-1;;;15287:18:1;;;15280:35;15332:19;;22001:69:0;14956:401:1;22001:69:0;22089:5;:12;22081:47;;;;-1:-1:-1;;;22081:47:0;;15564:2:1;22081:47:0;;;15546:21:1;15603:2;15583:18;;;15576:30;-1:-1:-1;;;15622:18:1;;;15615:48;15680:18;;22081:47:0;15362:342:1;22081:47:0;22141:17;22161:35;22175:11;22188:7;22161:13;:35::i;:::-;22141:55;;22207:17;22227:5;22233:9;22227:16;;;;;;;;:::i;:::-;;;;;;;;;;;22207:36;;22256:31;22272:4;22278:8;22256:15;:31::i;:::-;22327:13;;;;22308:16;22374:14;22385:3;22327:13;22374:14;:::i;:::-;22351:37;-1:-1:-1;22401:20:0;22441:3;22425:12;:8;22436:1;22425:12;:::i;:::-;22424:20;;;;:::i;:::-;22401:43;-1:-1:-1;22457:17:0;22494:3;22478:12;:8;22489:1;22478:12;:::i;:::-;22477:20;;;;:::i;:::-;6437:42;22512:21;;;;:8;:21;;;:37;;22457:40;;-1:-1:-1;22537:12:0;;22512:21;;;:37;;22537:12;;22512:37;:::i;:::-;;;;-1:-1:-1;;6517:42:0;22560:21;;;;:8;:21;;;:37;;22585:12;;22560:21;:37;;22585:12;;22560:37;:::i;:::-;;;;-1:-1:-1;22699:30:0;;-1:-1:-1;22719:9:0;22699:19;:30::i;:::-;22742:22;22808:9;22793:12;22767:23;22778:12;22767:8;:23;:::i;:::-;:38;;;;:::i;:::-;:50;;;;:::i;:::-;22742:75;;22828:22;22870:8;:15;22853:14;:32;;;;:::i;:::-;22828:57;;22959:6;22954:277;22975:8;:15;22971:1;:19;22954:277;;;23037:14;23012:8;:21;23021:8;23030:1;23021:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;23012:21:0;-1:-1:-1;;;;;23012:21:0;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;23066:7;23079:57;;;;;;;;23086:8;23095:1;23086:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;23079:57:0;;;;;23099:14;23079:57;;;;23115:7;23079:57;;;;23124:11;23079:57;;;;;23066:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23066:71:0;;;;;-1:-1:-1;;;;;23066:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23066:71:0;;;;;;;-1:-1:-1;;;;;23066:71:0;;;;;;;;23169:8;23178:1;23169:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;23157:62:0;;23182:14;23198:7;23207:11;23157:62;;;;;;;16392:25:1;;;16448:2;16433:18;;16426:34;;;;16507:1;16496:21;16491:2;16476:18;;16469:49;16380:2;16365:18;;16194:330;23157:62:0;;;;;;;;22992:3;;;;:::i;:::-;;;;22954:277;;;;23329:6;23324:109;23345:12;;;:19;23341:23;;23324:109;;;23420:1;23386:14;:31;23401:4;:12;;23414:1;23401:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;23401:15:0;23386:31;;;;;;;;;;;;:35;23366:3;;;;:::i;:::-;;;;23324:109;;;;23542:7;23529:11;23514:97;;;23551:8;23561;23571:14;23587:12;23601:9;23514:97;;;;;;;;;;:::i;:::-;;;;;;;;23622:20;23629:13;;23622:20;:::i;:::-;21830:1820;;;;;;;;21737:1913;;;:::o;14931:348::-;14995:10;;;;;-1:-1:-1;;;;;14995:10:0;937;-1:-1:-1;;;;;14981:24:0;;14973:33;;;;;;15056:4;15017:20;17345:15;;;:8;:15;;;;;;15076:14;;15073:73;;15104:30;15121:12;15104:16;:30::i;:::-;15175:21;15210:12;;15207:65;;15236:24;15249:10;15236:12;:24::i;:::-;14962:317;;14931:348::o;6765:36::-;;;;;;;;;;;;17413:569;17453:16;17471:15;17488:16;17539:7;3140;3167:6;-1:-1:-1;;;;;3167:6:0;;3102:79;17539:7;-1:-1:-1;;;;;17525:21:0;:10;-1:-1:-1;;;;;17525:21:0;;:56;;;-1:-1:-1;17564:17:0;;-1:-1:-1;;;;;17564:17:0;17550:10;:31;17525:56;17517:81;;;;-1:-1:-1;;;17517:81:0;;;;;;;:::i;:::-;17655:8;:15;17619:20;;-1:-1:-1;;;;;17642:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17720:8:0;:15;17619:52;;-1:-1:-1;17682:21:0;;-1:-1:-1;;;;;17706:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17706:30:0;;17682:54;;17754:6;17749:184;17770:8;:15;17766:19;;17749:184;;;17817:8;:21;17826:8;17835:1;17826:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;17826:11:0;17817:21;;;;;;;;;;;;17807:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;17812:1;17807:7;;;;;;;;:::i;:::-;;;;;;:31;;;;17863:8;:21;17872:8;17881:1;17872:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;17872:11:0;17863:21;;;;;;;;;;;;;17853:7;;:4;;17858:1;;17853:7;;;;;;:::i;:::-;;;;;;;;;;:31;17787:3;;;;:::i;:::-;;;;17749:184;;;;17953:8;17963:4;17969;17945:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17945:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17413:569;;;:::o;3316:148::-;3229:6;;-1:-1:-1;;;;;3229:6:0;937:10;3229:22;3221:67;;;;-1:-1:-1;;;3221:67:0;;;;;;;:::i;:::-;3423:1:::1;3407:6:::0;;3386:40:::1;::::0;-1:-1:-1;;;;;3407:6:0;;::::1;::::0;3386:40:::1;::::0;3423:1;;3386:40:::1;3454:1;3437:19:::0;;-1:-1:-1;;;;;;3437:19:0::1;::::0;;3316:148::o;13889:211::-;3229:6;;-1:-1:-1;;;;;3229:6:0;937:10;3229:22;3221:67;;;;-1:-1:-1;;;3221:67:0;;;;;;;:::i;:::-;5122:13:::1;5061:1;5122:2;:13;:::i;:::-;5109:26;::::0;:10:::1;:26;:::i;:::-;13942:12;:27:::0;5122:13:::1;5061:1;5122:2;:13;:::i;:::-;5109:26;::::0;:10:::1;:26;:::i;:::-;13980:14;:27:::0;14018:20:::1;:26:::0;;-1:-1:-1;;14018:26:0::1;::::0;;14060:32:::1;5122:13;5061:1;-1:-1:-1::0;5122:13:0::1;:::i;:::-;5109:26;::::0;:10:::1;:26;:::i;:::-;14060:32;::::0;1461:25:1;;;1449:2;1434:18;14060:32:0::1;;;;;;;13889:211::o:0;20528:371::-;20583:16;20601;20630:24;20671:19;:26;;;;-1:-1:-1;;;;;20657:41:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20657:41:0;;20630:68;;20714:6;20709:135;20730:19;:26;20726:30;;20709:135;;;20791:17;:41;20809:19;20829:1;20809:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;20809:22:0;20791:41;;;;;;;;;;;;;20778:10;;:7;;20786:1;;20778:10;;;;;;:::i;:::-;;;;;;;;;;:54;20758:3;;;;:::i;:::-;;;;20709:135;;;;20862:19;20883:7;20854:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20854:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20528:371;;:::o;16584:337::-;16644:16;16662;16691:28;16736:8;:15;;;;-1:-1:-1;;;;;16722:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16722:30:0;;16691:61;;16767:6;16763:110;16783:8;:15;16779:19;;16763:110;;;16837:11;:24;16849:8;16858:1;16849:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;16849:11:0;16837:24;;;;;;;;;;;;;16820:14;;:11;;16832:1;;16820:14;;;;;;:::i;:::-;;;;;;;;;;:41;16800:3;;;;:::i;:::-;;;;16763:110;;;;16891:8;16901:11;16883:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16883:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16584:337;;:::o;6935:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6935:23:0;;;;-1:-1:-1;6935:23:0;;;;;:::o;8920:167::-;8998:4;9015:42;937:10;9039:9;9050:6;9015:9;:42::i;16929:323::-;17020:10;17004:27;;;;:15;:27;;;;;;;;17003:28;16995:71;;;;-1:-1:-1;;;16995:71:0;;18030:2:1;16995:71:0;;;18012:21:1;18069:2;18049:18;;;18042:30;18108:32;18088:18;;;18081:60;18158:18;;16995:71:0;17828:354:1;16995:71:0;17086:10;17077:20;;;;:8;:20;;;;;:33;17100:10;17077:20;:33;:::i;:::-;-1:-1:-1;17137:10:0;17121:27;;;;:15;:27;;;;;;:34;;-1:-1:-1;;17121:34:0;17151:4;17121:34;;;;;;17166:8;:25;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17166:25:0;;;;;17207:37;;;;;17233:10;;17207:37;:::i;:::-;;;;;;;;16929:323;:::o;17992:836::-;3140:7;3167:6;-1:-1:-1;;;;;3167:6:0;18143:10;:21;;:56;;-1:-1:-1;18182:17:0;;-1:-1:-1;;;;;18182:17:0;18168:10;:31;18143:56;18135:81;;;;-1:-1:-1;;;18135:81:0;;;;;;;:::i;:::-;18231:6;18227:390;18247:8;:15;18243:1;:19;18227:390;;;18292:15;:28;18308:8;18317:1;18308:11;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;18292:28:0;;;;;;;;;;;-1:-1:-1;18292:28:0;;;;18284:75;;;;-1:-1:-1;;;18284:75:0;;20593:2:1;18284:75:0;;;20575:21:1;20632:2;20612:18;;;20605:30;20671:34;20651:18;;;20644:62;-1:-1:-1;;;20722:18:1;;;20715:32;20764:19;;18284:75:0;20391:398:1;18284:75:0;18407:5;18413:1;18407:8;;;;;;;;:::i;:::-;;;;;;;18382;:21;18391:8;18400:1;18391:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;18382:21:0;-1:-1:-1;;;;;18382:21:0;;;;;;;;;;;;;:33;;18374:84;;;;-1:-1:-1;;;18374:84:0;;20996:2:1;18374:84:0;;;20978:21:1;21035:2;21015:18;;;21008:30;21074:34;21054:18;;;21047:62;-1:-1:-1;;;21125:18:1;;;21118:36;21171:19;;18374:84:0;20794:402:1;18374:84:0;18473:34;18485:8;18494:1;18485:11;;;;;;;;:::i;:::-;;;;;;;18498:5;18504:1;18498:8;;;;;;;;:::i;:::-;;;;;;;18473:11;:34::i;:::-;18546:13;18565:8;18574:1;18565:11;;;;;;;;:::i;:::-;;;;;;;;;;;;18546:31;;;;;;;-1:-1:-1;18546:31:0;;;;;;;;;;-1:-1:-1;;;;;;18546:31:0;-1:-1:-1;;;;;18546:31:0;;;;;;;;;18264:3;;;;:::i;:::-;;;;18227:390;;;-1:-1:-1;18651:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18706:4;18651:60;;;;;;18722:5;:19;;;;;;;-1:-1:-1;18722:19:0;;;;;;;;;;;;;-1:-1:-1;;18722:19:0;-1:-1:-1;;;;;18722:19:0;;;;;;;;;;;;;;;;;;;18651:60;;;;18722:19;;;;;;;;;;:::i;:::-;-1:-1:-1;18722:19:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18784:7;18771:11;18759:61;;;18793:8;18803:5;18810:9;18759:61;;;;;;;;:::i;:::-;;;;;;;;18124:704;17992:836;;;;;:::o;6843:30::-;;;;;;;;;;;;14210:676;3229:6;;-1:-1:-1;;;;;3229:6:0;937:10;3229:22;3221:67;;;;-1:-1:-1;;;3221:67:0;;;;;;;:::i;:::-;14274:11:::1;::::0;-1:-1:-1;;;14274:11:0;::::1;;;14273:12;14265:47;;;::::0;-1:-1:-1;;;14265:47:0;;21944:2:1;14265:47:0::1;::::0;::::1;21926:21:1::0;21983:2;21963:18;;;21956:30;22022:25;22002:18;;;21995:53;22065:18;;14265:47:0::1;21742:347:1::0;14265:47:0::1;14323:15;:80:::0;;-1:-1:-1;;;;;;14323:80:0::1;14360:42;14323:80:::0;;::::1;::::0;;;14414:63:::1;::::0;14431:4:::1;::::0;5122:13:::1;5061:1;5122:2;:13;:::i;:::-;5109:26;::::0;:10:::1;:26;:::i;14414:63::-;14522:15;;;;;;;;;-1:-1:-1::0;;;;;14522:15:0::1;-1:-1:-1::0;;;;;14522:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14504:55:0::1;;14568:4;14575:15;;;;;;;;;-1:-1:-1::0;;;;;14575:15:0::1;-1:-1:-1::0;;;;;14575:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14504:94;::::0;-1:-1:-1;;;;;;14504:94:0::1;::::0;;;;;;-1:-1:-1;;;;;22580:15:1;;;14504:94:0::1;::::0;::::1;22562:34:1::0;22632:15;;22612:18;;;22605:43;22497:18;;14504:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14488:13;:110:::0;;-1:-1:-1;;;;;14488:110:0;;::::1;-1:-1:-1::0;;;;;;14488:110:0;;::::1;;::::0;;14609:15:::1;::::0;::::1;:31;14648:21;14679:4;14685:24;14679:4:::0;-1:-1:-1;;;;;17345:15:0;17318:7;17345:15;;;:8;:15;;;;;;;17260:145;14685:24:::1;14710:1;14712::::0;14714:7:::1;3140::::0;3167:6;-1:-1:-1;;;;;3167:6:0;;3102:79;14714:7:::1;14609:129;::::0;::::1;::::0;;;-1:-1:-1;;;;;;14609:129:0;;;-1:-1:-1;;;;;23018:15:1;;;14609:129:0::1;::::0;::::1;23000:34:1::0;23050:18;;;23043:34;;;;23093:18;;;23086:34;;;;23136:18;;;23129:34;23200:15;;;23179:19;;;23172:44;14722:15:0::1;23232:19:1::0;;;23225:35;22934:19;;14609:129:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;14756:13:0::1;::::0;14787:15:::1;::::0;14749:71:::1;::::0;-1:-1:-1;;;14749:71:0;;-1:-1:-1;;;;;14787:15:0;;::::1;14749:71;::::0;::::1;23756:51:1::0;-1:-1:-1;;23823:18:1;;;23816:34;14756:13:0;::::1;::::0;-1:-1:-1;14749:29:0::1;::::0;23729:18:1;;14749:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14831:11:0::1;:18:::0;;-1:-1:-1;;;;14860:18:0;-1:-1:-1;;;14860:18:0;;;14210:676::o;5863:130::-;3229:6;;-1:-1:-1;;;;;3229:6:0;937:10;3229:22;3221:67;;;;-1:-1:-1;;;3221:67:0;;;;;;;:::i;:::-;5947:17:::1;:38:::0;;-1:-1:-1;;;;;;5947:38:0::1;-1:-1:-1::0;;;;;5947:38:0;;;::::1;::::0;;;::::1;::::0;;5863:130::o;20929:755::-;20979:16;20997;21015;21095:32;21144:7;:14;;;;-1:-1:-1;;;;;21130:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21130:29:0;-1:-1:-1;21217:7:0;:14;21095:64;;-1:-1:-1;21170:30:0;;-1:-1:-1;;;;;21203:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21203:29:0;-1:-1:-1;21290:7:0;:14;21170:62;;-1:-1:-1;21243:30:0;;-1:-1:-1;;;;;21276:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21276:29:0;;21243:62;;21385:9;21380:222;21404:7;:14;21400:18;;21380:222;;;21461:7;21469:1;21461:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;21440:18;;-1:-1:-1;;;;;21461:24:0;;;;21440:15;;21456:1;;21440:18;;;;;;:::i;:::-;;;;;;:45;-1:-1:-1;;;;;21440:45:0;;;-1:-1:-1;;;;;21440:45:0;;;;;21519:7;21527:1;21519:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;21500:13;21514:1;21500:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;21573:7;21581:1;21573:10;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;21554:13;21568:1;21554:16;;;;;;;;:::i;:::-;;;;;;;;;;:36;21420:3;;;;:::i;:::-;;;;21380:222;;;-1:-1:-1;21630:15:0;;21647:13;;-1:-1:-1;21662:13:0;;-1:-1:-1;20929:755:0;-1:-1:-1;20929:755:0:o;16234:342::-;16284:16;16302;16331:25;16373:13;:20;;;;-1:-1:-1;;;;;16359:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16359:35:0;;16331:63;;16410:6;16405:121;16426:13;:20;16422:24;;16405:121;;;16482:14;:32;16497:13;16511:1;16497:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;16497:16:0;16482:32;;;;;;;;;;;;;16468:11;;:8;;16477:1;;16468:11;;;;;;:::i;:::-;;;;;;;;;;:46;16448:3;;;;:::i;:::-;;;;16405:121;;;-1:-1:-1;16544:13:0;16536:32;;;;;;;;;;;;;;;;;;16559:8;;16544:13;;16536:32;;;16544:13;16536:32;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16536:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16234:342;;:::o;9736:335::-;-1:-1:-1;;;;;9829:19:0;;9821:68;;;;-1:-1:-1;;;9821:68:0;;24345:2:1;9821:68:0;;;24327:21:1;24384:2;24364:18;;;24357:30;24423:34;24403:18;;;24396:62;-1:-1:-1;;;24474:18:1;;;24467:34;24518:19;;9821:68:0;24143:400:1;9821:68:0;-1:-1:-1;;;;;9908:21:0;;9900:68;;;;-1:-1:-1;;;9900:68:0;;24750:2:1;9900:68:0;;;24732:21:1;24789:2;24769:18;;;24762:30;24828:34;24808:18;;;24801:62;-1:-1:-1;;;24879:18:1;;;24872:32;24921:19;;9900:68:0;24548:398:1;9900:68:0;-1:-1:-1;;;;;9979:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10031:32;;1461:25:1;;;10031:32:0;;1434:18:1;10031:32:0;;;;;;;9736:335;;;:::o;10079:3201::-;-1:-1:-1;;;;;10167:18:0;;10159:68;;;;-1:-1:-1;;;10159:68:0;;25153:2:1;10159:68:0;;;25135:21:1;25192:2;25172:18;;;25165:30;25231:34;25211:18;;;25204:62;-1:-1:-1;;;25282:18:1;;;25275:35;25327:19;;10159:68:0;24951:401:1;10159:68:0;-1:-1:-1;;;;;10246:16:0;;10238:64;;;;-1:-1:-1;;;10238:64:0;;25559:2:1;10238:64:0;;;25541:21:1;25598:2;25578:18;;;25571:30;25637:34;25617:18;;;25610:62;-1:-1:-1;;;25688:18:1;;;25681:33;25731:19;;10238:64:0;25357:399:1;10238:64:0;10330:1;10321:6;:10;10313:64;;;;-1:-1:-1;;;10313:64:0;;25963:2:1;10313:64:0;;;25945:21:1;26002:2;25982:18;;;25975:30;26041:34;26021:18;;;26014:62;-1:-1:-1;;;26092:18:1;;;26085:39;26141:19;;10313:64:0;25761:405:1;10313:64:0;10390:17;3167:6;;-1:-1:-1;;;;;10428:15:0;;;3167:6;;10428:15;;;;:32;;-1:-1:-1;3140:7:0;3167:6;-1:-1:-1;;;;;10447:13:0;;;3167:6;;10447:13;;10428:32;10424:2491;;;10489:82;10567:3;10489:73;10513:15;;10501:9;;:27;10500:61;;10547:14;;10500:61;;;10532:12;;10500:61;10489:6;;:10;:73::i;:::-;:77;;:82::i;:::-;10592:20;;10477:94;;-1:-1:-1;10592:20:0;;10588:460;;;10651:15;;-1:-1:-1;;;;;10637:30:0;;;10651:15;;10637:30;;;;:62;;-1:-1:-1;10685:13:0;;-1:-1:-1;;;;;10671:28:0;;;10685:13;;10671:28;;10637:62;10633:400;;;10787:9;10758:39;;;;:28;:39;;;;;;10800:12;-1:-1:-1;10724:212:0;;;;-1:-1:-1;;;10724:212:0;;26373:2:1;10724:212:0;;;26355:21:1;26412:2;26392:18;;;26385:30;26451:34;26431:18;;;26424:62;26522:34;26502:18;;;26495:62;-1:-1:-1;;;26573:19:1;;;26566:39;26622:19;;10724:212:0;26171:476:1;10724:212:0;10988:9;10959:39;;;;:28;:39;;;;;11001:12;10959:54;;10633:400;11076:13;;-1:-1:-1;;;;;11068:21:0;;;11076:13;;11068:21;:55;;;;-1:-1:-1;11107:15:0;;-1:-1:-1;;;;;11093:30:0;;;11107:15;;11093:30;;11068:55;:82;;;;-1:-1:-1;;;;;;11128:22:0;;;;;;:18;:22;;;;;;;;11127:23;11068:82;11064:520;;;11189:12;;11179:6;:22;;11171:60;;;;-1:-1:-1;;;11171:60:0;;26854:2:1;11171:60:0;;;26836:21:1;26893:2;26873:18;;;26866:30;26932:27;26912:18;;;26905:55;26977:18;;11171:60:0;26652:349:1;11171:60:0;11284:14;;11274:6;11258:13;11268:2;-1:-1:-1;;;;;17345:15:0;17318:7;17345:15;;;:8;:15;;;;;;;17260:145;11258:13;:22;;;;:::i;:::-;:40;;11250:79;;;;-1:-1:-1;;;11250:79:0;;27208:2:1;11250:79:0;;;27190:21:1;27247:2;27227:18;;;27220:30;27286:28;27266:18;;;27259:56;27332:18;;11250:79:0;27006:350:1;11250:79:0;11348:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;;;;;;11385:12:0;;;;;;:8;:12;;;;;;;;11384:13;:33;;;;-1:-1:-1;;;;;;11401:16:0;;;;11384:33;11380:140;;;11442:7;:16;;;;;;;;;;;;;-1:-1:-1;;;;;;11442:16:0;-1:-1:-1;;;;;11442:16:0;;;;;;;;-1:-1:-1;11481:12:0;;;:8;11442:16;11481:12;;;;:19;;-1:-1:-1;;11481:19:0;;;;;;11380:140;-1:-1:-1;;;;;11540:18:0;;;;;;:14;:18;;;;;:28;;11562:6;;11540:18;:28;;11562:6;;11540:28;:::i;:::-;;;;-1:-1:-1;;11064:520:0;11610:13;;-1:-1:-1;;;;;11604:19:0;;;11610:13;;11604:19;:44;;;;-1:-1:-1;;;;;;11627:21:0;;11643:4;11627:21;;11604:44;11600:776;;;11681:85;11762:3;11681:76;11705:16;;11693:9;;:28;11692:64;;11741:15;;11692:64;;;11725:13;;11681:6;;:10;:76::i;:85::-;-1:-1:-1;;;;;11791:14:0;;;;;;:8;:14;;;;;;11669:97;;-1:-1:-1;11791:19:0;:37;;;;-1:-1:-1;;;;;;11814:14:0;;;;;;:8;:14;;;;;;;;11791:37;11787:574;;;11858:9;11853:298;11877:7;:14;11873:18;;11853:298;;;11943:4;-1:-1:-1;;;;;11929:18:0;:7;11937:1;11929:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11929:10:0;:18;11925:203;;11993:7;12001:14;;:18;;12018:1;;12001:18;:::i;:::-;11993:27;;;;;;;;:::i;:::-;;;;;;;;;;;11980:7;:10;;-1:-1:-1;;;;;11993:27:0;;;;11988:1;;11980:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;11980:40:0;;;;;-1:-1:-1;;;;;11980:40:0;;;;;;12051:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;12051:13:0;;;;;-1:-1:-1;;;;;;12051:13:0;;;;;;12095:5;;11925:203;11893:3;;;;:::i;:::-;;;;11853:298;;;-1:-1:-1;;;;;;12173:14:0;;12190:5;12173:14;;;:8;:14;;;;;;;;:22;;-1:-1:-1;;12173:22:0;;;12218:14;:20;;;;;:24;11787:574;;;-1:-1:-1;;;;;12272:14:0;;;;;;:8;:14;;;;;;;;12268:93;;;-1:-1:-1;;;;;12311:20:0;;;;;;:14;:20;;;;;:30;;12335:6;;12311:20;:30;;12335:6;;12311:30;:::i;:::-;;;;-1:-1:-1;;12268:93:0;12441:4;12392:28;17345:15;;;:8;:15;;;;;;12467:6;;-1:-1:-1;;;12467:6:0;;;;12466:7;:30;;;;-1:-1:-1;12483:13:0;;-1:-1:-1;;;;;12477:19:0;;;12483:13;;12477:19;12466:30;:45;;;;-1:-1:-1;12500:11:0;;-1:-1:-1;;;12500:11:0;;;;12466:45;:89;;;;;12538:17;;12515:20;:40;12466:89;:123;;;;;12571:18;;12559:9;;:30;12466:123;12462:442;;;12610:69;12627:51;12631:6;12639:38;12643:20;12665:11;;12639:3;:38::i;:::-;12627:3;:51::i;:::-;12610:16;:69::i;:::-;12727:21;12792:17;12771:38;;12767:122;;;12834:35;12847:21;12834:12;:35::i;:::-;12591:313;12462:442;10462:2453;10424:2491;12931:13;;12927:170;;13004:4;12987:23;;;;:8;:23;;;;;;:38;;13015:9;12987:27;:38::i;:::-;12978:4;12961:23;;;;:8;:23;;;;;;;:64;;;;13045:40;;-1:-1:-1;;;;;13045:40:0;;;;;;;13075:9;1461:25:1;;1449:2;1434:18;;1315:177;13045:40:0;;;;;;;;12927:170;-1:-1:-1;;;;;13124:14:0;;;;;;:8;:14;;;;;;:26;;13143:6;13124:18;:26::i;:::-;-1:-1:-1;;;;;13107:14:0;;;;;;:8;:14;;;;;:43;13176:39;13193:21;:6;13204:9;13193:10;:21::i;:::-;-1:-1:-1;;;;;13176:12:0;;;;;;:8;:12;;;;;;;:16;:39::i;:::-;-1:-1:-1;;;;;13161:12:0;;;;;;;:8;:12;;;;;:54;;;;13231:41;;;13250:21;:6;13261:9;13250:10;:21::i;:::-;13231:41;;1461:25:1;;;1449:2;1434:18;13231:41:0;;;;;;;10148:3132;10079:3201;;;:::o;1994:190::-;2080:7;2116:12;2108:6;;;;2100:29;;;;-1:-1:-1;;;2100:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2140:9:0;2152:5;2156:1;2152;:5;:::i;:::-;2140:17;1994:190;-1:-1:-1;;;;;1994:190:0:o;15905:250::-;-1:-1:-1;;;;;15989:23:0;;;;;;:14;:23;;;;;;:33;-1:-1:-1;15989:33:0;15981:84;;;;-1:-1:-1;;;15981:84:0;;27695:2:1;15981:84:0;;;27677:21:1;27734:2;27714:18;;;27707:30;27773:34;27753:18;;;27746:62;-1:-1:-1;;;27824:18:1;;;27817:36;27870:19;;15981:84:0;27493:402:1;15981:84:0;-1:-1:-1;;;;;16076:23:0;;;;;;:14;:23;;;;;:33;;16103:6;;16076:23;:33;;16103:6;;16076:33;:::i;:::-;;;;-1:-1:-1;;;;;;;16120:17:0;;;;;;:8;:17;;;;;:27;;16141:6;;16120:17;:27;;16141:6;;16120:27;:::i;:::-;;;;-1:-1:-1;;;;15905:250:0:o;23658:441::-;23740:17;;;23803:241;23823:5;:12;23819:16;;23803:241;;;23879:7;23860:5;23866:1;23860:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;:26;:64;;;;;23913:11;23890:34;;:5;23896:1;23890:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;:34;23860:64;23857:176;;;23957:1;23945:13;;23989:4;23977:16;;24012:5;;23857:176;23837:3;;;;:::i;:::-;;;;23803:241;;;;24062:9;24054:37;;;;-1:-1:-1;;;24054:37:0;;28102:2:1;24054:37:0;;;28084:21:1;28141:2;28121:18;;;28114:30;-1:-1:-1;;;28160:18:1;;;28153:45;28215:18;;24054:37:0;27900:339:1;24054:37:0;23759:340;23658:441;;;;:::o;24107:485::-;24207:6;24203:382;24223:8;:15;24219:1;:19;24203:382;;;24260:13;24300:6;24296:201;24316:12;;;:19;24312:23;;24296:201;;;24383:8;24392:1;24383:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;24364:30:0;:4;:12;;24377:1;24364:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24364:15:0;:30;24361:121;;24430:4;24419:15;;24457:5;;24361:121;24337:3;;;;:::i;:::-;;;;24296:201;;;;24519:8;24511:62;;;;-1:-1:-1;;;24511:62:0;;28446:2:1;24511:62:0;;;28428:21:1;28485:2;28465:18;;;28458:30;28524:34;28504:18;;;28497:62;-1:-1:-1;;;28575:18:1;;;28568:39;28624:19;;24511:62:0;28244:405:1;24511:62:0;-1:-1:-1;24240:3:0;;;;:::i;:::-;;;;24203:382;;;;24107:485;;:::o;24804:1181::-;24952:6;24947:129;24968:19;:26;24964:30;;24947:129;;;25023:17;:41;25041:19;25061:1;25041:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25041:22:0;25023:41;;;;;;;;;;;;25016:48;24996:3;;;;:::i;:::-;;;;24947:129;;;-1:-1:-1;25086:26:0;25093:19;;25086:26;:::i;:::-;25196:28;25244:6;25239:201;25260:7;:14;25256:18;;25239:201;;;25338:3;5122:13;5061:1;5122:2;:13;:::i;:::-;5109:26;;:10;:26;:::i;:::-;25323:18;;;;:::i;:::-;25300:8;:20;25309:7;25317:1;25309:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25309:10:0;25300:20;;;;;;;;;;;;;:41;25296:133;;;25391:22;;;;:::i;:::-;;;;25296:133;25276:3;;;;:::i;:::-;;;;25239:201;;;-1:-1:-1;25519:24:0;;25515:463;;25560:23;25586:32;25598:20;25586:9;:32;:::i;:::-;25560:58;;25638:6;25633:334;25654:7;:14;25650:18;;25633:334;;;25736:3;5122:13;5061:1;5122:2;:13;:::i;:::-;5109:26;;:10;:26;:::i;:::-;25721:18;;;;:::i;:::-;25698:8;:20;25707:7;25715:1;25707:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25707:10:0;25698:20;;;;;;;;;;;;;:41;25694:258;;;25788:15;25764:8;:20;25773:7;25781:1;25773:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25773:10:0;25764:20;;;;;;;;;;;;:39;;:20;;25773:10;25764:39;;;;;:::i;:::-;;;;;;;;25858:15;25826:17;:29;25844:7;25852:1;25844:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25844:10:0;25826:29;;;;;;;;;;;;:47;25921:7;:10;;25896:19;;25921:7;25929:1;;25921:10;;;;;;:::i;:::-;;;;;;;;;;;;;25896:36;;25921:10;25896:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;25896:36:0;-1:-1:-1;;;;;25921:10:0;;;25896:36;;;;;;25694:258;25670:3;;;;:::i;:::-;;;;25633:334;;;;25545:433;24861:1124;24804:1181;:::o;13398:483::-;5756:6;:13;;-1:-1:-1;;;;5756:13:0;-1:-1:-1;;;5756:13:0;;;13500:16:::1;::::0;;13514:1:::1;13500:16:::0;;;;;::::1;::::0;;-1:-1:-1;;13500:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;13500:16:0::1;13476:40;;13545:4;13527;13532:1;13527:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13527:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;13571:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;13571:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;13527:7;;13571:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13561:4;13566:1;13561:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13561:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;13636:15:::1;::::0;13604:62:::1;::::0;13621:4:::1;::::0;13636:15:::1;13654:11:::0;13604:8:::1;:62::i;:::-;13677:15;::::0;:196:::1;::::0;-1:-1:-1;;;13677:196:0;;-1:-1:-1;;;;;13677:15:0;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;13758:11;;13677:15:::1;::::0;13800:4;;13827::::1;::::0;13847:15:::1;::::0;13677:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;5792:6:0;:14;;-1:-1:-1;;;;5792:14:0;;;-1:-1:-1;;;;13398:483:0:o;14108:92::-;14165:10;;:27;;:10;;;;-1:-1:-1;;;;;14165:10:0;;:27;;;;;;;;;;;;:10;:27;;;;;;;;;;;;;;;;;;;15562:233;-1:-1:-1;;;;;15644:17:0;;;;;;:8;:17;;;;;;:27;-1:-1:-1;15644:27:0;15636:69;;;;-1:-1:-1;;;15636:69:0;;29443:2:1;15636:69:0;;;29425:21:1;29482:2;29462:18;;;29455:30;29521:31;29501:18;;;29494:59;29570:18;;15636:69:0;29241:353:1;15636:69:0;-1:-1:-1;;;;;15716:17:0;;;;;;:8;:17;;;;;:27;;15737:6;;15716:17;:27;;15737:6;;15716:27;:::i;:::-;;;;-1:-1:-1;;;;;;;15754:23:0;;;;;;:14;:23;;;;;:33;;15781:6;;15754:23;:33;;15781:6;;15754:33;:::i;2192:246::-;2250:7;2274:1;2279;2274:6;2270:47;;-1:-1:-1;2304:1:0;2297:8;;2270:47;2327:9;2339:5;2343:1;2339;:5;:::i;:::-;2327:17;-1:-1:-1;2372:1:0;2363:5;2367:1;2327:17;2363:5;:::i;:::-;:10;2355:56;;;;-1:-1:-1;;;2355:56:0;;29801:2:1;2355:56:0;;;29783:21:1;29840:2;29820:18;;;29813:30;29879:34;29859:18;;;29852:62;-1:-1:-1;;;29930:18:1;;;29923:31;29971:19;;2355:56:0;29599:397:1;2355:56:0;2429:1;2192:246;-1:-1:-1;;;2192:246:0:o;2446:132::-;2504:7;2531:39;2535:1;2538;2531:39;;;;;;;;;;;;;;;;;:3;:39::i;13292:98::-;13349:7;13376:1;13374;:3;13373:9;;13381:1;13373:9;;;-1:-1:-1;13379:1:0;13292:98;-1:-1:-1;13292:98:0:o;1663:179::-;1721:7;;1753:5;1757:1;1753;:5;:::i;:::-;1741:17;;1782:1;1777;:6;;1769:46;;;;-1:-1:-1;;;1769:46:0;;30203:2:1;1769:46:0;;;30185:21:1;30242:2;30222:18;;;30215:30;30281:29;30261:18;;;30254:57;30328:18;;1769:46:0;30001:351:1;1850:136:0;1908:7;1935:43;1939:1;1942;1935:43;;;;;;;;;;;;;;;;;:3;:43::i;2586:189::-;2672:7;2707:12;2700:5;2692:28;;;;-1:-1:-1;;;2692:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2731:9:0;2743:5;2747:1;2743;:5;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:423:1;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;426:4;419:2;415:7;410:2;402:6;398:15;394:29;389:3;385:39;381:50;374:57;;;14:423;;;;:::o;442:220::-;591:2;580:9;573:21;554:4;611:45;652:2;641:9;637:18;629:6;611:45;:::i;667:131::-;-1:-1:-1;;;;;742:31:1;;732:42;;722:70;;788:1;785;778:12;803:315;871:6;879;932:2;920:9;911:7;907:23;903:32;900:52;;;948:1;945;938:12;900:52;987:9;974:23;1006:31;1031:5;1006:31;:::i;:::-;1056:5;1108:2;1093:18;;;;1080:32;;-1:-1:-1;;;803:315:1:o;1497:180::-;1556:6;1609:2;1597:9;1588:7;1584:23;1580:32;1577:52;;;1625:1;1622;1615:12;1577:52;-1:-1:-1;1648:23:1;;1497:180;-1:-1:-1;1497:180:1:o;2099:456::-;2176:6;2184;2192;2245:2;2233:9;2224:7;2220:23;2216:32;2213:52;;;2261:1;2258;2251:12;2213:52;2300:9;2287:23;2319:31;2344:5;2319:31;:::i;:::-;2369:5;-1:-1:-1;2426:2:1;2411:18;;2398:32;2439:33;2398:32;2439:33;:::i;:::-;2099:456;;2491:7;;-1:-1:-1;;;2545:2:1;2530:18;;;;2517:32;;2099:456::o;2957:247::-;3016:6;3069:2;3057:9;3048:7;3044:23;3040:32;3037:52;;;3085:1;3082;3075:12;3037:52;3124:9;3111:23;3143:31;3168:5;3143:31;:::i;3209:160::-;3275:20;;3335:1;3324:20;;;3314:31;;3304:59;;3359:1;3356;3349:12;3304:59;3209:160;;;:::o;3374:127::-;3435:10;3430:3;3426:20;3423:1;3416:31;3466:4;3463:1;3456:15;3490:4;3487:1;3480:15;3506:275;3577:2;3571:9;3642:2;3623:13;;-1:-1:-1;;3619:27:1;3607:40;;-1:-1:-1;;;;;3662:34:1;;3698:22;;;3659:62;3656:88;;;3724:18;;:::i;:::-;3760:2;3753:22;3506:275;;-1:-1:-1;3506:275:1:o;3786:183::-;3846:4;-1:-1:-1;;;;;3871:6:1;3868:30;3865:56;;;3901:18;;:::i;:::-;-1:-1:-1;3946:1:1;3942:14;3958:4;3938:25;;3786:183::o;3974:737::-;4028:5;4081:3;4074:4;4066:6;4062:17;4058:27;4048:55;;4099:1;4096;4089:12;4048:55;4135:6;4122:20;4161:4;4185:60;4201:43;4241:2;4201:43;:::i;:::-;4185:60;:::i;:::-;4279:15;;;4365:1;4361:10;;;;4349:23;;4345:32;;;4310:12;;;;4389:15;;;4386:35;;;4417:1;4414;4407:12;4386:35;4453:2;4445:6;4441:15;4465:217;4481:6;4476:3;4473:15;4465:217;;;4561:3;4548:17;4578:31;4603:5;4578:31;:::i;:::-;4622:18;;4660:12;;;;4498;;4465:217;;;-1:-1:-1;4700:5:1;3974:737;-1:-1:-1;;;;;;3974:737:1:o;4716:486::-;4816:6;4824;4832;4885:2;4873:9;4864:7;4860:23;4856:32;4853:52;;;4901:1;4898;4891:12;4853:52;4924:27;4941:9;4924:27;:::i;:::-;4914:37;;4998:2;4987:9;4983:18;4970:32;4960:42;;5053:2;5042:9;5038:18;5025:32;-1:-1:-1;;;;;5072:6:1;5069:30;5066:50;;;5112:1;5109;5102:12;5066:50;5135:61;5188:7;5179:6;5168:9;5164:22;5135:61;:::i;:::-;5125:71;;;4716:486;;;;;:::o;5207:461::-;5260:3;5298:5;5292:12;5325:6;5320:3;5313:19;5351:4;5380:2;5375:3;5371:12;5364:19;;5417:2;5410:5;5406:14;5438:1;5448:195;5462:6;5459:1;5456:13;5448:195;;;5527:13;;-1:-1:-1;;;;;5523:39:1;5511:52;;5583:12;;;;5618:15;;;;5559:1;5477:9;5448:195;;;-1:-1:-1;5659:3:1;;5207:461;-1:-1:-1;;;;;5207:461:1:o;5673:435::-;5726:3;5764:5;5758:12;5791:6;5786:3;5779:19;5817:4;5846:2;5841:3;5837:12;5830:19;;5883:2;5876:5;5872:14;5904:1;5914:169;5928:6;5925:1;5922:13;5914:169;;;5989:13;;5977:26;;6023:12;;;;6058:15;;;;5950:1;5943:9;5914:169;;6113:1144;6468:2;6457:9;6450:21;6431:4;6494:56;6546:2;6535:9;6531:18;6523:6;6494:56;:::i;:::-;6569:2;6619:9;6611:6;6607:22;6602:2;6591:9;6587:18;6580:50;6650:6;6685;6679:13;6716:6;6708;6701:22;6751:2;6743:6;6739:15;6732:22;;6810:2;6800:6;6797:1;6793:14;6785:6;6781:27;6777:36;6848:2;6840:6;6836:15;6869:1;6879:252;6893:6;6890:1;6887:13;6879:252;;;6983:2;6979:7;6970:6;6962;6958:19;6954:33;6949:3;6942:46;7011:40;7044:6;7035;7029:13;7011:40;:::i;:::-;7109:12;;;;7001:50;-1:-1:-1;7074:15:1;;;;6915:1;6908:9;6879:252;;;6883:3;;7179:9;7171:6;7167:22;7162:2;7151:9;7147:18;7140:50;7207:44;7244:6;7236;7207:44;:::i;:::-;7199:52;6113:1144;-1:-1:-1;;;;;;;;;;6113:1144:1:o;7262:465::-;7519:2;7508:9;7501:21;7482:4;7545:56;7597:2;7586:9;7582:18;7574:6;7545:56;:::i;:::-;7649:9;7641:6;7637:22;7632:2;7621:9;7617:18;7610:50;7677:44;7714:6;7706;7677:44;:::i;8165:764::-;8234:6;8265:2;8308;8296:9;8287:7;8283:23;8279:32;8276:52;;;8324:1;8321;8314:12;8276:52;8364:9;8351:23;-1:-1:-1;;;;;8434:2:1;8426:6;8423:14;8420:34;;;8450:1;8447;8440:12;8420:34;8488:6;8477:9;8473:22;8463:32;;8533:7;8526:4;8522:2;8518:13;8514:27;8504:55;;8555:1;8552;8545:12;8504:55;8591:2;8578:16;8613:2;8609;8606:10;8603:36;;;8619:18;;:::i;:::-;8661:53;8704:2;8685:13;;-1:-1:-1;;8681:27:1;8677:36;;8661:53;:::i;:::-;8648:66;;8737:2;8730:5;8723:17;8777:7;8772:2;8767;8763;8759:11;8755:20;8752:33;8749:53;;;8798:1;8795;8788:12;8749:53;8853:2;8848;8844;8840:11;8835:2;8828:5;8824:14;8811:45;8897:1;8876:14;;;8872:23;;;8865:34;;;;-1:-1:-1;8880:5:1;8165:764;-1:-1:-1;;;8165:764:1:o;8934:1346::-;9077:6;9085;9093;9101;9109;9162:3;9150:9;9141:7;9137:23;9133:33;9130:53;;;9179:1;9176;9169:12;9130:53;9202:27;9219:9;9202:27;:::i;:::-;9192:37;;9248:2;9297;9286:9;9282:18;9269:32;9259:42;;9352:2;9341:9;9337:18;9324:32;-1:-1:-1;;;;;9416:2:1;9408:6;9405:14;9402:34;;;9432:1;9429;9422:12;9402:34;9455:61;9508:7;9499:6;9488:9;9484:22;9455:61;:::i;:::-;9445:71;;9569:2;9558:9;9554:18;9541:32;9525:48;;9598:2;9588:8;9585:16;9582:36;;;9614:1;9611;9604:12;9582:36;-1:-1:-1;9637:24:1;;9692:4;9684:13;;9680:27;-1:-1:-1;9670:55:1;;9721:1;9718;9711:12;9670:55;9757:2;9744:16;9780:60;9796:43;9836:2;9796:43;:::i;9780:60::-;9874:15;;;9956:1;9952:10;;;;9944:19;;9940:28;;;9905:12;;;;9980:19;;;9977:39;;;10012:1;10009;10002:12;9977:39;10036:11;;;;10056:142;10072:6;10067:3;10064:15;10056:142;;;10138:17;;10126:30;;10089:12;;;;10176;;;;10056:142;;;8934:1346;;;;-1:-1:-1;8934:1346:1;;10269:3;10254:19;10241:33;;8934:1346;-1:-1:-1;;;;;;8934:1346:1:o;10285:388::-;10353:6;10361;10414:2;10402:9;10393:7;10389:23;10385:32;10382:52;;;10430:1;10427;10420:12;10382:52;10469:9;10456:23;10488:31;10513:5;10488:31;:::i;:::-;10538:5;-1:-1:-1;10595:2:1;10580:18;;10567:32;10608:33;10567:32;10608:33;:::i;:::-;10660:7;10650:17;;;10285:388;;;;;:::o;10678:669::-;11013:2;11002:9;10995:21;10976:4;11039:56;11091:2;11080:9;11076:18;11068:6;11039:56;:::i;:::-;11143:9;11135:6;11131:22;11126:2;11115:9;11111:18;11104:50;11177:44;11214:6;11206;11177:44;:::i;:::-;11163:58;;11269:9;11261:6;11257:22;11252:2;11241:9;11237:18;11230:50;11297:44;11334:6;11326;11297:44;:::i;:::-;11289:52;10678:669;-1:-1:-1;;;;;;10678:669:1:o;11352:127::-;11413:10;11408:3;11404:20;11401:1;11394:31;11444:4;11441:1;11434:15;11468:4;11465:1;11458:15;11484:422;11573:1;11616:5;11573:1;11630:270;11651:7;11641:8;11638:21;11630:270;;;11710:4;11706:1;11702:6;11698:17;11692:4;11689:27;11686:53;;;11719:18;;:::i;:::-;11769:7;11759:8;11755:22;11752:55;;;11789:16;;;;11752:55;11868:22;;;;11828:15;;;;11630:270;;;11634:3;11484:422;;;;;:::o;11911:806::-;11960:5;11990:8;11980:80;;-1:-1:-1;12031:1:1;12045:5;;11980:80;12079:4;12069:76;;-1:-1:-1;12116:1:1;12130:5;;12069:76;12161:4;12179:1;12174:59;;;;12247:1;12242:130;;;;12154:218;;12174:59;12204:1;12195:10;;12218:5;;;12242:130;12279:3;12269:8;12266:17;12263:43;;;12286:18;;:::i;:::-;-1:-1:-1;;12342:1:1;12328:16;;12357:5;;12154:218;;12456:2;12446:8;12443:16;12437:3;12431:4;12428:13;12424:36;12418:2;12408:8;12405:16;12400:2;12394:4;12391:12;12387:35;12384:77;12381:159;;;-1:-1:-1;12493:19:1;;;12525:5;;12381:159;12572:34;12597:8;12591:4;12572:34;:::i;:::-;12642:6;12638:1;12634:6;12630:19;12621:7;12618:32;12615:58;;;12653:18;;:::i;:::-;12691:20;;11911:806;-1:-1:-1;;;11911:806:1:o;12722:140::-;12780:5;12809:47;12850:4;12840:8;12836:19;12830:4;12809:47;:::i;12867:168::-;12940:9;;;12971;;12988:15;;;12982:22;;12968:37;12958:71;;13009:18;;:::i;13040:336::-;13242:2;13224:21;;;13281:2;13261:18;;;13254:30;-1:-1:-1;;;13315:2:1;13300:18;;13293:42;13367:2;13352:18;;13040:336::o;13381:127::-;13442:10;13437:3;13433:20;13430:1;13423:31;13473:4;13470:1;13463:15;13497:4;13494:1;13487:15;13513:135;13552:3;13573:17;;;13570:43;;13593:18;;:::i;:::-;-1:-1:-1;13640:1:1;13629:13;;13513:135::o;14058:536::-;14343:6;14332:9;14325:25;14386:2;14381;14370:9;14366:18;14359:30;14306:4;14412:56;14464:2;14453:9;14449:18;14441:6;14412:56;:::i;:::-;14516:9;14508:6;14504:22;14499:2;14488:9;14484:18;14477:50;14544:44;14581:6;14573;14544:44;:::i;15709:217::-;15749:1;15775;15765:132;;15819:10;15814:3;15810:20;15807:1;15800:31;15854:4;15851:1;15844:15;15882:4;15879:1;15872:15;15765:132;-1:-1:-1;15911:9:1;;15709:217::o;15931:125::-;15996:9;;;16017:10;;;16014:36;;;16030:18;;:::i;16061:128::-;16128:9;;;16149:11;;;16146:37;;;16163:18;;:::i;16529:548::-;16820:3;16809:9;16802:22;16783:4;16841:57;16893:3;16882:9;16878:19;16870:6;16841:57;:::i;:::-;16833:65;;16934:6;16929:2;16918:9;16914:18;16907:34;16977:6;16972:2;16961:9;16957:18;16950:34;17020:6;17015:2;17004:9;17000:18;16993:34;17064:6;17058:3;17047:9;17043:19;17036:35;16529:548;;;;;;;;:::o;17082:380::-;17161:1;17157:12;;;;17204;;;17225:61;;17279:4;17271:6;17267:17;17257:27;;17225:61;17332:2;17324:6;17321:14;17301:18;17298:38;17295:161;;17378:10;17373:3;17369:20;17366:1;17359:31;17413:4;17410:1;17403:15;17441:4;17438:1;17431:15;17467:356;17669:2;17651:21;;;17688:18;;;17681:30;17747:34;17742:2;17727:18;;17720:62;17814:2;17799:18;;17467:356::o;18313:545::-;18415:2;18410:3;18407:11;18404:448;;;18451:1;18476:5;18472:2;18465:17;18521:4;18517:2;18507:19;18591:2;18579:10;18575:19;18572:1;18568:27;18562:4;18558:38;18627:4;18615:10;18612:20;18609:47;;;-1:-1:-1;18650:4:1;18609:47;18705:2;18700:3;18696:12;18693:1;18689:20;18683:4;18679:31;18669:41;;18760:82;18778:2;18771:5;18768:13;18760:82;;;18823:17;;;18804:1;18793:13;18760:82;;;18764:3;;;18313:545;;;:::o;19034:1352::-;19160:3;19154:10;-1:-1:-1;;;;;19179:6:1;19176:30;19173:56;;;19209:18;;:::i;:::-;19238:97;19328:6;19288:38;19320:4;19314:11;19288:38;:::i;:::-;19282:4;19238:97;:::i;:::-;19390:4;;19454:2;19443:14;;19471:1;19466:663;;;;20173:1;20190:6;20187:89;;;-1:-1:-1;20242:19:1;;;20236:26;20187:89;-1:-1:-1;;18991:1:1;18987:11;;;18983:24;18979:29;18969:40;19015:1;19011:11;;;18966:57;20289:81;;19436:944;;19466:663;18260:1;18253:14;;;18297:4;18284:18;;-1:-1:-1;;19502:20:1;;;19620:236;19634:7;19631:1;19628:14;19620:236;;;19723:19;;;19717:26;19702:42;;19815:27;;;;19783:1;19771:14;;;;19650:19;;19620:236;;;19624:3;19884:6;19875:7;19872:19;19869:201;;;19945:19;;;19939:26;-1:-1:-1;;20028:1:1;20024:14;;;20040:3;20020:24;20016:37;20012:42;19997:58;19982:74;;19869:201;-1:-1:-1;;;;;20116:1:1;20100:14;;;20096:22;20083:36;;-1:-1:-1;19034:1352:1:o;21201:536::-;21486:2;21475:9;21468:21;21449:4;21512:56;21564:2;21553:9;21549:18;21541:6;21512:56;:::i;:::-;21616:9;21608:6;21604:22;21599:2;21588:9;21584:18;21577:50;21644:44;21681:6;21673;21644:44;:::i;:::-;21636:52;;;21724:6;21719:2;21708:9;21704:18;21697:34;21201:536;;;;;;:::o;22094:251::-;22164:6;22217:2;22205:9;22196:7;22192:23;22188:32;22185:52;;;22233:1;22230;22223:12;22185:52;22265:9;22259:16;22284:31;22309:5;22284:31;:::i;23271:306::-;23359:6;23367;23375;23428:2;23416:9;23407:7;23403:23;23399:32;23396:52;;;23444:1;23441;23434:12;23396:52;23473:9;23467:16;23457:26;;23523:2;23512:9;23508:18;23502:25;23492:35;;23567:2;23556:9;23552:18;23546:25;23536:35;;23271:306;;;;;:::o;23861:277::-;23928:6;23981:2;23969:9;23960:7;23956:23;23952:32;23949:52;;;23997:1;23994;23987:12;23949:52;24029:9;24023:16;24082:5;24075:13;24068:21;24061:5;24058:32;24048:60;;24104:1;24101;24094:12;27361:127;27422:10;27417:3;27413:20;27410:1;27403:31;27453:4;27450:1;27443:15;27477:4;27474:1;27467:15;28654:582;28953:6;28942:9;28935:25;28996:6;28991:2;28980:9;28976:18;28969:34;29039:3;29034:2;29023:9;29019:18;29012:31;28916:4;29060:57;29112:3;29101:9;29097:19;29089:6;29060:57;:::i;:::-;-1:-1:-1;;;;;29153:32:1;;;;29148:2;29133:18;;29126:60;-1:-1:-1;29217:3:1;29202:19;29195:35;29052:65;28654:582;-1:-1:-1;;;28654:582:1:o

Swarm Source

ipfs://07ee328d3bdc09a43388077aaa646ff8bb231d03af4988f76c884a7e5438d1d4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.