BNB Price: $695.44 (-2.04%)
Gas: 1 GWei
 

Overview

Max Total Supply

10,000,000,000BABYAPE

Holders

1,082 (0.00%)

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

$66,528.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
BSC: Validator Set
Balance
543,696,662.529818453940154963 BABYAPE

Value
$3,617.11 ( ~5.2012 BNB) [5.4370%]
0x0000000000000000000000000000000000001000
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

BabyApe is a roject with a huge ambition driven by its community; NFT Gaming & Metaverse, collaboration between other projects that will be linked to it

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 BABYAPE
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Baby_Ape

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2022-04-17
*/

pragma solidity ^0.8.11;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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



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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; 
        return msg.data;
    }
}


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

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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

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

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

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

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

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

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

    //Locks the contract for owner for the amount of time provided (seconds)
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp> _lockTime , "Contract is still locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }

    //Modifier to require caller to be authorized
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    //Authorize address.
    function authorize(address account) public onlyOwner {
        authorizations[account] = true;
    }

    // Remove address' authorization.
    function unauthorize(address account) public onlyOwner {
        authorizations[account] = false;
    }

    /**
     * Return address' authorization status
     */
    function isAuthorized(address account) public view returns (bool) {
        return authorizations[account];
    }
}

// pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

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

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


contract Baby_Ape is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcludedFromReward;

    mapping (address => bool) private _isExcludedFromMaxSellTransactionAmount;
    address[] private _excludedFromReward;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 10000000000* 10**18; // 10MM
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

    address public liquidityWallet;
    address payable public marketingWallet = payable(0x00293ADF690c5A6A03F1fa4b9f069EF891b38851);

    uint256 private _tFeeTotal;

    string private _name = "BabyApe";
    string private _symbol = "BABYAPE";
    uint8 private _decimals = 18;

    address constant private  DEAD = 0x000000000000000000000000000000000000dEaD;
    
    uint8 public sellRewardFee = 5;
    uint8 public buyRewardFee = 5;
    
    uint8 public sellLiquidityFee = 4;
    uint8 public buyLiquidityFee = 2;

    uint8 public sellMarketingFee = 6;
    uint8 public buyMarketingFee = 3;

    uint8 totalSellFees;
    uint8 totalBuyFees;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    
    bool private _inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    
    uint256 public maxSellTransactionAmount = 50000000 *10**18; //50M => 0.5%
    uint256 private _swapTokensAtAmount =  10000000* 10**18; //10M => 0.1%

    // timestamp for when the token can be traded freely on PancakeSwap
    uint256 public tradingEnabledTimestamp = 1654855200; // 10 th June 12h GMT+2
    // addresses that can make transfers before PancakeSwap listing
    mapping (address => bool) private _canTransferBeforeTradingIsEnabled;
    // exclude from transactions
    mapping(address=>bool) private _isBlacklisted;
    // all known liquidity pools 
    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 private _marketingCurrentAccumulatedFee;
    uint256 private _liquidityCurrentAccumulatedFee;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event BlackList(address indexed account, bool isBlacklisted);

    event UniswapV2RouterUpdated(address indexed newAddress, address indexed oldAddress);
    event UniswapV2PairUpdated(address indexed newAddress, address indexed oldAddress);
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);
    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event MaxSellTransactionAmountUpdated(uint256 amount);

    event ExcludeFromFees(address indexed account);
    event ExcludeFromReward(address indexed account);
    event ExcludeFromMaxSellTransactionAmount(address indexed account);
    event IncludeInFees(address indexed account);
    event IncludeInReward(address indexed account);
    event IncludeInMaxSellTransactionAmount(address indexed account);

    event SellFeesUpdated(uint8 rewardFee,uint8 liquidityFee,uint8 marketingFee);
    event BuyFeesUpdated(uint8 rewardFee,uint8 liquidityFee,uint8 marketingFee);

    event Burn(uint256 amount);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SendMarketingDividends(uint256 amount);


    modifier lockTheSwap {
        _inSwapAndLiquify = true;
        _;
        _inSwapAndLiquify = false;
    }

    struct tTransferValues { 
      uint256 tAmount;
      uint256 tTransferAmount;
      uint256 tRewardFee;
      uint256 tLiquidityFee;
      uint256 tMarketingFee;
   }

    struct rTransferValues { 
      uint256 rAmount;
      uint256 rTransferAmount;
      uint256 rRewardFee;
      uint256 rLiquidityFee;
      uint256 rMarketingFee;

   }

    constructor ()  {
        _rOwned[_msgSender()] = _rTotal;
        
        uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
         // Create a uniswap pair for this new token with BNB
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
      
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[DEAD] = true;
        _isExcludedFromFee[marketingWallet] = true;

        totalBuyFees = buyLiquidityFee + buyMarketingFee + buyRewardFee;
        totalSellFees = sellLiquidityFee + sellMarketingFee + sellRewardFee;


        // exclude pair and other wallets from reward
        excludeFromReward(owner());
        excludeFromReward(address(this));
        excludeFromReward(DEAD);
        excludeFromReward(marketingWallet);

        _isExcludedFromMaxSellTransactionAmount[owner()] = true;
        _isExcludedFromMaxSellTransactionAmount[address(this)] = true;

        // enable owner to send tokens before listing on PancakeSwap
        _canTransferBeforeTradingIsEnabled[owner()] = true;

        liquidityWallet = owner();


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

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

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

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

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromReward[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[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, "BEP20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero"));
        return true;
    }

    function totalRewardFeesDistributed() public view returns (uint256) {
        return _tFeeTotal;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public authorized {
        require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            excludeFromReward(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function deliver(uint256 tAmount) external {
        address sender = _msgSender();
        require(!_isExcludedFromReward[sender], "Excluded addresses from reward cannot call this function");
        uint256 rAmount = reflectionFromToken(tAmount);
        _rOwned[sender] -= rAmount;
        _rTotal -= rAmount;
        _tFeeTotal += tAmount;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee, bool isSellTransaction) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            uint256 rAmount = reflectionFromToken(tAmount);
            return rAmount;
        } else {
            (, rTransferValues memory rValues) = _getValuesWithFees(tAmount,isSellTransaction);
            return rValues.rTransferAmount;
        }
    }

    function reflectionFromToken(uint256 tAmount) private view returns(uint256) {
        return tAmount.mul(_getRate());
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public authorized() {
        require(!_isExcludedFromReward[account], "Account is already excluded from reward");
        require(_excludedFromReward.length <= 1000, "No more than 1000 addresses can be excluded from the rewards");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedFromReward.push(account);
        emit ExcludeFromReward(account);
    }

    function includeInReward(address account) external authorized() {
        require(_isExcludedFromReward[account], "Account is already included in reward");
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_excludedFromReward[i] == account) {
                _excludedFromReward[i] = _excludedFromReward[_excludedFromReward.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedFromReward.pop();
                break;
            }
        }
        emit IncludeInReward(account);
    }
    
    function excludeFromFees(address account) public authorized() {
        require(!_isExcludedFromFee[account], "Account is already excluded from fee");
        _isExcludedFromFee[account] = true;
        emit ExcludeFromFees(account);
    }

    function includeInFees(address account) public authorized() {
        require(_isExcludedFromFee[account], "Account is already included in fee");
        _isExcludedFromFee[account] = false;
        emit ExcludeFromFees(account);
    }

    function excludeFromMaxSellTransactionAmount(address account) public authorized() {
        require(!_isExcludedFromMaxSellTransactionAmount[account], "Account is already excluded from max transfer amount");
        _isExcludedFromMaxSellTransactionAmount[account] = true;
        emit ExcludeFromMaxSellTransactionAmount(account);
    }
    function includeInMaxSellTransactionAmount(address account) public authorized() {
        require(_isExcludedFromMaxSellTransactionAmount[account], "Account is already included in max transfer amount");
        _isExcludedFromMaxSellTransactionAmount[account] = false;
        emit IncludeInMaxSellTransactionAmount(account);
    }
    // To add DxSale router and presale addresses 
    function addAccountToTheseThatcanTransferBeforeTradingIsEnabled(address account) external onlyOwner {
        require(!_canTransferBeforeTradingIsEnabled[account],"Account is already added");
        _canTransferBeforeTradingIsEnabled[account] = true;
    }
    
    function setBuyFeePercents(uint8 rewardFee,uint8 liquidityFee,uint8 marketingFee) external onlyOwner() {
        uint8 newTotalBuyFees = rewardFee + liquidityFee + marketingFee;
        require(newTotalBuyFees <=10 , "Total buy fees must be lower or equals to 10%");
        buyRewardFee = rewardFee;
        buyLiquidityFee = liquidityFee;
        buyMarketingFee = marketingFee;
        totalBuyFees = newTotalBuyFees;
        emit BuyFeesUpdated(rewardFee, liquidityFee, marketingFee);
    }
    
    function setSellFeePercents(uint8 rewardFee,uint8 liquidityFee,uint8 marketingFee) external onlyOwner() {
        uint8 newTotalSellFees = rewardFee + liquidityFee + marketingFee;
        require(newTotalSellFees <=15 , "Total sell fees must be lower or equals to 15%");
        sellRewardFee = rewardFee;
        sellLiquidityFee = liquidityFee;
        sellMarketingFee = marketingFee;
        totalSellFees = newTotalSellFees;
        emit SellFeesUpdated(rewardFee, liquidityFee, marketingFee);
    }
   
    function setMaxSellTransactionAmount(uint256 amount) external onlyOwner {
        require(amount >= 100000 && amount <= 1000000000, "Amount must be bewteen 100 000 and 1 000 000 000");
        maxSellTransactionAmount = amount *10**18;
        emit MaxSellTransactionAmountUpdated(maxSellTransactionAmount);
    }
    
    function setSwapTokenAtAmount(uint256 amount) external onlyOwner {
        require(amount >= 1000 && amount <= 1000000000, "Amount must be bewteen 1000 and 1 000 000 000");
        _swapTokensAtAmount = amount *10**18;

    }

    function setSwapAndLiquifyEnabled(bool enabled) public onlyOwner {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(enabled);
    }
    
     //to recieve BNB from uniswapV2Router when swaping
    receive() external payable {
    }

    function _reflectFee(uint256 rRewardFee, uint256 tRewardFee) private {
        _rTotal -= rRewardFee;
        _tFeeTotal += tRewardFee;
    }


    function _getValuesWithFees(uint256 tAmount, bool isSellTransfer) private view returns (tTransferValues memory, rTransferValues memory) {
        tTransferValues memory tValues= _getTValues(tAmount,isSellTransfer);
        rTransferValues memory rValues= _getRValues(tValues);
        return (tValues,rValues);
    }

    function _getTValues(uint256 tAmount,bool isSellTransfer) private view returns (tTransferValues memory) {
        (uint256 tRewardFee, uint256 tLiquidityFee, uint256 tMarketingFee) = _calculateFees(tAmount, isSellTransfer);
        uint256 tTransferAmount = tAmount.sub(tRewardFee).sub(tLiquidityFee).sub(tMarketingFee);
        return tTransferValues(tAmount,tTransferAmount, tRewardFee, tLiquidityFee, tMarketingFee);
    }

    function _getRValues(tTransferValues memory tValues) private view returns (rTransferValues memory) {
        uint256 currentRate = _getRate();
        uint256 rAmount = tValues.tAmount.mul(currentRate);
        uint256 rRewardFee = tValues.tRewardFee.mul(currentRate);
        uint256 rLiquidityFee = tValues.tLiquidityFee.mul(currentRate);
        uint256 rMarketingFee = tValues.tMarketingFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rRewardFee).sub(rLiquidityFee).sub(rMarketingFee);
        return rTransferValues(rAmount, rTransferAmount, rRewardFee, rLiquidityFee, rMarketingFee);
    }
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_rOwned[_excludedFromReward[i]] > rSupply || _tOwned[_excludedFromReward[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply -= _rOwned[_excludedFromReward[i]];
            tSupply -= _tOwned[_excludedFromReward[i]];
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _calculateFees(uint256 amount, bool isSellTransaction) private view returns (uint256,uint256,uint256) {
        if(isSellTransaction) {
            return(amount*sellRewardFee/100,amount*sellLiquidityFee/100,amount*sellMarketingFee/100);
        }
        else {
            return(amount*buyRewardFee/100,amount*buyLiquidityFee/100,amount*buyMarketingFee/100);
        }
        
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    function isExcludedFromReward(address account) public view returns(bool) {
        return _isExcludedFromReward[account];
    }
    function isExcludedFromMaxSellTransactionAmount(address account) public view returns(bool) {
        return _isExcludedFromMaxSellTransactionAmount[account];
    }
    function isBlacklisted(address account) public view returns(bool) {
        return _isBlacklisted[account];
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: 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), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount >= 0, "Transfer amount must be greater or equal to zero");
        require(!_isBlacklisted[to], "Recipient is backlisted");
        require(!_isBlacklisted[from], "Sender is backlisted");

        bool tradingIsEnabled = getTradingIsEnabled();

        if(!tradingIsEnabled) {
            require(_canTransferBeforeTradingIsEnabled[from], "This account cannot send tokens until trading is enabled");
        }
        bool isSellTransfer = automatedMarketMakerPairs[to];
        if( 
        	!_inSwapAndLiquify &&
        	tradingIsEnabled &&
            isSellTransfer && // sells only by detecting transfer to automated market maker pair
        	from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromMaxSellTransactionAmount[to] &&
            !_isExcludedFromMaxSellTransactionAmount[from] //no max for those excluded from max transaction amount
        ) {
            require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }


        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
        
        if (
            canSwap &&
            !_inSwapAndLiquify&&
            !automatedMarketMakerPairs[from] && // not during buying
            from != liquidityWallet &&
            to != liquidityWallet &&
            swapAndLiquifyEnabled
        ) {
            //add liquidity
            _swapAndLiquify();
        }
        
        bool isBuyTransfer = automatedMarketMakerPairs[from];
        bool takeFee = tradingIsEnabled && !_inSwapAndLiquify && (isBuyTransfer || isSellTransfer);

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        
        _tokenTransfer(from,to,amount,takeFee,isSellTransfer);
    }

    function _swapAndLiquify() private lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        // Get the unknown tokens that are on the contract and add them to the amount that goes to the liquidity pool
        uint256 unknownSourcetokens = totalTokens.sub(_marketingCurrentAccumulatedFee).sub(_liquidityCurrentAccumulatedFee);
        _liquidityCurrentAccumulatedFee+= unknownSourcetokens;
        uint256 liquidityTokensToNotSwap = _liquidityCurrentAccumulatedFee.div(2);
        // initial BNB amount
        uint256 initialBalance = address(this).balance;
        // swap tokens for BNB
        _swapTokensForEth(totalTokens.sub(liquidityTokensToNotSwap));

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        uint256 marketingAmount = newBalance.mul(_marketingCurrentAccumulatedFee).div(totalTokens.sub(liquidityTokensToNotSwap));
        uint256 liquidityAmount = newBalance.sub(marketingAmount);
        _marketingCurrentAccumulatedFee = 0;
        _liquidityCurrentAccumulatedFee = 0;
        // add liquidity to PancakeSwap
        _addLiquidity(liquidityTokensToNotSwap, liquidityAmount);
        // send BNB to marketing wallet
        sendMarketingDividends(marketingAmount);
        emit SwapAndLiquify(totalTokens.sub(liquidityTokensToNotSwap), newBalance, liquidityTokensToNotSwap);
    }

    function sendMarketingDividends(uint256 amount) private {
        (bool success,) = payable(address(marketingWallet)).call{value: amount}("");

        if(success) {
   	 		emit SendMarketingDividends(amount);
        }
    }

    function _swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: bnbAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet, // send to liquidity wallet
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee, bool isSellTransfer) private {
        tTransferValues memory tValues;
        rTransferValues memory rValues;

        if(!takeFee) {
            tValues = tTransferValues(amount, amount,0,0,0);
            uint256 rAmount = amount.mul(_getRate());
            rValues = rTransferValues(rAmount, rAmount,0,0,0);
        }
        else {
        (tValues, rValues) = _getValuesWithFees(amount,isSellTransfer);
        }

        
        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, tValues, rValues);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, tValues, rValues);
        } else if (!_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferStandard(sender, recipient, rValues);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferBothExcluded(sender, recipient, tValues, rValues);
        } else {
            _transferStandard(sender, recipient, rValues);
        }

        emit Transfer(sender, recipient, tValues.tTransferAmount);
        if(takeFee)
            _transferFees(tValues, rValues, sender);
    }
    function _transferFees(tTransferValues memory tValues, rTransferValues memory rValues, address sender) private {
        uint256 rFees = rValues.rMarketingFee.add(rValues.rLiquidityFee);
        uint256 tFees = tValues.tMarketingFee.add(tValues.tLiquidityFee);
        _liquidityCurrentAccumulatedFee+=tValues.tLiquidityFee;
        _marketingCurrentAccumulatedFee+=tValues.tMarketingFee;
        _rOwned[address(this)] = _rOwned[address(this)].add(rFees);
        emit Transfer(sender, address(this), tFees);
        if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tFees);

        _reflectFee(rValues.rRewardFee, tValues.tRewardFee);

    }

    function _transferStandard(address sender, address recipient, rTransferValues memory rValues) private {
        _rOwned[sender] -= rValues.rAmount;
        _rOwned[recipient] += rValues.rTransferAmount;
    }

    function _transferToExcluded(address sender, address recipient, tTransferValues memory tValues, rTransferValues memory rValues) private {
        _rOwned[sender] -= rValues.rAmount;
        _tOwned[recipient] += tValues.tTransferAmount;
        _rOwned[recipient] += rValues.rTransferAmount;           
    }

    function _transferFromExcluded(address sender, address recipient, tTransferValues memory tValues, rTransferValues memory rValues) private {
        _tOwned[sender] -= tValues.tAmount;
        _rOwned[sender] -= rValues.rAmount;
        _rOwned[recipient] += rValues.rTransferAmount;   
    }

    function _transferBothExcluded(address sender, address recipient, tTransferValues memory tValues, rTransferValues memory rValues) private {
        _tOwned[sender] -= tValues.tAmount;
        _rOwned[sender] -= rValues.rAmount;
        _tOwned[recipient] += tValues.tTransferAmount;
        _rOwned[recipient] += rValues.rTransferAmount;        
    }

    function changeUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(uniswapV2Router), "The router has already that address");
        emit UniswapV2RouterUpdated(newRouter, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newRouter);      
    }

    function changeUniswapPair(address newPair) external onlyOwner {
        require(newPair != address(uniswapV2Pair), "The pair address has already that address");
        emit UniswapV2PairUpdated(newPair, address(uniswapV2Pair));
        uniswapV2Pair = newPair;
        excludeFromReward(uniswapV2Pair);
    }

    function getCirculatingSupply() external view returns (uint256) {
        return totalSupply().sub(balanceOf(DEAD)).sub(balanceOf(address(0)));
    }

    function burn(uint256 amount) external returns (bool) {
        _transfer(_msgSender(), DEAD, amount);
        emit Burn(amount);
        return true;
    }

    function sendLiquidityFeeManually() external authorized {
        _swapAndLiquify();
    }

    function setMarketingWallet(address payable newWallet) external onlyOwner {
        require(newWallet != marketingWallet, "The marketing wallet has already that address");
        emit MarketingWalletUpdated(newWallet,marketingWallet);
         marketingWallet = newWallet;
        _isExcludedFromFee[newWallet] = true;
        excludeFromReward(newWallet);
    }

    function getTradingIsEnabled() public view returns (bool) {
        return block.timestamp >= tradingEnabledTimestamp;
    }

    function blackList(address _account ) public onlyOwner {
        require(!_isBlacklisted[_account], "This address is already blacklisted");
        require(_account != owner(), "Blacklisting the owner is not allowed");
        require(_account != address(0), "Blacklisting the 0 address is not allowed");
        require(_account != uniswapV2Pair, "Blacklisting the pair address is not allowed");
        require(_account != address(this), "Blacklisting the contract address is not allowed");

        _isBlacklisted[_account] = true;
        emit BlackList(_account,true);
    }
    
    function removeFromBlacklist(address _account) public onlyOwner {
        require(_isBlacklisted[_account], "This address already whitelisted");
        _isBlacklisted[_account] = false;
        emit BlackList(_account,false);
    }

    function setTradingEnabledTimestamp(uint256 timestamp) external onlyOwner {
        require(tradingEnabledTimestamp > block.timestamp, "Changing the timestamp is not allowed if the listing has already started");
        tradingEnabledTimestamp = timestamp;
    }    

    function getStuckBNBs(address payable to) external onlyOwner {
        require(address(this).balance > 0, "There are no BNBs in the contract");
        to.transfer(address(this).balance);
    } 
}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"rewardFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromMaxSellTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInMaxSellTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSellTransactionAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"rewardFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendMarketingDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAccountToTheseThatcanTransferBeforeTradingIsEnabled","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_account","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"changeUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"changeUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromMaxSellTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"getStuckBNBs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxSellTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxSellTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"},{"internalType":"bool","name":"isSellTransaction","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendLiquidityFeeManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rewardFee","type":"uint8"},{"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"internalType":"uint8","name":"marketingFee","type":"uint8"}],"name":"setBuyFeePercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSellTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rewardFee","type":"uint8"},{"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"internalType":"uint8","name":"marketingFee","type":"uint8"}],"name":"setSellFeePercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokenAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setTradingEnabledTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardFeesDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526b204fce5e3e25026110000000600b819055620000249060001962000d19565b620000329060001962000d46565b600c55600e80546001600160a01b03191672293adf690c5a6a03f1fa4b9f069ef891b38851179055604080518082019091526007808252664261627941706560c81b60209092019182526200008a9160109162000c5d565b50604080518082019091526007808252664241425941504560c81b6020909201918252620000bb9160119162000c5d565b5060128054660306020405051266ffffffffffffff199091161790556013805460ff60a81b1916600160a81b1790556a295be96e640669720000006014556a084595161401484a0000006015556362a316206016553480156200011d57600080fd5b50600080546001600160a01b03191633908117825580825260036020526040808320805460ff1916600117905551909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c543360009081526004602081815260409283902093909355601280547c10ed43c718714eb63d5aa57b78b54704e256024e000000000000000000600160481b600160e81b03199091161790819055825163c45a015560e01b8152925169010000000000000000009091046001600160a01b03169363c45a01559380840193919291908290030181865afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000d60565b6001600160a01b031663c9c6539630601260099054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c2919062000d60565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000310573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000336919062000d60565b601380546001600160a01b0319166001600160a01b039290921691821790556200036290600162000625565b6001600760006200037b6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260079093528183208054851660019081179091557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d8054861682179055600e5490911683529120805490921617905560125462010000810460ff908116916200042b916601000000000000820481169164010000000090041662000d8b565b62000437919062000d8b565b6012805460ff60401b19166801000000000000000060ff93841602179081905561010081048216916200047f9165010000000000810482169163010000009091041662000d8b565b6200048b919062000d8b565b6012805460ff929092166701000000000000000260ff60381b19909216919091179055620004cb620004c56000546001600160a01b031690565b62000735565b620004d63062000735565b620004e361dead62000735565b600e54620004fa906001600160a01b031662000735565b600160096000620005136000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260099092528120805490921660019081179092556017906200056c6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620005a76000546001600160a01b031690565b600d80546001600160a01b0319166001600160a01b0392909216919091179055620005cf3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200061791815260200190565b60405180910390a362000e93565b6001600160a01b03821660009081526019602052604090205460ff1615158115151415620006c05760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601960205260409020805460ff19168215801591909117909155620006f957620006f98262000735565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526003602052604090205460ff16620007845760405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606401620006b7565b6001600160a01b03811660009081526008602052604090205460ff1615620007ff5760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015266081c995dd85c9960ca1b6064820152608401620006b7565b600a546103e810156200087b5760405162461bcd60e51b815260206004820152603c60248201527f4e6f206d6f7265207468616e2031303030206164647265737365732063616e2060448201527f6265206578636c756465642066726f6d207468652072657761726473000000006064820152608401620006b7565b6001600160a01b03811660009081526004602052604090205415620008d8576001600160a01b038116600090815260046020526040902054620008be9062000964565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b038116600081815260086020526040808220805460ff19166001908117909155600a8054918201815583527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191684179055517f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99190a250565b6000600c54821115620009cd5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620006b7565b6000620009d9620009fc565b9050620009f5818462000a2f60201b62002b1f1790919060201c565b9392505050565b6000808062000a0a62000a79565b9150915062000a28818362000a2f60201b62002b1f1790919060201c565b9250505090565b6000620009f583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062000c2160201b60201c565b600c54600b546000918291825b600a5481101562000be1578260046000600a848154811062000aac5762000aac62000db3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000b1b57508160056000600a848154811062000af45762000af462000db3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000b3257600c54600b54945094505050509091565b60046000600a838154811062000b4c5762000b4c62000db3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462000b7d908462000d46565b925060056000600a838154811062000b995762000b9962000db3565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462000bca908362000d46565b91508062000bd88162000dc9565b91505062000a86565b5062000c00600b54600c5462000a2f60201b62002b1f1790919060201c565b82101562000c1857600c54600b549350935050509091565b90939092509050565b6000818362000c455760405162461bcd60e51b8152600401620006b7919062000de7565b50600062000c54848662000e3f565b95945050505050565b82805462000c6b9062000e56565b90600052602060002090601f01602090048101928262000c8f576000855562000cda565b82601f1062000caa57805160ff191683800117855562000cda565b8280016001018555821562000cda579182015b8281111562000cda57825182559160200191906001019062000cbd565b5062000ce892915062000cec565b5090565b5b8082111562000ce8576000815560010162000ced565b634e487b7160e01b600052601260045260246000fd5b60008262000d2b5762000d2b62000d03565b500690565b634e487b7160e01b600052601160045260246000fd5b60008282101562000d5b5762000d5b62000d30565b500390565b60006020828403121562000d7357600080fd5b81516001600160a01b0381168114620009f557600080fd5b600060ff821660ff84168060ff0382111562000dab5762000dab62000d30565b019392505050565b634e487b7160e01b600052603260045260246000fd5b600060001982141562000de05762000de062000d30565b5060010190565b600060208083528351808285015260005b8181101562000e165785810183015185820160400152820162000df8565b8181111562000e29576000604083870101525b50601f01601f1916929092016040019392505050565b60008262000e515762000e5162000d03565b500490565b600181811c9082168062000e6b57607f821691505b6020821081141562000e8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6147498062000ea36000396000f3fe6080604052600436106103dd5760003560e01c8063734a3873116101fd578063b62496f511610118578063dd62ed3e116100ab578063f11a24d31161007a578063f11a24d314610be8578063f2fde38b14610c0a578063f637434214610c2a578063fe575a8714610c4b578063fe9fbb8014610c8457600080fd5b8063dd62ed3e14610b43578063de0aad5314610b89578063e57f14e114610ba8578063f0b37c0414610bc857600080fd5b8063d4698016116100e7578063d469801614610ac3578063d47274a314610ae3578063db84527d14610b03578063dd46706414610b2357600080fd5b8063b62496f514610a33578063b6a5d7de14610a63578063c337083714610a83578063c49b9a8014610aa357600080fd5b806395d89b4111610190578063a457c2d71161015f578063a457c2d7146109c9578063a593015f146109e9578063a69df4b5146109fe578063a9059cbb14610a1357600080fd5b806395d89b411461093b5780639a7a23d6146109505780639cf7522814610970578063a0d3b8eb146109a957600080fd5b806388f82020116101cc57806388f82020146108a15780638da5cb5b146108da5780638fb28310146108f8578063921369131461091857600080fd5b8063734a38731461082057806375f0a8741461084057806378fe1b13146108605780637bce5a041461088057600080fd5b806339509351116102f857806352390c021161028b5780635d098b381161025a5780635d098b3814610796578063602bc62b146107b65780636af53e8a146107cb57806370a08231146107eb578063715018a61461080b57600080fd5b806352390c02146106fd5780635342acb41461071d578063537df3b6146107565780635802e4031461077657600080fd5b80634838d165116102c75780634838d1651461068457806349bd5a5e146106a45780634a74bb02146106c45780634d33b1ef146106e557600080fd5b806339509351146106045780633bd5d173146106245780633f63d40f1461064457806342966c681461066457600080fd5b806318160ddd116103705780632d8381191161033f5780632d8381191461058c578063313ce567146105ac57806333cfb96e146105c45780633685d419146105e457600080fd5b806318160ddd1461052c57806323b872dd1461054157806325b61703146105615780632b112e491461057757600080fd5b80630cfe2f3f116103ac5780630cfe2f3f1461047b57806316216e5f146104ad5780631694505e146104cd57806316a2f82a1461050c57600080fd5b806302259e9e146103e95780630346535f1461041257806306fdde0314610429578063095ea7b31461044b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103ff60145481565b6040519081526020015b60405180910390f35b34801561041e57600080fd5b50610427610ca4565b005b34801561043557600080fd5b5061043e610cdc565b6040516104099190614231565b34801561045757600080fd5b5061046b61046636600461429b565b610d6e565b6040519015158152602001610409565b34801561048757600080fd5b5060125461049b9062010000900460ff1681565b60405160ff9091168152602001610409565b3480156104b957600080fd5b506104276104c83660046142c7565b610d85565b3480156104d957600080fd5b506012546104f490600160481b90046001600160a01b031681565b6040516001600160a01b039091168152602001610409565b34801561051857600080fd5b506104276105273660046142e0565b610e79565b34801561053857600080fd5b50600b546103ff565b34801561054d57600080fd5b5061046b61055c3660046142fd565b610f5a565b34801561056d57600080fd5b506103ff60165481565b34801561058357600080fd5b506103ff610fc4565b34801561059857600080fd5b506103ff6105a73660046142c7565b610ff0565b3480156105b857600080fd5b5060125460ff1661049b565b3480156105d057600080fd5b506104276105df3660046142e0565b61106d565b3480156105f057600080fd5b506104276105ff3660046142e0565b61115e565b34801561061057600080fd5b5061046b61061f36600461429b565b611353565b34801561063057600080fd5b5061042761063f3660046142c7565b611389565b34801561065057600080fd5b506103ff61065f366004614353565b611483565b34801561067057600080fd5b5061046b61067f3660046142c7565b61150a565b34801561069057600080fd5b5061042761069f3660046142e0565b611554565b3480156106b057600080fd5b506013546104f4906001600160a01b031681565b3480156106d057600080fd5b5060135461046b90600160a81b900460ff1681565b3480156106f157600080fd5b5060165442101561046b565b34801561070957600080fd5b506104276107183660046142e0565b61180a565b34801561072957600080fd5b5061046b6107383660046142e0565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076257600080fd5b506104276107713660046142e0565b611a08565b34801561078257600080fd5b506104276107913660046142c7565b611ae9565b3480156107a257600080fd5b506104276107b13660046142e0565b611ba0565b3480156107c257600080fd5b506002546103ff565b3480156107d757600080fd5b506104276107e63660046142e0565b611cbc565b3480156107f757600080fd5b506103ff6108063660046142e0565b611db3565b34801561081757600080fd5b50610427611e12565b34801561082c57600080fd5b5061042761083b3660046142e0565b611e74565b34801561084c57600080fd5b50600e546104f4906001600160a01b031681565b34801561086c57600080fd5b5061042761087b3660046142e0565b611f2b565b34801561088c57600080fd5b5060125461049b90600160301b900460ff1681565b3480156108ad57600080fd5b5061046b6108bc3660046142e0565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156108e657600080fd5b506000546001600160a01b03166104f4565b34801561090457600080fd5b506104276109133660046142e0565b612027565b34801561092457600080fd5b5060125461049b9065010000000000900460ff1681565b34801561094757600080fd5b5061043e6120e4565b34801561095c57600080fd5b5061042761096b36600461438f565b6120f3565b34801561097c57600080fd5b5061046b61098b3660046142e0565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156109b557600080fd5b506104276109c43660046143d5565b6121b4565b3480156109d557600080fd5b5061046b6109e436600461429b565b61231b565b3480156109f557600080fd5b50600f546103ff565b348015610a0a57600080fd5b5061042761236a565b348015610a1f57600080fd5b5061046b610a2e36600461429b565b612470565b348015610a3f57600080fd5b5061046b610a4e3660046142e0565b60196020526000908152604090205460ff1681565b348015610a6f57600080fd5b50610427610a7e3660046142e0565b61247d565b348015610a8f57600080fd5b50610427610a9e3660046142e0565b6124cb565b348015610aaf57600080fd5b50610427610abe36600461440f565b6125e9565b348015610acf57600080fd5b50600d546104f4906001600160a01b031681565b348015610aef57600080fd5b50610427610afe3660046143d5565b612660565b348015610b0f57600080fd5b50610427610b1e3660046142c7565b6127b9565b348015610b2f57600080fd5b50610427610b3e3660046142c7565b612873565b348015610b4f57600080fd5b506103ff610b5e36600461442a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610b9557600080fd5b5060125461049b90610100900460ff1681565b348015610bb457600080fd5b50610427610bc33660046142e0565b6128f8565b348015610bd457600080fd5b50610427610be33660046142e0565b6129de565b348015610bf457600080fd5b5060125461049b90640100000000900460ff1681565b348015610c1657600080fd5b50610427610c253660046142e0565b612a29565b348015610c3657600080fd5b5060125461049b906301000000900460ff1681565b348015610c5757600080fd5b5061046b610c663660046142e0565b6001600160a01b031660009081526018602052604090205460ff1690565b348015610c9057600080fd5b5061046b610c9f3660046142e0565b612b01565b610cad33612b01565b610cd25760405162461bcd60e51b8152600401610cc990614463565b60405180910390fd5b610cda612b61565b565b606060108054610ceb90614488565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1790614488565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b6000610d7b338484612c9a565b5060015b92915050565b6000546001600160a01b03163314610daf5760405162461bcd60e51b8152600401610cc9906144c3565b620186a08110158015610dc65750633b9aca008111155b610e2b5760405162461bcd60e51b815260206004820152603060248201527f416d6f756e74206d757374206265206265777465656e2031303020303030206160448201526f06e6420312030303020303030203030360841b6064820152608401610cc9565b610e3d81670de0b6b3a764000061450e565b60148190556040519081527fc669dc4faa0c7b1259c5e88f5729c9c6dd69e8a5ba186a73b6e51e64419499d5906020015b60405180910390a150565b610e8233612b01565b610e9e5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526007602052604090205460ff16610f115760405162461bcd60e51b815260206004820152602260248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e2066604482015261656560f01b6064820152608401610cc9565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6000610f67848484612dbe565b610fb98433610fb4856040518060600160405280602881526020016146a7602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190613264565b612c9a565b5060015b9392505050565b6000610feb610fd36000611db3565b610fe5610fe161dead611db3565b600b545b9061329e565b905090565b6000600c548211156110575760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cc9565b60006110616132e0565b9050610fbd8382612b1f565b61107633612b01565b6110925760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526009602052604090205460ff166111155760405162461bcd60e51b815260206004820152603260248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e206d604482015271185e081d1c985b9cd9995c88185b5bdd5b9d60721b6064820152608401610cc9565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fff5735b0a28f1d425bb1c17e4fb58499b4a5a5640e96c40d2b01dc2c960e0cea9190a250565b61116733612b01565b6111835760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526008602052604090205460ff166111f95760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e2072604482015264195dd85c9960da1b6064820152608401610cc9565b60005b600a5481101561131b57816001600160a01b0316600a82815481106112235761122361452d565b6000918252602090912001546001600160a01b0316141561130957600a805461124e90600190614543565b8154811061125e5761125e61452d565b600091825260209091200154600a80546001600160a01b03909216918390811061128a5761128a61452d565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff19169055600a8054806112e2576112e261455a565b600082815260209020810160001990810180546001600160a01b031916905501905561131b565b8061131381614570565b9150506111fc565b506040516001600160a01b038216907fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f90600090a250565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610d7b918590610fb49086613303565b3360008181526008602052604090205460ff161561140f5760405162461bcd60e51b815260206004820152603860248201527f4578636c75646564206164647265737365732066726f6d20726577617264206360448201527f616e6e6f742063616c6c20746869732066756e6374696f6e00000000000000006064820152608401610cc9565b600061141a83613362565b6001600160a01b038316600090815260046020526040812080549293508392909190611447908490614543565b9250508190555080600c60008282546114609190614543565b9250508190555082600f6000828254611479919061458b565b9091555050505050565b6000600b548411156114d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cc9565b826114f05760006114e785613362565b9150610fbd9050565b60006114fc8584613376565b602001519250610fbd915050565b60006115193361dead84612dbe565b6040518281527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb9060200160405180910390a1506001919050565b6000546001600160a01b0316331461157e5760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526018602052604090205460ff16156115f35760405162461bcd60e51b815260206004820152602360248201527f54686973206164647265737320697320616c726561647920626c61636b6c69736044820152621d195960ea1b6064820152608401610cc9565b6000546001600160a01b038281169116141561165f5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c697374696e6720746865206f776e6572206973206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610cc9565b6001600160a01b0381166116c75760405162461bcd60e51b815260206004820152602960248201527f426c61636b6c697374696e672074686520302061646472657373206973206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610cc9565b6013546001600160a01b038281169116141561173a5760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c697374696e67207468652070616972206164647265737320697360448201526b081b9bdd08185b1b1bddd95960a21b6064820152608401610cc9565b6001600160a01b0381163014156117ac5760405162461bcd60e51b815260206004820152603060248201527f426c61636b6c697374696e672074686520636f6e74726163742061646472657360448201526f1cc81a5cc81b9bdd08185b1b1bddd95960821b6064820152608401610cc9565b6001600160a01b038116600081815260186020908152604091829020805460ff1916600190811790915591519182527f0d995f92edc73ef0f6a26f998e26d73cf24a90c903a3339c7835457e2c96756591015b60405180910390a250565b61181333612b01565b61182f5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526008602052604090205460ff16156118a85760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015266081c995dd85c9960ca1b6064820152608401610cc9565b600a546103e810156119225760405162461bcd60e51b815260206004820152603c60248201527f4e6f206d6f7265207468616e2031303030206164647265737365732063616e2060448201527f6265206578636c756465642066726f6d207468652072657761726473000000006064820152608401610cc9565b6001600160a01b0381166000908152600460205260409020541561197c576001600160a01b03811660009081526004602052604090205461196290610ff0565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b038116600081815260086020526040808220805460ff19166001908117909155600a8054918201815583527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191684179055517f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99190a250565b6000546001600160a01b03163314611a325760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526018602052604090205460ff16611a9a5760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320616c72656164792077686974656c69737465646044820152606401610cc9565b6001600160a01b0381166000818152601860209081526040808320805460ff19169055519182527f0d995f92edc73ef0f6a26f998e26d73cf24a90c903a3339c7835457e2c96756591016117ff565b6000546001600160a01b03163314611b135760405162461bcd60e51b8152600401610cc9906144c3565b4260165411611b9b5760405162461bcd60e51b815260206004820152604860248201527f4368616e67696e67207468652074696d657374616d70206973206e6f7420616c60448201527f6c6f77656420696620746865206c697374696e672068617320616c7265616479606482015267081cdd185c9d195960c21b608482015260a401610cc9565b601655565b6000546001600160a01b03163314611bca5760405162461bcd60e51b8152600401610cc9906144c3565b600e546001600160a01b0382811691161415611c3e5760405162461bcd60e51b815260206004820152602d60248201527f546865206d61726b6574696e672077616c6c65742068617320616c726561647960448201526c2074686174206164647265737360981b6064820152608401610cc9565b600e546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556000908152600760205260409020805460ff19166001179055611cb98161180a565b50565b611cc533612b01565b611ce15760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526009602052604090205460ff1615611d675760405162461bcd60e51b815260206004820152603460248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015273081b585e081d1c985b9cd9995c88185b5bdd5b9d60621b6064820152608401610cc9565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f0d6af3e1a4bdae628fe9725f4b90680a20fa2378aff6f506b9b840d113ec61009190a250565b6001600160a01b03811660009081526008602052604081205460ff1615611df057506001600160a01b031660009081526005602052604090205490565b6001600160a01b038216600090815260046020526040902054610d7f90610ff0565b6000546001600160a01b03163314611e3c5760405162461bcd60e51b8152600401610cc9906144c3565b600080546040516001600160a01b03909116906000805160206146cf833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314611e9e5760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526017602052604090205460ff1615611f075760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420697320616c726561647920616464656400000000000000006044820152606401610cc9565b6001600160a01b03166000908152601760205260409020805460ff19166001179055565b6000546001600160a01b03163314611f555760405162461bcd60e51b8152600401610cc9906144c3565b6013546001600160a01b0382811691161415611fc55760405162461bcd60e51b815260206004820152602960248201527f546865207061697220616464726573732068617320616c72656164792074686160448201526874206164647265737360b81b6064820152608401610cc9565b6013546040516001600160a01b03918216918316907f810cdeae8b9d925700c17b8fab8708bcc9a6902e48f852ce502c88c3bd77424190600090a3601380546001600160a01b0319166001600160a01b038316908117909155611cb99061180a565b6000546001600160a01b031633146120515760405162461bcd60e51b8152600401610cc9906144c3565b600047116120ab5760405162461bcd60e51b815260206004820152602160248201527f546865726520617265206e6f20424e427320696e2074686520636f6e747261636044820152601d60fa1b6064820152608401610cc9565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156120e0573d6000803e3d6000fd5b5050565b606060118054610ceb90614488565b6120fc33612b01565b6121185760405162461bcd60e51b8152600401610cc990614463565b6013546001600160a01b03838116911614156121aa5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610cc9565b6120e08282613400565b6000546001600160a01b031633146121de5760405162461bcd60e51b8152600401610cc9906144c3565b6000816121eb84866145a3565b6121f591906145a3565b9050600a8160ff1611156122615760405162461bcd60e51b815260206004820152602d60248201527f546f74616c206275792066656573206d757374206265206c6f776572206f722060448201526c657175616c7320746f2031302560981b6064820152608401610cc9565b6012805464ff00ff000019166201000060ff87811691820264ff000000001916929092176401000000008784169081029190911768ff00ff0000000000001916600160301b87851690810268ff0000000000000000191691909117680100000000000000009487169490940293909317909355604080519182526020820193909352918201527fc395676cdc7e4360509539f8ae41203ef3ebd473f39fb311449a278eb2e7f535906060015b60405180910390a150505050565b6000610d7b3384610fb4856040518060600160405280602581526020016146ef602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190613264565b6001546001600160a01b031633146123d05760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610cc9565b60025442116124215760405162461bcd60e51b815260206004820152601860248201527f436f6e7472616374206973207374696c6c206c6f636b656400000000000000006044820152606401610cc9565b600154600080546040516001600160a01b0393841693909116916000805160206146cf83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610d7b338484612dbe565b6000546001600160a01b031633146124a75760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146124f55760405162461bcd60e51b8152600401610cc9906144c3565b6012546001600160a01b03828116600160481b9092041614156125665760405162461bcd60e51b815260206004820152602360248201527f54686520726f757465722068617320616c72656164792074686174206164647260448201526265737360e81b6064820152608401610cc9565b6012546040516001600160a01b03600160481b9092048216918316907feb8d61f6daf24f1091115a70adc941fd8537cfa96f53bfaf282c6bb3cfc5e6e690600090a3601280546001600160a01b03909216600160481b027fffffff0000000000000000000000000000000000000000ffffffffffffffffff909216919091179055565b6000546001600160a01b031633146126135760405162461bcd60e51b8152600401610cc9906144c3565b60138054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e6e90831515815260200190565b6000546001600160a01b0316331461268a5760405162461bcd60e51b8152600401610cc9906144c3565b60008161269784866145a3565b6126a191906145a3565b9050600f8160ff16111561270e5760405162461bcd60e51b815260206004820152602e60248201527f546f74616c2073656c6c2066656573206d757374206265206c6f776572206f7260448201526d20657175616c7320746f2031352560901b6064820152608401610cc9565b6012805463ff00ff00191661010060ff87811691820263ff00000019169290921763010000008784169081029190911767ff00ff000000000019166501000000000087851690810267ff000000000000001916919091176701000000000000009487169490940293909317909355604080519182526020820193909352918201527f055bc0d94dbe37bf4e00b629dc529045ad1546901f2291b828a5c4d2592cbd819060600161230d565b6000546001600160a01b031633146127e35760405162461bcd60e51b8152600401610cc9906144c3565b6103e881101580156127f95750633b9aca008111155b61285b5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e74206d757374206265206265777465656e203130303020616e642060448201526c03120303030203030302030303609c1b6064820152608401610cc9565b61286d81670de0b6b3a764000061450e565b60155550565b6000546001600160a01b0316331461289d5760405162461bcd60e51b8152600401610cc9906144c3565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556128cc814261458b565b600255600080546040516001600160a01b03909116906000805160206146cf833981519152908390a350565b61290133612b01565b61291d5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526007602052604090205460ff16156129925760405162461bcd60e51b8152602060048201526024808201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d6044820152632066656560e01b6064820152608401610cc9565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6000546001600160a01b03163314612a085760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314612a535760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b038116612ab85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc9565b600080546040516001600160a01b03808516939216916000805160206146cf83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526003602052604090205460ff1690565b6000610fbd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613507565b6013805460ff60a01b1916600160a01b1790556000612b7f30611db3565b90506000612b9e601b54610fe5601a548561329e90919063ffffffff16565b905080601b6000828254612bb2919061458b565b9091555050601b54600090612bc8906002612b1f565b905047612bdd612bd8858461329e565b613535565b6000612be9478361329e565b90506000612c0e612bfa878661329e565b601a54612c089085906136b6565b90612b1f565b90506000612c1c838361329e565b6000601a819055601b559050612c328582613735565b612c3b826137f7565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561612c66888761329e565b6040805191825260208201869052810187905260600160405180910390a150506013805460ff60a01b191690555050505050565b6001600160a01b038316612cfc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc9565b6001600160a01b038216612d5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc9565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612e225760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cc9565b6001600160a01b038216612e845760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cc9565b6001600160a01b03821660009081526018602052604090205460ff1615612eed5760405162461bcd60e51b815260206004820152601760248201527f526563697069656e74206973206261636b6c69737465640000000000000000006044820152606401610cc9565b6001600160a01b03831660009081526018602052604090205460ff1615612f4d5760405162461bcd60e51b815260206004820152601460248201527314d95b99195c881a5cc8189858dadb1a5cdd195960621b6044820152606401610cc9565b6000612f5b60165442101590565b905080612ff0576001600160a01b03841660009081526017602052604090205460ff16612ff05760405162461bcd60e51b815260206004820152603860248201527f54686973206163636f756e742063616e6e6f742073656e6420746f6b656e732060448201527f756e74696c2074726164696e6720697320656e61626c656400000000000000006064820152608401610cc9565b6001600160a01b03831660009081526019602052604090205460135460ff91821691600160a01b909104161580156130255750815b801561302e5750805b801561304f57506012546001600160a01b03868116600160481b9092041614155b801561307457506001600160a01b03841660009081526009602052604090205460ff16155b801561309957506001600160a01b03851660009081526009602052604090205460ff16155b15613116576014548311156131165760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610cc9565b600061312130611db3565b601554909150811080159081906131425750601354600160a01b900460ff16155b801561316757506001600160a01b03871660009081526019602052604090205460ff16155b80156131815750600d546001600160a01b03888116911614155b801561319b5750600d546001600160a01b03878116911614155b80156131b05750601354600160a81b900460ff165b156131bd576131bd612b61565b6001600160a01b03871660009081526019602052604081205460ff16908580156131f15750601354600160a01b900460ff16155b8015613201575081806132015750845b6001600160a01b038a1660009081526007602052604090205490915060ff168061324357506001600160a01b03881660009081526007602052604090205460ff165b1561324c575060005b613259898989848961388a565b505050505050505050565b600081848411156132885760405162461bcd60e51b8152600401610cc99190614231565b5060006132958486614543565b95945050505050565b6000610fbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613264565b60008060006132ed613b39565b90925090506132fc8282612b1f565b9250505090565b600080613310838561458b565b905083811015610fbd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cc9565b6000610d7f61336f6132e0565b83906136b6565b6133a86040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6133da6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60006133e68585613cbb565b905060006133f382613d45565b9196919550909350505050565b6001600160a01b03821660009081526019602052604090205460ff16151581151514156134955760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cc9565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556134cb576134cb8261180a565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836135285760405162461bcd60e51b8152600401610cc99190614231565b50600061329584866145c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061356a5761356a61452d565b60200260200101906001600160a01b031690816001600160a01b031681525050601260099054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360191906145ea565b816001815181106136145761361461452d565b6001600160a01b039283166020918202929092010152601254613641913091600160481b90041684612c9a565b60125460405163791ac94760e01b8152600160481b9091046001600160a01b03169063791ac94790613680908590600090869030904290600401614607565b600060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b505050505050565b6000826136c557506000610d7f565b60006136d1838561450e565b9050826136de85836145c8565b14610fbd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cc9565b601254613754903090600160481b90046001600160a01b031684612c9a565b601254600d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152600160481b909204169063f305d71990839060c40160606040518083038185885af11580156137cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137f09190614678565b5050505050565b600e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613844576040519150601f19603f3d011682016040523d82523d6000602084013e613849565b606091505b5050905080156120e0576040518281527f5aa109c2bc1af426c123454c7b5e7932fc32d6e634889dff405a24c9f2e805ed9060200160405180910390a15050565b6138bc6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6138ee6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b83613967576040518060a00160405280868152602001868152602001600081526020016000815260200160008152509150600061393361392c6132e0565b87906136b6565b90506040518060a0016040528082815260200182815260200160008152602001600081526020016000815250915050613977565b6139718584613376565b90925090505b6001600160a01b03871660009081526008602052604090205460ff1680156139b857506001600160a01b03861660009081526008602052604090205460ff16155b156139ce576139c987878484613e28565b613ace565b6001600160a01b03871660009081526008602052604090205460ff16158015613a0f57506001600160a01b03861660009081526008602052604090205460ff165b15613a20576139c987878484613ec0565b6001600160a01b03871660009081526008602052604090205460ff16158015613a6257506001600160a01b03861660009081526008602052604090205460ff16155b15613a72576139c9878783613f1e565b6001600160a01b03871660009081526008602052604090205460ff168015613ab257506001600160a01b03861660009081526008602052604090205460ff165b15613ac3576139c987878484613f7c565b613ace878783613f1e565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051613b1791815260200190565b60405180910390a38315613b3057613b30828289613fd5565b50505050505050565b600c54600b546000918291825b600a54811015613c8b578260046000600a8481548110613b6857613b6861452d565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613bd357508160056000600a8481548110613bac57613bac61452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613be957600c54600b54945094505050509091565b60046000600a8381548110613c0057613c0061452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613c2f9084614543565b925060056000600a8381548110613c4857613c4861452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613c779083614543565b915080613c8381614570565b915050613b46565b50600b54600c54613c9b91612b1f565b821015613cb257600c54600b549350935050509091565b90939092509050565b613ced6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000806000613cfc8686614112565b919450925090506000613d1582610fe585818b8961329e565b6040805160a081018252988952602089019190915287019390935260608601919091526080850152509192915050565b613d776040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000613d816132e0565b8351909150600090613d9390836136b6565b90506000613dae8386604001516136b690919063ffffffff16565b90506000613dc98487606001516136b690919063ffffffff16565b90506000613de48588608001516136b690919063ffffffff16565b90506000613df882610fe58581898961329e565b6040805160a081018252968752602087019190915285019390935260608401919091526080830152509392505050565b81516001600160a01b03851660009081526005602052604081208054909190613e52908490614543565b909155505080516001600160a01b03851660009081526004602052604081208054909190613e81908490614543565b90915550506020808201516001600160a01b0385166000908152600490925260408220805491929091613eb590849061458b565b909155505050505050565b80516001600160a01b03851660009081526004602052604081208054909190613eea908490614543565b90915550506020808301516001600160a01b0385166000908152600590925260408220805491929091613e8190849061458b565b80516001600160a01b03841660009081526004602052604081208054909190613f48908490614543565b90915550506020808201516001600160a01b038416600090815260049092526040822080549192909161147990849061458b565b81516001600160a01b03851660009081526005602052604081208054909190613fa6908490614543565b909155505080516001600160a01b03851660009081526004602052604081208054909190613eea908490614543565b6000613ff28360600151846080015161330390919063ffffffff16565b905060006140118560600151866080015161330390919063ffffffff16565b90508460600151601b6000828254614029919061458b565b90915550506080850151601a805460009061404590849061458b565b9091555050306000908152600460205260409020546140649083613303565b30600081815260046020526040908190209290925590516001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906140b59085815260200190565b60405180910390a33060009081526008602052604090205460ff161561410057306000908152600560205260409020546140ef9082613303565b306000908152600560205260409020555b6137f0846040015186604001516141fd565b600080600083156141945760125460649061413590610100900460ff168761450e565b61413f91906145c8565b601254606490614159906301000000900460ff168861450e565b61416391906145c8565b60125460649061417f9065010000000000900460ff168961450e565b61418991906145c8565b9250925092506141f6565b6012546064906141ad9062010000900460ff168761450e565b6141b791906145c8565b6012546064906141d290640100000000900460ff168861450e565b6141dc91906145c8565b60125460649061417f90600160301b900460ff168961450e565b9250925092565b81600c600082825461420f9190614543565b9250508190555080600f6000828254614228919061458b565b90915550505050565b600060208083528351808285015260005b8181101561425e57858101830151858201604001528201614242565b81811115614270576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611cb957600080fd5b600080604083850312156142ae57600080fd5b82356142b981614286565b946020939093013593505050565b6000602082840312156142d957600080fd5b5035919050565b6000602082840312156142f257600080fd5b8135610fbd81614286565b60008060006060848603121561431257600080fd5b833561431d81614286565b9250602084013561432d81614286565b929592945050506040919091013590565b8035801515811461434e57600080fd5b919050565b60008060006060848603121561436857600080fd5b833592506143786020850161433e565b91506143866040850161433e565b90509250925092565b600080604083850312156143a257600080fd5b82356143ad81614286565b91506143bb6020840161433e565b90509250929050565b803560ff8116811461434e57600080fd5b6000806000606084860312156143ea57600080fd5b6143f3846143c4565b9250614401602085016143c4565b9150614386604085016143c4565b60006020828403121561442157600080fd5b610fbd8261433e565b6000806040838503121561443d57600080fd5b823561444881614286565b9150602083013561445881614286565b809150509250929050565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b600181811c9082168061449c57607f821691505b602082108114156144bd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614528576145286144f8565b500290565b634e487b7160e01b600052603260045260246000fd5b600082821015614555576145556144f8565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415614584576145846144f8565b5060010190565b6000821982111561459e5761459e6144f8565b500190565b600060ff821660ff84168060ff038211156145c0576145c06144f8565b019392505050565b6000826145e557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156145fc57600080fd5b8151610fbd81614286565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156146575784516001600160a01b031683529383019391830191600101614632565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561468d57600080fd5b835192506020840151915060408401519050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e042455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e4732ed810f8a700d51ca1750e3bbf84ac96374fb2de8aa2a22b1522f54fe48e64736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103dd5760003560e01c8063734a3873116101fd578063b62496f511610118578063dd62ed3e116100ab578063f11a24d31161007a578063f11a24d314610be8578063f2fde38b14610c0a578063f637434214610c2a578063fe575a8714610c4b578063fe9fbb8014610c8457600080fd5b8063dd62ed3e14610b43578063de0aad5314610b89578063e57f14e114610ba8578063f0b37c0414610bc857600080fd5b8063d4698016116100e7578063d469801614610ac3578063d47274a314610ae3578063db84527d14610b03578063dd46706414610b2357600080fd5b8063b62496f514610a33578063b6a5d7de14610a63578063c337083714610a83578063c49b9a8014610aa357600080fd5b806395d89b4111610190578063a457c2d71161015f578063a457c2d7146109c9578063a593015f146109e9578063a69df4b5146109fe578063a9059cbb14610a1357600080fd5b806395d89b411461093b5780639a7a23d6146109505780639cf7522814610970578063a0d3b8eb146109a957600080fd5b806388f82020116101cc57806388f82020146108a15780638da5cb5b146108da5780638fb28310146108f8578063921369131461091857600080fd5b8063734a38731461082057806375f0a8741461084057806378fe1b13146108605780637bce5a041461088057600080fd5b806339509351116102f857806352390c021161028b5780635d098b381161025a5780635d098b3814610796578063602bc62b146107b65780636af53e8a146107cb57806370a08231146107eb578063715018a61461080b57600080fd5b806352390c02146106fd5780635342acb41461071d578063537df3b6146107565780635802e4031461077657600080fd5b80634838d165116102c75780634838d1651461068457806349bd5a5e146106a45780634a74bb02146106c45780634d33b1ef146106e557600080fd5b806339509351146106045780633bd5d173146106245780633f63d40f1461064457806342966c681461066457600080fd5b806318160ddd116103705780632d8381191161033f5780632d8381191461058c578063313ce567146105ac57806333cfb96e146105c45780633685d419146105e457600080fd5b806318160ddd1461052c57806323b872dd1461054157806325b61703146105615780632b112e491461057757600080fd5b80630cfe2f3f116103ac5780630cfe2f3f1461047b57806316216e5f146104ad5780631694505e146104cd57806316a2f82a1461050c57600080fd5b806302259e9e146103e95780630346535f1461041257806306fdde0314610429578063095ea7b31461044b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103ff60145481565b6040519081526020015b60405180910390f35b34801561041e57600080fd5b50610427610ca4565b005b34801561043557600080fd5b5061043e610cdc565b6040516104099190614231565b34801561045757600080fd5b5061046b61046636600461429b565b610d6e565b6040519015158152602001610409565b34801561048757600080fd5b5060125461049b9062010000900460ff1681565b60405160ff9091168152602001610409565b3480156104b957600080fd5b506104276104c83660046142c7565b610d85565b3480156104d957600080fd5b506012546104f490600160481b90046001600160a01b031681565b6040516001600160a01b039091168152602001610409565b34801561051857600080fd5b506104276105273660046142e0565b610e79565b34801561053857600080fd5b50600b546103ff565b34801561054d57600080fd5b5061046b61055c3660046142fd565b610f5a565b34801561056d57600080fd5b506103ff60165481565b34801561058357600080fd5b506103ff610fc4565b34801561059857600080fd5b506103ff6105a73660046142c7565b610ff0565b3480156105b857600080fd5b5060125460ff1661049b565b3480156105d057600080fd5b506104276105df3660046142e0565b61106d565b3480156105f057600080fd5b506104276105ff3660046142e0565b61115e565b34801561061057600080fd5b5061046b61061f36600461429b565b611353565b34801561063057600080fd5b5061042761063f3660046142c7565b611389565b34801561065057600080fd5b506103ff61065f366004614353565b611483565b34801561067057600080fd5b5061046b61067f3660046142c7565b61150a565b34801561069057600080fd5b5061042761069f3660046142e0565b611554565b3480156106b057600080fd5b506013546104f4906001600160a01b031681565b3480156106d057600080fd5b5060135461046b90600160a81b900460ff1681565b3480156106f157600080fd5b5060165442101561046b565b34801561070957600080fd5b506104276107183660046142e0565b61180a565b34801561072957600080fd5b5061046b6107383660046142e0565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076257600080fd5b506104276107713660046142e0565b611a08565b34801561078257600080fd5b506104276107913660046142c7565b611ae9565b3480156107a257600080fd5b506104276107b13660046142e0565b611ba0565b3480156107c257600080fd5b506002546103ff565b3480156107d757600080fd5b506104276107e63660046142e0565b611cbc565b3480156107f757600080fd5b506103ff6108063660046142e0565b611db3565b34801561081757600080fd5b50610427611e12565b34801561082c57600080fd5b5061042761083b3660046142e0565b611e74565b34801561084c57600080fd5b50600e546104f4906001600160a01b031681565b34801561086c57600080fd5b5061042761087b3660046142e0565b611f2b565b34801561088c57600080fd5b5060125461049b90600160301b900460ff1681565b3480156108ad57600080fd5b5061046b6108bc3660046142e0565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156108e657600080fd5b506000546001600160a01b03166104f4565b34801561090457600080fd5b506104276109133660046142e0565b612027565b34801561092457600080fd5b5060125461049b9065010000000000900460ff1681565b34801561094757600080fd5b5061043e6120e4565b34801561095c57600080fd5b5061042761096b36600461438f565b6120f3565b34801561097c57600080fd5b5061046b61098b3660046142e0565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156109b557600080fd5b506104276109c43660046143d5565b6121b4565b3480156109d557600080fd5b5061046b6109e436600461429b565b61231b565b3480156109f557600080fd5b50600f546103ff565b348015610a0a57600080fd5b5061042761236a565b348015610a1f57600080fd5b5061046b610a2e36600461429b565b612470565b348015610a3f57600080fd5b5061046b610a4e3660046142e0565b60196020526000908152604090205460ff1681565b348015610a6f57600080fd5b50610427610a7e3660046142e0565b61247d565b348015610a8f57600080fd5b50610427610a9e3660046142e0565b6124cb565b348015610aaf57600080fd5b50610427610abe36600461440f565b6125e9565b348015610acf57600080fd5b50600d546104f4906001600160a01b031681565b348015610aef57600080fd5b50610427610afe3660046143d5565b612660565b348015610b0f57600080fd5b50610427610b1e3660046142c7565b6127b9565b348015610b2f57600080fd5b50610427610b3e3660046142c7565b612873565b348015610b4f57600080fd5b506103ff610b5e36600461442a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610b9557600080fd5b5060125461049b90610100900460ff1681565b348015610bb457600080fd5b50610427610bc33660046142e0565b6128f8565b348015610bd457600080fd5b50610427610be33660046142e0565b6129de565b348015610bf457600080fd5b5060125461049b90640100000000900460ff1681565b348015610c1657600080fd5b50610427610c253660046142e0565b612a29565b348015610c3657600080fd5b5060125461049b906301000000900460ff1681565b348015610c5757600080fd5b5061046b610c663660046142e0565b6001600160a01b031660009081526018602052604090205460ff1690565b348015610c9057600080fd5b5061046b610c9f3660046142e0565b612b01565b610cad33612b01565b610cd25760405162461bcd60e51b8152600401610cc990614463565b60405180910390fd5b610cda612b61565b565b606060108054610ceb90614488565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1790614488565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b6000610d7b338484612c9a565b5060015b92915050565b6000546001600160a01b03163314610daf5760405162461bcd60e51b8152600401610cc9906144c3565b620186a08110158015610dc65750633b9aca008111155b610e2b5760405162461bcd60e51b815260206004820152603060248201527f416d6f756e74206d757374206265206265777465656e2031303020303030206160448201526f06e6420312030303020303030203030360841b6064820152608401610cc9565b610e3d81670de0b6b3a764000061450e565b60148190556040519081527fc669dc4faa0c7b1259c5e88f5729c9c6dd69e8a5ba186a73b6e51e64419499d5906020015b60405180910390a150565b610e8233612b01565b610e9e5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526007602052604090205460ff16610f115760405162461bcd60e51b815260206004820152602260248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e2066604482015261656560f01b6064820152608401610cc9565b6001600160a01b038116600081815260076020526040808220805460ff19169055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6000610f67848484612dbe565b610fb98433610fb4856040518060600160405280602881526020016146a7602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190613264565b612c9a565b5060015b9392505050565b6000610feb610fd36000611db3565b610fe5610fe161dead611db3565b600b545b9061329e565b905090565b6000600c548211156110575760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cc9565b60006110616132e0565b9050610fbd8382612b1f565b61107633612b01565b6110925760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526009602052604090205460ff166111155760405162461bcd60e51b815260206004820152603260248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e206d604482015271185e081d1c985b9cd9995c88185b5bdd5b9d60721b6064820152608401610cc9565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fff5735b0a28f1d425bb1c17e4fb58499b4a5a5640e96c40d2b01dc2c960e0cea9190a250565b61116733612b01565b6111835760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526008602052604090205460ff166111f95760405162461bcd60e51b815260206004820152602560248201527f4163636f756e7420697320616c726561647920696e636c7564656420696e2072604482015264195dd85c9960da1b6064820152608401610cc9565b60005b600a5481101561131b57816001600160a01b0316600a82815481106112235761122361452d565b6000918252602090912001546001600160a01b0316141561130957600a805461124e90600190614543565b8154811061125e5761125e61452d565b600091825260209091200154600a80546001600160a01b03909216918390811061128a5761128a61452d565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff19169055600a8054806112e2576112e261455a565b600082815260209020810160001990810180546001600160a01b031916905501905561131b565b8061131381614570565b9150506111fc565b506040516001600160a01b038216907fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f90600090a250565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610d7b918590610fb49086613303565b3360008181526008602052604090205460ff161561140f5760405162461bcd60e51b815260206004820152603860248201527f4578636c75646564206164647265737365732066726f6d20726577617264206360448201527f616e6e6f742063616c6c20746869732066756e6374696f6e00000000000000006064820152608401610cc9565b600061141a83613362565b6001600160a01b038316600090815260046020526040812080549293508392909190611447908490614543565b9250508190555080600c60008282546114609190614543565b9250508190555082600f6000828254611479919061458b565b9091555050505050565b6000600b548411156114d75760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cc9565b826114f05760006114e785613362565b9150610fbd9050565b60006114fc8584613376565b602001519250610fbd915050565b60006115193361dead84612dbe565b6040518281527fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb9060200160405180910390a1506001919050565b6000546001600160a01b0316331461157e5760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526018602052604090205460ff16156115f35760405162461bcd60e51b815260206004820152602360248201527f54686973206164647265737320697320616c726561647920626c61636b6c69736044820152621d195960ea1b6064820152608401610cc9565b6000546001600160a01b038281169116141561165f5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c697374696e6720746865206f776e6572206973206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610cc9565b6001600160a01b0381166116c75760405162461bcd60e51b815260206004820152602960248201527f426c61636b6c697374696e672074686520302061646472657373206973206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610cc9565b6013546001600160a01b038281169116141561173a5760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c697374696e67207468652070616972206164647265737320697360448201526b081b9bdd08185b1b1bddd95960a21b6064820152608401610cc9565b6001600160a01b0381163014156117ac5760405162461bcd60e51b815260206004820152603060248201527f426c61636b6c697374696e672074686520636f6e74726163742061646472657360448201526f1cc81a5cc81b9bdd08185b1b1bddd95960821b6064820152608401610cc9565b6001600160a01b038116600081815260186020908152604091829020805460ff1916600190811790915591519182527f0d995f92edc73ef0f6a26f998e26d73cf24a90c903a3339c7835457e2c96756591015b60405180910390a250565b61181333612b01565b61182f5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526008602052604090205460ff16156118a85760405162461bcd60e51b815260206004820152602760248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015266081c995dd85c9960ca1b6064820152608401610cc9565b600a546103e810156119225760405162461bcd60e51b815260206004820152603c60248201527f4e6f206d6f7265207468616e2031303030206164647265737365732063616e2060448201527f6265206578636c756465642066726f6d207468652072657761726473000000006064820152608401610cc9565b6001600160a01b0381166000908152600460205260409020541561197c576001600160a01b03811660009081526004602052604090205461196290610ff0565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b038116600081815260086020526040808220805460ff19166001908117909155600a8054918201815583527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191684179055517f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99190a250565b6000546001600160a01b03163314611a325760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526018602052604090205460ff16611a9a5760405162461bcd60e51b815260206004820181905260248201527f54686973206164647265737320616c72656164792077686974656c69737465646044820152606401610cc9565b6001600160a01b0381166000818152601860209081526040808320805460ff19169055519182527f0d995f92edc73ef0f6a26f998e26d73cf24a90c903a3339c7835457e2c96756591016117ff565b6000546001600160a01b03163314611b135760405162461bcd60e51b8152600401610cc9906144c3565b4260165411611b9b5760405162461bcd60e51b815260206004820152604860248201527f4368616e67696e67207468652074696d657374616d70206973206e6f7420616c60448201527f6c6f77656420696620746865206c697374696e672068617320616c7265616479606482015267081cdd185c9d195960c21b608482015260a401610cc9565b601655565b6000546001600160a01b03163314611bca5760405162461bcd60e51b8152600401610cc9906144c3565b600e546001600160a01b0382811691161415611c3e5760405162461bcd60e51b815260206004820152602d60248201527f546865206d61726b6574696e672077616c6c65742068617320616c726561647960448201526c2074686174206164647265737360981b6064820152608401610cc9565b600e546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b0319166001600160a01b0383169081179091556000908152600760205260409020805460ff19166001179055611cb98161180a565b50565b611cc533612b01565b611ce15760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526009602052604090205460ff1615611d675760405162461bcd60e51b815260206004820152603460248201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d604482015273081b585e081d1c985b9cd9995c88185b5bdd5b9d60621b6064820152608401610cc9565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f0d6af3e1a4bdae628fe9725f4b90680a20fa2378aff6f506b9b840d113ec61009190a250565b6001600160a01b03811660009081526008602052604081205460ff1615611df057506001600160a01b031660009081526005602052604090205490565b6001600160a01b038216600090815260046020526040902054610d7f90610ff0565b6000546001600160a01b03163314611e3c5760405162461bcd60e51b8152600401610cc9906144c3565b600080546040516001600160a01b03909116906000805160206146cf833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314611e9e5760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03811660009081526017602052604090205460ff1615611f075760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420697320616c726561647920616464656400000000000000006044820152606401610cc9565b6001600160a01b03166000908152601760205260409020805460ff19166001179055565b6000546001600160a01b03163314611f555760405162461bcd60e51b8152600401610cc9906144c3565b6013546001600160a01b0382811691161415611fc55760405162461bcd60e51b815260206004820152602960248201527f546865207061697220616464726573732068617320616c72656164792074686160448201526874206164647265737360b81b6064820152608401610cc9565b6013546040516001600160a01b03918216918316907f810cdeae8b9d925700c17b8fab8708bcc9a6902e48f852ce502c88c3bd77424190600090a3601380546001600160a01b0319166001600160a01b038316908117909155611cb99061180a565b6000546001600160a01b031633146120515760405162461bcd60e51b8152600401610cc9906144c3565b600047116120ab5760405162461bcd60e51b815260206004820152602160248201527f546865726520617265206e6f20424e427320696e2074686520636f6e747261636044820152601d60fa1b6064820152608401610cc9565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156120e0573d6000803e3d6000fd5b5050565b606060118054610ceb90614488565b6120fc33612b01565b6121185760405162461bcd60e51b8152600401610cc990614463565b6013546001600160a01b03838116911614156121aa5760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610cc9565b6120e08282613400565b6000546001600160a01b031633146121de5760405162461bcd60e51b8152600401610cc9906144c3565b6000816121eb84866145a3565b6121f591906145a3565b9050600a8160ff1611156122615760405162461bcd60e51b815260206004820152602d60248201527f546f74616c206275792066656573206d757374206265206c6f776572206f722060448201526c657175616c7320746f2031302560981b6064820152608401610cc9565b6012805464ff00ff000019166201000060ff87811691820264ff000000001916929092176401000000008784169081029190911768ff00ff0000000000001916600160301b87851690810268ff0000000000000000191691909117680100000000000000009487169490940293909317909355604080519182526020820193909352918201527fc395676cdc7e4360509539f8ae41203ef3ebd473f39fb311449a278eb2e7f535906060015b60405180910390a150505050565b6000610d7b3384610fb4856040518060600160405280602581526020016146ef602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190613264565b6001546001600160a01b031633146123d05760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610cc9565b60025442116124215760405162461bcd60e51b815260206004820152601860248201527f436f6e7472616374206973207374696c6c206c6f636b656400000000000000006044820152606401610cc9565b600154600080546040516001600160a01b0393841693909116916000805160206146cf83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610d7b338484612dbe565b6000546001600160a01b031633146124a75760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146124f55760405162461bcd60e51b8152600401610cc9906144c3565b6012546001600160a01b03828116600160481b9092041614156125665760405162461bcd60e51b815260206004820152602360248201527f54686520726f757465722068617320616c72656164792074686174206164647260448201526265737360e81b6064820152608401610cc9565b6012546040516001600160a01b03600160481b9092048216918316907feb8d61f6daf24f1091115a70adc941fd8537cfa96f53bfaf282c6bb3cfc5e6e690600090a3601280546001600160a01b03909216600160481b027fffffff0000000000000000000000000000000000000000ffffffffffffffffff909216919091179055565b6000546001600160a01b031633146126135760405162461bcd60e51b8152600401610cc9906144c3565b60138054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e6e90831515815260200190565b6000546001600160a01b0316331461268a5760405162461bcd60e51b8152600401610cc9906144c3565b60008161269784866145a3565b6126a191906145a3565b9050600f8160ff16111561270e5760405162461bcd60e51b815260206004820152602e60248201527f546f74616c2073656c6c2066656573206d757374206265206c6f776572206f7260448201526d20657175616c7320746f2031352560901b6064820152608401610cc9565b6012805463ff00ff00191661010060ff87811691820263ff00000019169290921763010000008784169081029190911767ff00ff000000000019166501000000000087851690810267ff000000000000001916919091176701000000000000009487169490940293909317909355604080519182526020820193909352918201527f055bc0d94dbe37bf4e00b629dc529045ad1546901f2291b828a5c4d2592cbd819060600161230d565b6000546001600160a01b031633146127e35760405162461bcd60e51b8152600401610cc9906144c3565b6103e881101580156127f95750633b9aca008111155b61285b5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e74206d757374206265206265777465656e203130303020616e642060448201526c03120303030203030302030303609c1b6064820152608401610cc9565b61286d81670de0b6b3a764000061450e565b60155550565b6000546001600160a01b0316331461289d5760405162461bcd60e51b8152600401610cc9906144c3565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556128cc814261458b565b600255600080546040516001600160a01b03909116906000805160206146cf833981519152908390a350565b61290133612b01565b61291d5760405162461bcd60e51b8152600401610cc990614463565b6001600160a01b03811660009081526007602052604090205460ff16156129925760405162461bcd60e51b8152602060048201526024808201527f4163636f756e7420697320616c7265616479206578636c756465642066726f6d6044820152632066656560e01b6064820152608401610cc9565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6000546001600160a01b03163314612a085760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314612a535760405162461bcd60e51b8152600401610cc9906144c3565b6001600160a01b038116612ab85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc9565b600080546040516001600160a01b03808516939216916000805160206146cf83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526003602052604090205460ff1690565b6000610fbd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613507565b6013805460ff60a01b1916600160a01b1790556000612b7f30611db3565b90506000612b9e601b54610fe5601a548561329e90919063ffffffff16565b905080601b6000828254612bb2919061458b565b9091555050601b54600090612bc8906002612b1f565b905047612bdd612bd8858461329e565b613535565b6000612be9478361329e565b90506000612c0e612bfa878661329e565b601a54612c089085906136b6565b90612b1f565b90506000612c1c838361329e565b6000601a819055601b559050612c328582613735565b612c3b826137f7565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561612c66888761329e565b6040805191825260208201869052810187905260600160405180910390a150506013805460ff60a01b191690555050505050565b6001600160a01b038316612cfc5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc9565b6001600160a01b038216612d5d5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc9565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612e225760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cc9565b6001600160a01b038216612e845760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cc9565b6001600160a01b03821660009081526018602052604090205460ff1615612eed5760405162461bcd60e51b815260206004820152601760248201527f526563697069656e74206973206261636b6c69737465640000000000000000006044820152606401610cc9565b6001600160a01b03831660009081526018602052604090205460ff1615612f4d5760405162461bcd60e51b815260206004820152601460248201527314d95b99195c881a5cc8189858dadb1a5cdd195960621b6044820152606401610cc9565b6000612f5b60165442101590565b905080612ff0576001600160a01b03841660009081526017602052604090205460ff16612ff05760405162461bcd60e51b815260206004820152603860248201527f54686973206163636f756e742063616e6e6f742073656e6420746f6b656e732060448201527f756e74696c2074726164696e6720697320656e61626c656400000000000000006064820152608401610cc9565b6001600160a01b03831660009081526019602052604090205460135460ff91821691600160a01b909104161580156130255750815b801561302e5750805b801561304f57506012546001600160a01b03868116600160481b9092041614155b801561307457506001600160a01b03841660009081526009602052604090205460ff16155b801561309957506001600160a01b03851660009081526009602052604090205460ff16155b15613116576014548311156131165760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610cc9565b600061312130611db3565b601554909150811080159081906131425750601354600160a01b900460ff16155b801561316757506001600160a01b03871660009081526019602052604090205460ff16155b80156131815750600d546001600160a01b03888116911614155b801561319b5750600d546001600160a01b03878116911614155b80156131b05750601354600160a81b900460ff165b156131bd576131bd612b61565b6001600160a01b03871660009081526019602052604081205460ff16908580156131f15750601354600160a01b900460ff16155b8015613201575081806132015750845b6001600160a01b038a1660009081526007602052604090205490915060ff168061324357506001600160a01b03881660009081526007602052604090205460ff165b1561324c575060005b613259898989848961388a565b505050505050505050565b600081848411156132885760405162461bcd60e51b8152600401610cc99190614231565b5060006132958486614543565b95945050505050565b6000610fbd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613264565b60008060006132ed613b39565b90925090506132fc8282612b1f565b9250505090565b600080613310838561458b565b905083811015610fbd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cc9565b6000610d7f61336f6132e0565b83906136b6565b6133a86040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6133da6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60006133e68585613cbb565b905060006133f382613d45565b9196919550909350505050565b6001600160a01b03821660009081526019602052604090205460ff16151581151514156134955760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cc9565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556134cb576134cb8261180a565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600081836135285760405162461bcd60e51b8152600401610cc99190614231565b50600061329584866145c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061356a5761356a61452d565b60200260200101906001600160a01b031690816001600160a01b031681525050601260099054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360191906145ea565b816001815181106136145761361461452d565b6001600160a01b039283166020918202929092010152601254613641913091600160481b90041684612c9a565b60125460405163791ac94760e01b8152600160481b9091046001600160a01b03169063791ac94790613680908590600090869030904290600401614607565b600060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b505050505050565b6000826136c557506000610d7f565b60006136d1838561450e565b9050826136de85836145c8565b14610fbd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cc9565b601254613754903090600160481b90046001600160a01b031684612c9a565b601254600d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a4820152600160481b909204169063f305d71990839060c40160606040518083038185885af11580156137cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137f09190614678565b5050505050565b600e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613844576040519150601f19603f3d011682016040523d82523d6000602084013e613849565b606091505b5050905080156120e0576040518281527f5aa109c2bc1af426c123454c7b5e7932fc32d6e634889dff405a24c9f2e805ed9060200160405180910390a15050565b6138bc6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6138ee6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b83613967576040518060a00160405280868152602001868152602001600081526020016000815260200160008152509150600061393361392c6132e0565b87906136b6565b90506040518060a0016040528082815260200182815260200160008152602001600081526020016000815250915050613977565b6139718584613376565b90925090505b6001600160a01b03871660009081526008602052604090205460ff1680156139b857506001600160a01b03861660009081526008602052604090205460ff16155b156139ce576139c987878484613e28565b613ace565b6001600160a01b03871660009081526008602052604090205460ff16158015613a0f57506001600160a01b03861660009081526008602052604090205460ff165b15613a20576139c987878484613ec0565b6001600160a01b03871660009081526008602052604090205460ff16158015613a6257506001600160a01b03861660009081526008602052604090205460ff16155b15613a72576139c9878783613f1e565b6001600160a01b03871660009081526008602052604090205460ff168015613ab257506001600160a01b03861660009081526008602052604090205460ff165b15613ac3576139c987878484613f7c565b613ace878783613f1e565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460200151604051613b1791815260200190565b60405180910390a38315613b3057613b30828289613fd5565b50505050505050565b600c54600b546000918291825b600a54811015613c8b578260046000600a8481548110613b6857613b6861452d565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613bd357508160056000600a8481548110613bac57613bac61452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613be957600c54600b54945094505050509091565b60046000600a8381548110613c0057613c0061452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613c2f9084614543565b925060056000600a8381548110613c4857613c4861452d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054613c779083614543565b915080613c8381614570565b915050613b46565b50600b54600c54613c9b91612b1f565b821015613cb257600c54600b549350935050509091565b90939092509050565b613ced6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000806000613cfc8686614112565b919450925090506000613d1582610fe585818b8961329e565b6040805160a081018252988952602089019190915287019390935260608601919091526080850152509192915050565b613d776040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000613d816132e0565b8351909150600090613d9390836136b6565b90506000613dae8386604001516136b690919063ffffffff16565b90506000613dc98487606001516136b690919063ffffffff16565b90506000613de48588608001516136b690919063ffffffff16565b90506000613df882610fe58581898961329e565b6040805160a081018252968752602087019190915285019390935260608401919091526080830152509392505050565b81516001600160a01b03851660009081526005602052604081208054909190613e52908490614543565b909155505080516001600160a01b03851660009081526004602052604081208054909190613e81908490614543565b90915550506020808201516001600160a01b0385166000908152600490925260408220805491929091613eb590849061458b565b909155505050505050565b80516001600160a01b03851660009081526004602052604081208054909190613eea908490614543565b90915550506020808301516001600160a01b0385166000908152600590925260408220805491929091613e8190849061458b565b80516001600160a01b03841660009081526004602052604081208054909190613f48908490614543565b90915550506020808201516001600160a01b038416600090815260049092526040822080549192909161147990849061458b565b81516001600160a01b03851660009081526005602052604081208054909190613fa6908490614543565b909155505080516001600160a01b03851660009081526004602052604081208054909190613eea908490614543565b6000613ff28360600151846080015161330390919063ffffffff16565b905060006140118560600151866080015161330390919063ffffffff16565b90508460600151601b6000828254614029919061458b565b90915550506080850151601a805460009061404590849061458b565b9091555050306000908152600460205260409020546140649083613303565b30600081815260046020526040908190209290925590516001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906140b59085815260200190565b60405180910390a33060009081526008602052604090205460ff161561410057306000908152600560205260409020546140ef9082613303565b306000908152600560205260409020555b6137f0846040015186604001516141fd565b600080600083156141945760125460649061413590610100900460ff168761450e565b61413f91906145c8565b601254606490614159906301000000900460ff168861450e565b61416391906145c8565b60125460649061417f9065010000000000900460ff168961450e565b61418991906145c8565b9250925092506141f6565b6012546064906141ad9062010000900460ff168761450e565b6141b791906145c8565b6012546064906141d290640100000000900460ff168861450e565b6141dc91906145c8565b60125460649061417f90600160301b900460ff168961450e565b9250925092565b81600c600082825461420f9190614543565b9250508190555080600f6000828254614228919061458b565b90915550505050565b600060208083528351808285015260005b8181101561425e57858101830151858201604001528201614242565b81811115614270576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611cb957600080fd5b600080604083850312156142ae57600080fd5b82356142b981614286565b946020939093013593505050565b6000602082840312156142d957600080fd5b5035919050565b6000602082840312156142f257600080fd5b8135610fbd81614286565b60008060006060848603121561431257600080fd5b833561431d81614286565b9250602084013561432d81614286565b929592945050506040919091013590565b8035801515811461434e57600080fd5b919050565b60008060006060848603121561436857600080fd5b833592506143786020850161433e565b91506143866040850161433e565b90509250925092565b600080604083850312156143a257600080fd5b82356143ad81614286565b91506143bb6020840161433e565b90509250929050565b803560ff8116811461434e57600080fd5b6000806000606084860312156143ea57600080fd5b6143f3846143c4565b9250614401602085016143c4565b9150614386604085016143c4565b60006020828403121561442157600080fd5b610fbd8261433e565b6000806040838503121561443d57600080fd5b823561444881614286565b9150602083013561445881614286565b809150509250929050565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b600181811c9082168061449c57607f821691505b602082108114156144bd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614528576145286144f8565b500290565b634e487b7160e01b600052603260045260246000fd5b600082821015614555576145556144f8565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415614584576145846144f8565b5060010190565b6000821982111561459e5761459e6144f8565b500190565b600060ff821660ff84168060ff038211156145c0576145c06144f8565b019392505050565b6000826145e557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156145fc57600080fd5b8151610fbd81614286565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156146575784516001600160a01b031683529383019391830191600101614632565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561468d57600080fd5b835192506020840151915060408401519050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e042455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e4732ed810f8a700d51ca1750e3bbf84ac96374fb2de8aa2a22b1522f54fe48e64736f6c634300080b0033

Deployed Bytecode Sourcemap

26103:29321:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27675:58;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;27675:58:0;;;;;;;;53492:92;;;;;;;;;;;;;:::i;:::-;;31781:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32701:161::-;;;;;;;;;;-1:-1:-1;32701:161:0;;;;;:::i;:::-;;:::i;:::-;;;1419:14:1;;1412:22;1394:41;;1382:2;1367:18;32701:161:0;1254:187:1;27239:29:0;;;;;;;;;;-1:-1:-1;27239:29:0;;;;;;;;;;;;;;1618:4:1;1606:17;;;1588:36;;1576:2;1561:18;27239:29:0;1446:184:1;39438:317:0;;;;;;;;;;-1:-1:-1;39438:317:0;;;;;:::i;:::-;;:::i;27496:41::-;;;;;;;;;;-1:-1:-1;27496:41:0;;;;-1:-1:-1;;;27496:41:0;;-1:-1:-1;;;;;27496:41:0;;;;;;-1:-1:-1;;;;;2011:32:1;;;1993:51;;1981:2;1966:18;27496:41:0;1820:230:1;37142:239:0;;;;;;;;;;-1:-1:-1;37142:239:0;;;;;:::i;:::-;;:::i;32058:95::-;;;;;;;;;;-1:-1:-1;32138:7:0;;32058:95;;32870:313;;;;;;;;;;-1:-1:-1;32870:313:0;;;;;:::i;:::-;;:::i;27905:51::-;;;;;;;;;;;;;;;;53165:151;;;;;;;;;;;;;:::i;35464:253::-;;;;;;;;;;-1:-1:-1;35464:253:0;;;;;:::i;:::-;;:::i;31967:83::-;;;;;;;;;;-1:-1:-1;32033:9:0;;;;31967:83;;37736:335;;;;;;;;;;-1:-1:-1;37736:335:0;;;;;:::i;:::-;;:::i;36269:610::-;;;;;;;;;;-1:-1:-1;36269:610:0;;;;;:::i;:::-;;:::i;33191:218::-;;;;;;;;;;-1:-1:-1;33191:218:0;;;;;:::i;:::-;;:::i;34459:356::-;;;;;;;;;;-1:-1:-1;34459:356:0;;;;;:::i;:::-;;:::i;34823:500::-;;;;;;;;;;-1:-1:-1;34823:500:0;;;;;:::i;:::-;;:::i;53324:160::-;;;;;;;;;;-1:-1:-1;53324:160:0;;;;;:::i;:::-;;:::i;54103:588::-;;;;;;;;;;-1:-1:-1;54103:588:0;;;;;:::i;:::-;;:::i;27544:28::-;;;;;;;;;;-1:-1:-1;27544:28:0;;;;-1:-1:-1;;;;;27544:28:0;;;27622:40;;;;;;;;;;-1:-1:-1;27622:40:0;;;;-1:-1:-1;;;27622:40:0;;;;;;53969:126;;;;;;;;;;-1:-1:-1;54064:23:0;;54045:15;:42;;53969:126;;35725:536;;;;;;;;;;-1:-1:-1;35725:536:0;;;;;:::i;:::-;;:::i;43007:123::-;;;;;;;;;;-1:-1:-1;43007:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;43095:27:0;43071:4;43095:27;;;:18;:27;;;;;;;;;43007:123;54703:236;;;;;;;;;;-1:-1:-1;54703:236:0;;;;;:::i;:::-;;:::i;54947:265::-;;;;;;;;;;-1:-1:-1;54947:265:0;;;;;:::i;:::-;;:::i;53592:369::-;;;;;;;;;;-1:-1:-1;53592:369:0;;;;;:::i;:::-;;:::i;16601:90::-;;;;;;;;;;-1:-1:-1;16674:9:0;;16601:90;;37389:341;;;;;;;;;;-1:-1:-1;37389:341:0;;;;;:::i;:::-;;:::i;32159:208::-;;;;;;;;;;-1:-1:-1;32159:208:0;;;;;:::i;:::-;;:::i;16046:148::-;;;;;;;;;;;;;:::i;38129:260::-;;;;;;;;;;-1:-1:-1;38129:260:0;;;;;:::i;:::-;;:::i;26861:92::-;;;;;;;;;;-1:-1:-1;26861:92:0;;;;-1:-1:-1;;;;;26861:92:0;;;52842:315;;;;;;;;;;-1:-1:-1;52842:315:0;;;;;:::i;:::-;;:::i;27402:32::-;;;;;;;;;;-1:-1:-1;27402:32:0;;;;-1:-1:-1;;;27402:32:0;;;;;;43136:129;;;;;;;;;;-1:-1:-1;43136:129:0;;;;;:::i;:::-;-1:-1:-1;;;;;43227:30:0;43203:4;43227:30;;;:21;:30;;;;;;;;;43136:129;15403:79;;;;;;;;;;-1:-1:-1;15441:7:0;15468:6;-1:-1:-1;;;;;15468:6:0;15403:79;;55224:196;;;;;;;;;;-1:-1:-1;55224:196:0;;;;;:::i;:::-;;:::i;27362:33::-;;;;;;;;;;-1:-1:-1;27362:33:0;;;;;;;;;;;31872:87;;;;;;;;;;;;;:::i;33806:257::-;;;;;;;;;;-1:-1:-1;33806:257:0;;;;;:::i;:::-;;:::i;43271:165::-;;;;;;;;;;-1:-1:-1;43271:165:0;;;;;:::i;:::-;-1:-1:-1;;;;;43380:48:0;43356:4;43380:48;;;:39;:48;;;;;;;;;43271:165;38401:502;;;;;;;;;;-1:-1:-1;38401:502:0;;;;;:::i;:::-;;:::i;33417:269::-;;;;;;;;;;-1:-1:-1;33417:269:0;;;;;:::i;:::-;;:::i;33694:104::-;;;;;;;;;;-1:-1:-1;33780:10:0;;33694:104;;17079:297;;;;;;;;;;;;;:::i;32375:167::-;;;;;;;;;;-1:-1:-1;32375:167:0;;;;;:::i;:::-;;:::i;28252:58::-;;;;;;;;;;-1:-1:-1;28252:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17561:102;;;;;;;;;;-1:-1:-1;17561:102:0;;;;;:::i;:::-;;:::i;52524:310::-;;;;;;;;;;-1:-1:-1;52524:310:0;;;;;:::i;:::-;;:::i;40004:168::-;;;;;;;;;;-1:-1:-1;40004:168:0;;;;;:::i;:::-;;:::i;26824:30::-;;;;;;;;;;-1:-1:-1;26824:30:0;;;;-1:-1:-1;;;;;26824:30:0;;;38915:512;;;;;;;;;;-1:-1:-1;38915:512:0;;;;;:::i;:::-;;:::i;39767:229::-;;;;;;;;;;-1:-1:-1;39767:229:0;;;;;:::i;:::-;;:::i;16777:226::-;;;;;;;;;;-1:-1:-1;16777:226:0;;;;;:::i;:::-;;:::i;32550:143::-;;;;;;;;;;-1:-1:-1;32550:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;32658:18:0;;;32631:7;32658:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32550:143;27202:30;;;;;;;;;;-1:-1:-1;27202:30:0;;;;;;;;;;;36891:243;;;;;;;;;;-1:-1:-1;36891:243:0;;;;;:::i;:::-;;:::i;17710:105::-;;;;;;;;;;-1:-1:-1;17710:105:0;;;;;:::i;:::-;;:::i;27321:32::-;;;;;;;;;;-1:-1:-1;27321:32:0;;;;;;;;;;;16349:244;;;;;;;;;;-1:-1:-1;16349:244:0;;;;;:::i;:::-;;:::i;27281:33::-;;;;;;;;;;-1:-1:-1;27281:33:0;;;;;;;;;;;43442:115;;;;;;;;;;-1:-1:-1;43442:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;43526:23:0;43502:4;43526:23;;;:14;:23;;;;;;;;;43442:115;17886;;;;;;;;;;-1:-1:-1;17886:115:0;;;;;:::i;:::-;;:::i;53492:92::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;;;;;;;;;53559:17:::1;:15;:17::i;:::-;53492:92::o:0;31781:83::-;31818:13;31851:5;31844:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31781:83;:::o;32701:161::-;32776:4;32793:39;7917:10;32816:7;32825:6;32793:8;:39::i;:::-;-1:-1:-1;32850:4:0;32701:161;;;;;:::o;39438:317::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;39539:6:::1;39529;:16;;:40;;;;;39559:10;39549:6;:20;;39529:40;39521:101;;;::::0;-1:-1:-1;;;39521:101:0;;6620:2:1;39521:101:0::1;::::0;::::1;6602:21:1::0;6659:2;6639:18;;;6632:30;6698:34;6678:18;;;6671:62;-1:-1:-1;;;6749:18:1;;;6742:46;6805:19;;39521:101:0::1;6418:412:1::0;39521:101:0::1;39660:14;:6:::0;39668::::1;39660:14;:::i;:::-;39633:24;:41:::0;;;39690:57:::1;::::0;160:25:1;;;39690:57:0::1;::::0;148:2:1;133:18;39690:57:0::1;;;;;;;;39438:317:::0;:::o;37142:239::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37221:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;37213:74;;;::::0;-1:-1:-1;;;37213:74:0;;7342:2:1;37213:74:0::1;::::0;::::1;7324:21:1::0;7381:2;7361:18;;;7354:30;7420:34;7400:18;;;7393:62;-1:-1:-1;;;7471:18:1;;;7464:32;7513:19;;37213:74:0::1;7140:398:1::0;37213:74:0::1;-1:-1:-1::0;;;;;37298:27:0;::::1;37328:5;37298:27:::0;;;:18:::1;:27;::::0;;;;;:35;;-1:-1:-1;;37298:35:0::1;::::0;;37349:24;::::1;::::0;37328:5;37349:24:::1;37142:239:::0;:::o;32870:313::-;32968:4;32985:36;32995:6;33003:9;33014:6;32985:9;:36::i;:::-;33032:121;33041:6;7917:10;33063:89;33101:6;33063:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33063:19:0;;;;;;:11;:19;;;;;;;;7917:10;33063:33;;;;;;;;;;:37;:89::i;:::-;33032:8;:121::i;:::-;-1:-1:-1;33171:4:0;32870:313;;;;;;:::o;53165:151::-;53220:7;53247:61;53286:21;53304:1;53286:9;:21::i;:::-;53247:34;53265:15;27147:42;53265:9;:15::i;:::-;32138:7;;53247:13;:17;;:34::i;:61::-;53240:68;;53165:151;:::o;35464:253::-;35530:7;35569;;35558;:18;;35550:73;;;;-1:-1:-1;;;35550:73:0;;7745:2:1;35550:73:0;;;7727:21:1;7784:2;7764:18;;;7757:30;7823:34;7803:18;;;7796:62;-1:-1:-1;;;7874:18:1;;;7867:40;7924:19;;35550:73:0;7543:406:1;35550:73:0;35634:19;35657:10;:8;:10::i;:::-;35634:33;-1:-1:-1;35685:24:0;:7;35634:33;35685:11;:24::i;37736:335::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37835:48:0;::::1;;::::0;;;:39:::1;:48;::::0;;;;;::::1;;37827:111;;;::::0;-1:-1:-1;;;37827:111:0;;8156:2:1;37827:111:0::1;::::0;::::1;8138:21:1::0;8195:2;8175:18;;;8168:30;8234:34;8214:18;;;8207:62;-1:-1:-1;;;8285:18:1;;;8278:48;8343:19;;37827:111:0::1;7954:414:1::0;37827:111:0::1;-1:-1:-1::0;;;;;37949:48:0;::::1;38000:5;37949:48:::0;;;:39:::1;:48;::::0;;;;;:56;;-1:-1:-1;;37949:56:0::1;::::0;;38021:42;::::1;::::0;38000:5;38021:42:::1;37736:335:::0;:::o;36269:610::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36352:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;36344:80;;;::::0;-1:-1:-1;;;36344:80:0;;8575:2:1;36344:80:0::1;::::0;::::1;8557:21:1::0;8614:2;8594:18;;;8587:30;8653:34;8633:18;;;8626:62;-1:-1:-1;;;8704:18:1;;;8697:35;8749:19;;36344:80:0::1;8373:401:1::0;36344:80:0::1;36440:9;36435:397;36459:19;:26:::0;36455:30;::::1;36435:397;;;36537:7;-1:-1:-1::0;;;;;36511:33:0::1;:19;36531:1;36511:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36511:22:0::1;:33;36507:314;;;36590:19;36610:26:::0;;:30:::1;::::0;36639:1:::1;::::0;36610:30:::1;:::i;:::-;36590:51;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;36565:19:::1;:22:::0;;-1:-1:-1;;;;;36590:51:0;;::::1;::::0;36585:1;;36565:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:76:::0;;-1:-1:-1;;;;;;36565:76:0::1;-1:-1:-1::0;;;;;36565:76:0;;::::1;;::::0;;36660:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;36699:21:::1;:30:::0;;;;:38;;-1:-1:-1;;36699:38:0::1;::::0;;36756:19:::1;:25:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;36756:25:0;;;;;-1:-1:-1;;;;;;36756:25:0::1;::::0;;;;;36800:5:::1;;36507:314;36487:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36435:397;;;-1:-1:-1::0;36847:24:0::1;::::0;-1:-1:-1;;;;;36847:24:0;::::1;::::0;::::1;::::0;;;::::1;36269:610:::0;:::o;33191:218::-;7917:10;33279:4;33328:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33328:34:0;;;;;;;;;;33279:4;;33296:83;;33319:7;;33328:50;;33367:10;33328:38;:50::i;34459:356::-;7917:10;34513:14;34562:29;;;:21;:29;;;;;;;;34561:30;34553:99;;;;-1:-1:-1;;;34553:99:0;;9515:2:1;34553:99:0;;;9497:21:1;9554:2;9534:18;;;9527:30;9593:34;9573:18;;;9566:62;9664:26;9644:18;;;9637:54;9708:19;;34553:99:0;9313:420:1;34553:99:0;34663:15;34681:28;34701:7;34681:19;:28::i;:::-;-1:-1:-1;;;;;34720:15:0;;;;;;:7;:15;;;;;:26;;34663:46;;-1:-1:-1;34663:46:0;;34720:15;;;:26;;34663:46;;34720:26;:::i;:::-;;;;;;;;34768:7;34757;;:18;;;;;;;:::i;:::-;;;;;;;;34800:7;34786:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34459:356:0:o;34823:500::-;34937:7;34976;;34965;:18;;34957:62;;;;-1:-1:-1;;;34957:62:0;;10073:2:1;34957:62:0;;;10055:21:1;10112:2;10092:18;;;10085:30;10151:33;10131:18;;;10124:61;10202:18;;34957:62:0;9871:355:1;34957:62:0;35035:17;35030:286;;35069:15;35087:28;35107:7;35087:19;:28::i;:::-;35069:46;-1:-1:-1;35130:14:0;;-1:-1:-1;35130:14:0;35030:286;35180:30;35214:45;35233:7;35241:17;35214:18;:45::i;:::-;35281:23;;;;-1:-1:-1;35274:30:0;;-1:-1:-1;;35274:30:0;53324:160;53372:4;53389:37;7917:10;27147:42;53419:6;53389:9;:37::i;:::-;53442:12;;160:25:1;;;53442:12:0;;148:2:1;133:18;53442:12:0;;;;;;;-1:-1:-1;53472:4:0;;53324:160;-1:-1:-1;53324:160:0:o;54103:588::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54178:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;::::1;;54177:25;54169:73;;;::::0;-1:-1:-1;;;54169:73:0;;10433:2:1;54169:73:0::1;::::0;::::1;10415:21:1::0;10472:2;10452:18;;;10445:30;10511:34;10491:18;;;10484:62;-1:-1:-1;;;10562:18:1;;;10555:33;10605:19;;54169:73:0::1;10231:399:1::0;54169:73:0::1;15441:7:::0;15468:6;-1:-1:-1;;;;;54261:19:0;;::::1;15468:6:::0;;54261:19:::1;;54253:69;;;::::0;-1:-1:-1;;;54253:69:0;;10837:2:1;54253:69:0::1;::::0;::::1;10819:21:1::0;10876:2;10856:18;;;10849:30;10915:34;10895:18;;;10888:62;-1:-1:-1;;;10966:18:1;;;10959:35;11011:19;;54253:69:0::1;10635:401:1::0;54253:69:0::1;-1:-1:-1::0;;;;;54341:22:0;::::1;54333:76;;;::::0;-1:-1:-1;;;54333:76:0;;11243:2:1;54333:76:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;11321:34;11301:18;;;11294:62;-1:-1:-1;;;11372:18:1;;;11365:39;11421:19;;54333:76:0::1;11041:405:1::0;54333:76:0::1;54440:13;::::0;-1:-1:-1;;;;;54428:25:0;;::::1;54440:13:::0;::::1;54428:25;;54420:82;;;::::0;-1:-1:-1;;;54420:82:0;;11653:2:1;54420:82:0::1;::::0;::::1;11635:21:1::0;11692:2;11672:18;;;11665:30;11731:34;11711:18;;;11704:62;-1:-1:-1;;;11782:18:1;;;11775:42;11834:19;;54420:82:0::1;11451:408:1::0;54420:82:0::1;-1:-1:-1::0;;;;;54521:25:0;::::1;54541:4;54521:25;;54513:86;;;::::0;-1:-1:-1;;;54513:86:0;;12066:2:1;54513:86:0::1;::::0;::::1;12048:21:1::0;12105:2;12085:18;;;12078:30;12144:34;12124:18;;;12117:62;-1:-1:-1;;;12195:18:1;;;12188:46;12251:19;;54513:86:0::1;11864:412:1::0;54513:86:0::1;-1:-1:-1::0;;;;;54612:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:31;;-1:-1:-1;;54612:31:0::1;54639:4;54612:31:::0;;::::1;::::0;;;54659:24;;1394:41:1;;;54659:24:0::1;::::0;1367:18:1;54659:24:0::1;;;;;;;;54103:588:::0;:::o;35725:536::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35809:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;35808:31;35800:83;;;::::0;-1:-1:-1;;;35800:83:0;;12483:2:1;35800:83:0::1;::::0;::::1;12465:21:1::0;12522:2;12502:18;;;12495:30;12561:34;12541:18;;;12534:62;-1:-1:-1;;;12612:18:1;;;12605:37;12659:19;;35800:83:0::1;12281:403:1::0;35800:83:0::1;35902:19;:26:::0;35932:4:::1;-1:-1:-1::0;35902:34:0::1;35894:107;;;::::0;-1:-1:-1;;;35894:107:0;;12891:2:1;35894:107:0::1;::::0;::::1;12873:21:1::0;12930:2;12910:18;;;12903:30;12969:34;12949:18;;;12942:62;13040:30;13020:18;;;13013:58;13088:19;;35894:107:0::1;12689:424:1::0;35894:107:0::1;-1:-1:-1::0;;;;;36015:16:0;::::1;36034:1;36015:16:::0;;;:7:::1;:16;::::0;;;;;:20;36012:108:::1;;-1:-1:-1::0;;;;;36091:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;36071:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;36052:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;36012:108:::1;-1:-1:-1::0;;;;;36130:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;:37;;-1:-1:-1;;36130:37:0::1;36163:4;36130:37:::0;;::::1;::::0;;;36178:19:::1;:33:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;36178:33:0::1;::::0;::::1;::::0;;36227:26;::::1;::::0;36130:30;36227:26:::1;35725:536:::0;:::o;54703:236::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54786:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;::::1;;54778:69;;;::::0;-1:-1:-1;;;54778:69:0;;13320:2:1;54778:69:0::1;::::0;::::1;13302:21:1::0;;;13339:18;;;13332:30;13398:34;13378:18;;;13371:62;13450:18;;54778:69:0::1;13118:356:1::0;54778:69:0::1;-1:-1:-1::0;;;;;54858:24:0;::::1;54885:5;54858:24:::0;;;:14:::1;:24;::::0;;;;;;;:32;;-1:-1:-1;;54858:32:0::1;::::0;;54906:25;1394:41:1;;;54906:25:0::1;::::0;1367:18:1;54906:25:0::1;1254:187:1::0;54947:265:0;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;55066:15:::1;55040:23;;:41;55032:126;;;::::0;-1:-1:-1;;;55032:126:0;;13681:2:1;55032:126:0::1;::::0;::::1;13663:21:1::0;13720:2;13700:18;;;13693:30;13759:34;13739:18;;;13732:62;13830:34;13810:18;;;13803:62;-1:-1:-1;;;13881:19:1;;;13874:39;13930:19;;55032:126:0::1;13479:476:1::0;55032:126:0::1;55169:23;:35:::0;54947:265::o;53592:369::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;53698:15:::1;::::0;-1:-1:-1;;;;;53685:28:0;;::::1;53698:15:::0;::::1;53685:28;;53677:86;;;::::0;-1:-1:-1;;;53677:86:0;;14162:2:1;53677:86:0::1;::::0;::::1;14144:21:1::0;14201:2;14181:18;;;14174:30;14240:34;14220:18;;;14213:62;-1:-1:-1;;;14291:18:1;;;14284:43;14344:19;;53677:86:0::1;13960:409:1::0;53677:86:0::1;53812:15;::::0;53779:49:::1;::::0;-1:-1:-1;;;;;53812:15:0;;::::1;::::0;53779:49;::::1;::::0;::::1;::::0;53812:15:::1;::::0;53779:49:::1;53840:15;:27:::0;;-1:-1:-1;;;;;;53840:27:0::1;-1:-1:-1::0;;;;;53840:27:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;53878:29:0;;;:18:::1;:29;::::0;;;;:36;;-1:-1:-1;;53878:36:0::1;-1:-1:-1::0;53878:36:0::1;::::0;;53925:28:::1;53840:27:::0;53925:17:::1;:28::i;:::-;53592:369:::0;:::o;37389:341::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37491:48:0;::::1;;::::0;;;:39:::1;:48;::::0;;;;;::::1;;37490:49;37482:114;;;::::0;-1:-1:-1;;;37482:114:0;;14576:2:1;37482:114:0::1;::::0;::::1;14558:21:1::0;14615:2;14595:18;;;14588:30;14654:34;14634:18;;;14627:62;-1:-1:-1;;;14705:18:1;;;14698:50;14765:19;;37482:114:0::1;14374:416:1::0;37482:114:0::1;-1:-1:-1::0;;;;;37607:48:0;::::1;;::::0;;;:39:::1;:48;::::0;;;;;:55;;-1:-1:-1;;37607:55:0::1;37658:4;37607:55;::::0;;37678:44;::::1;::::0;37607:48;37678:44:::1;37389:341:::0;:::o;32159:208::-;-1:-1:-1;;;;;32249:30:0;;32225:7;32249:30;;;:21;:30;;;;;;;;32245:59;;;-1:-1:-1;;;;;;32288:16:0;;;;;:7;:16;;;;;;;32159:208::o;32245:59::-;-1:-1:-1;;;;;32342:16:0;;;;;;:7;:16;;;;;;32322:37;;:19;:37::i;16046:148::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;16153:1:::1;16137:6:::0;;16116:40:::1;::::0;-1:-1:-1;;;;;16137:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;16116:40:0;16153:1;;16116:40:::1;16184:1;16167:19:::0;;-1:-1:-1;;;;;;16167:19:0::1;::::0;;16046:148::o;38129:260::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38249:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;::::1;;38248:44;38240:80;;;::::0;-1:-1:-1;;;38240:80:0;;14997:2:1;38240:80:0::1;::::0;::::1;14979:21:1::0;15036:2;15016:18;;;15009:30;15075:26;15055:18;;;15048:54;15119:18;;38240:80:0::1;14795:348:1::0;38240:80:0::1;-1:-1:-1::0;;;;;38331:43:0::1;;::::0;;;:34:::1;:43;::::0;;;;:50;;-1:-1:-1;;38331:50:0::1;38377:4;38331:50;::::0;;38129:260::o;52842:315::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;52943:13:::1;::::0;-1:-1:-1;;;;;52924:33:0;;::::1;52943:13:::0;::::1;52924:33;;52916:87;;;::::0;-1:-1:-1;;;52916:87:0;;15350:2:1;52916:87:0::1;::::0;::::1;15332:21:1::0;15389:2;15369:18;;;15362:30;15428:34;15408:18;;;15401:62;-1:-1:-1;;;15479:18:1;;;15472:39;15528:19;;52916:87:0::1;15148:405:1::0;52916:87:0::1;53057:13;::::0;53019:53:::1;::::0;-1:-1:-1;;;;;53057:13:0;;::::1;::::0;53019:53;::::1;::::0;::::1;::::0;53057:13:::1;::::0;53019:53:::1;53083:13;:23:::0;;-1:-1:-1;;;;;;53083:23:0::1;-1:-1:-1::0;;;;;53083:23:0;::::1;::::0;;::::1;::::0;;;53117:32:::1;::::0;:17:::1;:32::i;55224:196::-:0;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;55328:1:::1;55304:21;:25;55296:71;;;::::0;-1:-1:-1;;;55296:71:0;;15760:2:1;55296:71:0::1;::::0;::::1;15742:21:1::0;15799:2;15779:18;;;15772:30;15838:34;15818:18;;;15811:62;-1:-1:-1;;;15889:18:1;;;15882:31;15930:19;;55296:71:0::1;15558:397:1::0;55296:71:0::1;55378:34;::::0;-1:-1:-1;;;;;55378:11:0;::::1;::::0;55390:21:::1;55378:34:::0;::::1;;;::::0;::::1;::::0;;;55390:21;55378:11;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55224:196:::0;:::o;31872:87::-;31911:13;31944:7;31937:14;;;;;:::i;33806:257::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;33914:13:::1;::::0;-1:-1:-1;;;;;33906:21:0;;::::1;33914:13:::0;::::1;33906:21;;33898:103;;;::::0;-1:-1:-1;;;33898:103:0;;16162:2:1;33898:103:0::1;::::0;::::1;16144:21:1::0;16201:2;16181:18;;;16174:30;16240:34;16220:18;;;16213:62;16311:34;16291:18;;;16284:62;-1:-1:-1;;;16362:19:1;;;16355:36;16408:19;;33898:103:0::1;15960:473:1::0;33898:103:0::1;34014:41;34043:4;34049:5;34014:28;:41::i;38401:502::-:0;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;38515:21:::1;38566:12:::0;38539:24:::1;38551:12:::0;38539:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;38515:63;;38615:2;38597:15;:20;;;;38589:79;;;::::0;-1:-1:-1;;;38589:79:0;;16849:2:1;38589:79:0::1;::::0;::::1;16831:21:1::0;16888:2;16868:18;;;16861:30;16927:34;16907:18;;;16900:62;-1:-1:-1;;;16978:18:1;;;16971:43;17031:19;;38589:79:0::1;16647:409:1::0;38589:79:0::1;38679:12;:24:::0;;-1:-1:-1;;38714:30:0;38679:24;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;38714:30:0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;38796:30:0;-1:-1:-1;;;38755:30:0;;::::1;::::0;;::::1;-1:-1:-1::0;;38796:30:0;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;38842:53:::1;::::0;;17251:36:1;;;17318:2;17303:18;;17296:45;;;;17357:18;;;17350:45;38842:53:0::1;::::0;17239:2:1;17224:18;38842:53:0::1;;;;;;;;38504:399;38401:502:::0;;;:::o;33417:269::-;33510:4;33527:129;7917:10;33550:7;33559:96;33598:15;33559:96;;;;;;;;;;;;;;;;;7917:10;33559:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33559:34:0;;;;;;;;;;;;:38;:96::i;17079:297::-;17131:14;;-1:-1:-1;;;;;17131:14:0;17149:10;17131:28;17123:76;;;;-1:-1:-1;;;17123:76:0;;17608:2:1;17123:76:0;;;17590:21:1;17647:2;17627:18;;;17620:30;17686:34;17666:18;;;17659:62;-1:-1:-1;;;17737:18:1;;;17730:33;17780:19;;17123:76:0;17406:399:1;17123:76:0;17235:9;;17218:15;:26;17210:64;;;;-1:-1:-1;;;17210:64:0;;18012:2:1;17210:64:0;;;17994:21:1;18051:2;18031:18;;;18024:30;18090:26;18070:18;;;18063:54;18134:18;;17210:64:0;17810:348:1;17210:64:0;17319:14;;;17311:6;;17290:44;;-1:-1:-1;;;;;17319:14:0;;;;17311:6;;;;-1:-1:-1;;;;;;;;;;;17290:44:0;;17354:14;;;17345:23;;-1:-1:-1;;;;;;17345:23:0;-1:-1:-1;;;;;17354:14:0;;;17345:23;;;;;;17079:297::o;32375:167::-;32453:4;32470:42;7917:10;32494:9;32505:6;32470:9;:42::i;17561:102::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17625:23:0::1;;::::0;;;:14:::1;:23;::::0;;;;:30;;-1:-1:-1;;17625:30:0::1;17651:4;17625:30;::::0;;17561:102::o;52524:310::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;52631:15:::1;::::0;-1:-1:-1;;;;;52610:37:0;;::::1;-1:-1:-1::0;;;52631:15:0;;::::1;;52610:37;;52602:85;;;::::0;-1:-1:-1;;;52602:85:0;;18365:2:1;52602:85:0::1;::::0;::::1;18347:21:1::0;18404:2;18384:18;;;18377:30;18443:34;18423:18;;;18416:62;-1:-1:-1;;;18494:18:1;;;18487:33;18537:19;;52602:85:0::1;18163:399:1::0;52602:85:0::1;52745:15;::::0;52703:59:::1;::::0;-1:-1:-1;;;;;;;;52745:15:0;;::::1;::::0;::::1;::::0;52703:59;::::1;::::0;::::1;::::0;;;::::1;52773:15;:47:::0;;-1:-1:-1;;;;;52773:47:0;;::::1;-1:-1:-1::0;;;52773:47:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;52524:310::o;40004:168::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;40080:21:::1;:31:::0;;;::::1;;-1:-1:-1::0;;;40080:31:0::1;-1:-1:-1::0;;;;40080:31:0;;::::1;;::::0;;40127:37:::1;::::0;::::1;::::0;::::1;::::0;40104:7;1419:14:1;1412:22;1394:41;;1382:2;1367:18;;1254:187;38915:512:0;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;39030:22:::1;39082:12:::0;39055:24:::1;39067:12:::0;39055:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;39030:64;;39132:2;39113:16;:21;;;;39105:81;;;::::0;-1:-1:-1;;;39105:81:0;;18769:2:1;39105:81:0::1;::::0;::::1;18751:21:1::0;18808:2;18788:18;;;18781:30;18847:34;18827:18;;;18820:62;-1:-1:-1;;;18898:18:1;;;18891:44;18952:19;;39105:81:0::1;18567:410:1::0;39105:81:0::1;39197:13;:25:::0;;-1:-1:-1;;39233:31:0;39197:25:::1;;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;39233:31:0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;39317:32:0;39275:31;;;::::1;::::0;;::::1;-1:-1:-1::0;;39317:32:0;;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;39365:54:::1;::::0;;17251:36:1;;;17318:2;17303:18;;17296:45;;;;17357:18;;;17350:45;39365:54:0::1;::::0;17239:2:1;17224:18;39365:54:0::1;17061:340:1::0;39767:229:0;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;39861:4:::1;39851:6;:14;;:38;;;;;39879:10;39869:6;:20;;39851:38;39843:96;;;::::0;-1:-1:-1;;;39843:96:0;;19184:2:1;39843:96:0::1;::::0;::::1;19166:21:1::0;19223:2;19203:18;;;19196:30;19262:34;19242:18;;;19235:62;-1:-1:-1;;;19313:18:1;;;19306:43;19366:19;;39843:96:0::1;18982:409:1::0;39843:96:0::1;39972:14;:6:::0;39980::::1;39972:14;:::i;:::-;39950:19;:36:::0;-1:-1:-1;39767:229:0:o;16777:226::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;16858:6:::1;::::0;;;16841:23;;-1:-1:-1;;;;;;16841:23:0;;::::1;-1:-1:-1::0;;;;;16858:6:0;::::1;16841:23;::::0;;;16875:19:::1;::::0;;16917:22:::1;16935:4:::0;16917:15:::1;:22;:::i;:::-;16905:9;:34:::0;16992:1:::1;16976:6:::0;;16955:40:::1;::::0;-1:-1:-1;;;;;16976:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;16955:40:0;16992:1;;16955:40:::1;16777:226:::0;:::o;36891:243::-;17476:24;17489:10;17476:12;:24::i;:::-;17468:48;;;;-1:-1:-1;;;17468:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36973:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;36972:28;36964:77;;;::::0;-1:-1:-1;;;36964:77:0;;19598:2:1;36964:77:0::1;::::0;::::1;19580:21:1::0;19637:2;19617:18;;;19610:30;19676:34;19656:18;;;19649:62;-1:-1:-1;;;19727:18:1;;;19720:34;19771:19;;36964:77:0::1;19396:400:1::0;36964:77:0::1;-1:-1:-1::0;;;;;37052:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:34;;-1:-1:-1;;37052:34:0::1;37082:4;37052:34;::::0;;37102:24;::::1;::::0;37052:27;37102:24:::1;36891:243:::0;:::o;17710:105::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17776:23:0::1;17802:5;17776:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;17776:31:0::1;::::0;;17710:105::o;16349:244::-;15615:6;;-1:-1:-1;;;;;15615:6:0;7917:10;15615:22;15607:67;;;;-1:-1:-1;;;15607:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16438:22:0;::::1;16430:73;;;::::0;-1:-1:-1;;;16430:73:0;;20003:2:1;16430:73:0::1;::::0;::::1;19985:21:1::0;20042:2;20022:18;;;20015:30;20081:34;20061:18;;;20054:62;-1:-1:-1;;;20132:18:1;;;20125:36;20178:19;;16430:73:0::1;19801:402:1::0;16430:73:0::1;16540:6;::::0;;16519:38:::1;::::0;-1:-1:-1;;;;;16519:38:0;;::::1;::::0;16540:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;16519:38:0;::::1;16568:6;:17:::0;;-1:-1:-1;;;;;;16568:17:0::1;-1:-1:-1::0;;;;;16568:17:0;;;::::1;::::0;;;::::1;::::0;;16349:244::o;17886:115::-;-1:-1:-1;;;;;17970:23:0;17946:4;17970:23;;;:14;:23;;;;;;;;;17886:115::o;5644:132::-;5702:7;5729:39;5733:1;5736;5729:39;;;;;;;;;;;;;;;;;:3;:39::i;46367:1422::-;29947:17;:24;;-1:-1:-1;;;;29947:24:0;-1:-1:-1;;;29947:24:0;;;;46447::::1;46465:4;46447:9;:24::i;:::-;46425:46;;46601:27;46631:85;46684:31;;46631:48;46647:31;;46631:11;:15;;:48;;;;:::i;:85::-;46601:115;;46761:19;46727:31;;:53;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;46826:31:0::1;::::0;46791:32:::1;::::0;46826:38:::1;::::0;46862:1:::1;46826:35;:38::i;:::-;46791:73:::0;-1:-1:-1;46931:21:0::1;46995:60;47013:41;:11:::0;46791:73;47013:15:::1;:41::i;:::-;46995:17;:60::i;:::-;47116:18;47137:41;:21;47163:14:::0;47137:25:::1;:41::i;:::-;47116:62:::0;-1:-1:-1;47191:23:0::1;47217:94;47269:41;:11:::0;47285:24;47269:15:::1;:41::i;:::-;47232:31;::::0;47217:47:::1;::::0;:10;;:14:::1;:47::i;:::-;:51:::0;::::1;:94::i;:::-;47191:120:::0;-1:-1:-1;47322:23:0::1;47348:31;:10:::0;47191:120;47348:14:::1;:31::i;:::-;47424:1;47390:31;:35:::0;;;47436:31:::1;:35:::0;47322:57;-1:-1:-1;47523:56:0::1;47537:24:::0;47322:57;47523:13:::1;:56::i;:::-;47631:39;47654:15;47631:22;:39::i;:::-;47686:95;47701:41;:11:::0;47717:24;47701:15:::1;:41::i;:::-;47686:95;::::0;;20410:25:1;;;20466:2;20451:18;;20444:34;;;20494:18;;20487:34;;;20398:2;20383:18;47686:95:0::1;;;;;;;-1:-1:-1::0;;29994:17:0;:25;;-1:-1:-1;;;;29994:25:0;;;-1:-1:-1;;;;;46367:1422:0:o;43565:337::-;-1:-1:-1;;;;;43658:19:0;;43650:68;;;;-1:-1:-1;;;43650:68:0;;20734:2:1;43650:68:0;;;20716:21:1;20773:2;20753:18;;;20746:30;20812:34;20792:18;;;20785:62;-1:-1:-1;;;20863:18:1;;;20856:34;20907:19;;43650:68:0;20532:400:1;43650:68:0;-1:-1:-1;;;;;43737:21:0;;43729:68;;;;-1:-1:-1;;;43729:68:0;;21139:2:1;43729:68:0;;;21121:21:1;21178:2;21158:18;;;21151:30;21217:34;21197:18;;;21190:62;-1:-1:-1;;;21268:18:1;;;21261:32;21310:19;;43729:68:0;20937:398:1;43729:68:0;-1:-1:-1;;;;;43810:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43862:32;;160:25:1;;;43862:32:0;;133:18:1;43862:32:0;;;;;;;43565:337;;;:::o;43910:2449::-;-1:-1:-1;;;;;44032:18:0;;44024:68;;;;-1:-1:-1;;;44024:68:0;;21542:2:1;44024:68:0;;;21524:21:1;21581:2;21561:18;;;21554:30;21620:34;21600:18;;;21593:62;-1:-1:-1;;;21671:18:1;;;21664:35;21716:19;;44024:68:0;21340:401:1;44024:68:0;-1:-1:-1;;;;;44111:16:0;;44103:64;;;;-1:-1:-1;;;44103:64:0;;21948:2:1;44103:64:0;;;21930:21:1;21987:2;21967:18;;;21960:30;22026:34;22006:18;;;21999:62;-1:-1:-1;;;22077:18:1;;;22070:33;22120:19;;44103:64:0;21746:399:1;44103:64:0;-1:-1:-1;;;;;44270:18:0;;;;;;:14;:18;;;;;;;;44269:19;44261:55;;;;-1:-1:-1;;;44261:55:0;;22769:2:1;44261:55:0;;;22751:21:1;22808:2;22788:18;;;22781:30;22847:25;22827:18;;;22820:53;22890:18;;44261:55:0;22567:347:1;44261:55:0;-1:-1:-1;;;;;44336:20:0;;;;;;:14;:20;;;;;;;;44335:21;44327:54;;;;-1:-1:-1;;;44327:54:0;;23121:2:1;44327:54:0;;;23103:21:1;23160:2;23140:18;;;23133:30;-1:-1:-1;;;23179:18:1;;;23172:50;23239:18;;44327:54:0;22919:344:1;44327:54:0;44394:21;44418;54064:23;;54045:15;:42;;;53969:126;44418:21;44394:45;;44456:16;44452:158;;-1:-1:-1;;;;;44497:40:0;;;;;;:34;:40;;;;;;;;44489:109;;;;-1:-1:-1;;;44489:109:0;;23470:2:1;44489:109:0;;;23452:21:1;23509:2;23489:18;;;23482:30;23548:34;23528:18;;;23521:62;23619:26;23599:18;;;23592:54;23663:19;;44489:109:0;23268:420:1;44489:109:0;-1:-1:-1;;;;;44642:29:0;;44620:19;44642:29;;;:25;:29;;;;;;44698:17;;44642:29;;;;;-1:-1:-1;;;44698:17:0;;;;44697:18;:48;;;;;44729:16;44697:48;:79;;;;;44762:14;44697:79;:192;;;;-1:-1:-1;44873:15:0;;-1:-1:-1;;;;;44857:32:0;;;-1:-1:-1;;;44873:15:0;;;;44857:32;;44697:192;:317;;;;-1:-1:-1;;;;;;44971:43:0;;;;;;:39;:43;;;;;;;;44970:44;44697:317;:380;;;;-1:-1:-1;;;;;;45032:45:0;;;;;;:39;:45;;;;;;;;45031:46;44697:380;44682:595;;;45178:24;;45168:6;:34;;45160:105;;;;-1:-1:-1;;;45160:105:0;;23895:2:1;45160:105:0;;;23877:21:1;23934:2;23914:18;;;23907:30;23973:34;23953:18;;;23946:62;24044:28;24024:18;;;24017:56;24090:19;;45160:105:0;23693:422:1;45160:105:0;45425:28;45456:24;45474:4;45456:9;:24::i;:::-;45540:19;;45425:55;;-1:-1:-1;45516:43:0;;;;;;;45598:42;;-1:-1:-1;45623:17:0;;-1:-1:-1;;;45623:17:0;;;;45622:18;45598:42;:90;;;;-1:-1:-1;;;;;;45657:31:0;;;;;;:25;:31;;;;;;;;45656:32;45598:90;:151;;;;-1:-1:-1;45734:15:0;;-1:-1:-1;;;;;45726:23:0;;;45734:15;;45726:23;;45598:151;:189;;;;-1:-1:-1;45772:15:0;;-1:-1:-1;;;;;45766:21:0;;;45772:15;;45766:21;;45598:189;:227;;;;-1:-1:-1;45804:21:0;;-1:-1:-1;;;45804:21:0;;;;45598:227;45580:330;;;45881:17;:15;:17::i;:::-;-1:-1:-1;;;;;45951:31:0;;45930:18;45951:31;;;:25;:31;;;;;;;;;46008:16;:38;;;;-1:-1:-1;46029:17:0;;-1:-1:-1;;;46029:17:0;;;;46028:18;46008:38;:75;;;;;46051:13;:31;;;;46068:14;46051:31;-1:-1:-1;;;;;46184:24:0;;;;;;:18;:24;;;;;;45993:90;;-1:-1:-1;46184:24:0;;;:50;;-1:-1:-1;;;;;;46212:22:0;;;;;;:18;:22;;;;;;;;46184:50;46181:97;;;-1:-1:-1;46261:5:0;46181:97;46298:53;46313:4;46318:2;46321:6;46328:7;46336:14;46298;:53::i;:::-;44013:2346;;;;;;43910:2449;;;:::o;4246:192::-;4332:7;4368:12;4360:6;;;;4352:29;;;;-1:-1:-1;;;4352:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4392:9:0;4404:5;4408:1;4404;:5;:::i;:::-;4392:17;4246:192;-1:-1:-1;;;;;4246:192:0:o;3807:136::-;3865:7;3892:43;3896:1;3899;3892:43;;;;;;;;;;;;;;;;;:3;:43::i;41832:163::-;41873:7;41894:15;41911;41930:19;:17;:19::i;:::-;41893:56;;-1:-1:-1;41893:56:0;-1:-1:-1;41967:20:0;41893:56;;41967:11;:20::i;:::-;41960:27;;;;41832:163;:::o;3343:181::-;3401:7;;3433:5;3437:1;3433;:5;:::i;:::-;3421:17;;3462:1;3457;:6;;3449:46;;;;-1:-1:-1;;;3449:46:0;;24322:2:1;3449:46:0;;;24304:21:1;24361:2;24341:18;;;24334:30;24400:29;24380:18;;;24373:57;24447:18;;3449:46:0;24120:351:1;35331:125:0;35398:7;35425:23;35437:10;:8;:10::i;:::-;35425:7;;:11;:23::i;40438:320::-;40526:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40526:22:0;40550;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40550:22:0;40585:30;40617:35;40629:7;40637:14;40617:11;:35::i;:::-;40585:67;;40663:30;40695:20;40707:7;40695:11;:20::i;:::-;40734:7;;;;-1:-1:-1;40438:320:0;;-1:-1:-1;;;;40438:320:0:o;34071:380::-;-1:-1:-1;;;;;34162:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;34154:109;;;;-1:-1:-1;;;34154:109:0;;24678:2:1;34154:109:0;;;24660:21:1;24717:2;24697:18;;;24690:30;24756:34;24736:18;;;24729:62;24827:26;24807:18;;;24800:54;24871:19;;34154:109:0;24476:420:1;34154:109:0;-1:-1:-1;;;;;34274:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;34274:39:0;;;;;;;;;;;;34326:60;;34351:23;34369:4;34351:17;:23::i;:::-;34403:40;;;;;;-1:-1:-1;;;;;34403:40:0;;;;;;;;34071:380;;:::o;6272:278::-;6358:7;6393:12;6386:5;6378:28;;;;-1:-1:-1;;;6378:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6417:9:0;6429:5;6433:1;6429;:5;:::i;48036:590::-;48187:16;;;48201:1;48187:16;;;;;;;;48163:21;;48187:16;;;;;;;;;;-1:-1:-1;48187:16:0;48163:40;;48232:4;48214;48219:1;48214:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;48214:23:0;;;-1:-1:-1;;;;;48214:23:0;;;;;48258:15;;;;;;;;;-1:-1:-1;;;;;48258:15:0;-1:-1:-1;;;;;48258:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48248:4;48253:1;48248:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48248:32:0;;;:7;;;;;;;;;:32;48325:15;;48293:62;;48310:4;;-1:-1:-1;;;48325:15:0;;;48343:11;48293:8;:62::i;:::-;48394:15;;:224;;-1:-1:-1;;;48394:224:0;;-1:-1:-1;;;48394:15:0;;;-1:-1:-1;;;;;48394:15:0;;:66;;:224;;48475:11;;48501:1;;48545:4;;48572;;48592:15;;48394:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48092:534;48036:590;:::o;4697:471::-;4755:7;5000:6;4996:47;;-1:-1:-1;5030:1:0;5023:8;;4996:47;5055:9;5067:5;5071:1;5067;:5;:::i;:::-;5055:17;-1:-1:-1;5100:1:0;5091:5;5095:1;5055:17;5091:5;:::i;:::-;:10;5083:56;;;;-1:-1:-1;;;5083:56:0;;26698:2:1;5083:56:0;;;26680:21:1;26737:2;26717:18;;;26710:30;26776:34;26756:18;;;26749:62;-1:-1:-1;;;26827:18:1;;;26820:31;26868:19;;5083:56:0;26496:397:1;48634:550:0;48815:15;;48783:62;;48800:4;;-1:-1:-1;;;48815:15:0;;-1:-1:-1;;;;;48815:15:0;48833:11;48783:8;:62::i;:::-;48888:15;;49092;;48888:288;;-1:-1:-1;;;48888:288:0;;48960:4;48888:288;;;27239:34:1;27289:18;;;27282:34;;;49006:1:0;27332:18:1;;;27325:34;;;27375:18;;;27368:34;-1:-1:-1;;;;;49092:15:0;;;27418:19:1;;;27411:44;49150:15:0;27471:19:1;;;27464:35;-1:-1:-1;;;48888:15:0;;;;;:31;;48927:9;;27173:19:1;;48888:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;48634:550;;:::o;47797:231::-;47898:15;;47882:57;;47865:12;;-1:-1:-1;;;;;47898:15:0;;47928:6;;47865:12;47882:57;47865:12;47882:57;47928:6;47898:15;47882:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47864:75;;;47955:7;47952:69;;;47979:30;;160:25:1;;;47979:30:0;;148:2:1;133:18;47979:30:0;;;;;;;47853:175;47797:231;:::o;49192:1401::-;49320:30;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49320:30:0;49361;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49361:30:0;49408:7;49404:306;;49442:37;;;;;;;;49458:6;49442:37;;;;49466:6;49442:37;;;;49473:1;49442:37;;;;49475:1;49442:37;;;;49477:1;49442:37;;;49432:47;;49494:15;49512:22;49523:10;:8;:10::i;:::-;49512:6;;:10;:22::i;:::-;49494:40;;49559:39;;;;;;;;49575:7;49559:39;;;;49584:7;49559:39;;;;49592:1;49559:39;;;;49594:1;49559:39;;;;49596:1;49559:39;;;49549:49;;49417:193;49404:306;;;49657:41;49676:6;49683:14;49657:18;:41::i;:::-;49636:62;;-1:-1:-1;49636:62:0;-1:-1:-1;49404:306:0;-1:-1:-1;;;;;49736:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;49770:32:0;;;;;;:21;:32;;;;;;;;49769:33;49736:66;49732:709;;;49819:58;49841:6;49849:9;49860:7;49869;49819:21;:58::i;:::-;49732:709;;;-1:-1:-1;;;;;49900:29:0;;;;;;:21;:29;;;;;;;;49899:30;:66;;;;-1:-1:-1;;;;;;49933:32:0;;;;;;:21;:32;;;;;;;;49899:66;49895:546;;;49982:56;50002:6;50010:9;50021:7;50030;49982:19;:56::i;49895:546::-;-1:-1:-1;;;;;50061:29:0;;;;;;:21;:29;;;;;;;;50060:30;:67;;;;-1:-1:-1;;;;;;50095:32:0;;;;;;:21;:32;;;;;;;;50094:33;50060:67;50056:385;;;50144:45;50162:6;50170:9;50181:7;50144:17;:45::i;50056:385::-;-1:-1:-1;;;;;50211:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;50244:32:0;;;;;;:21;:32;;;;;;;;50211:65;50207:234;;;50293:58;50315:6;50323:9;50334:7;50343;50293:21;:58::i;50207:234::-;50384:45;50402:6;50410:9;50421:7;50384:17;:45::i;:::-;50475:9;-1:-1:-1;;;;;50458:52:0;50467:6;-1:-1:-1;;;;;50458:52:0;;50486:7;:23;;;50458:52;;;;160:25:1;;148:2;133:18;;14:177;50458:52:0;;;;;;;;50524:7;50521:64;;;50546:39;50560:7;50569;50578:6;50546:13;:39::i;:::-;49309:1284;;49192:1401;;;;;:::o;42003:581::-;42100:7;;42136;;42053;;;;;42154:315;42178:19;:26;42174:30;;42154:315;;;42264:7;42230;:31;42238:19;42258:1;42238:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42238:22:0;42230:31;;;;;;;;;;;;;:41;;:86;;;42309:7;42275;:31;42283:19;42303:1;42283:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42283:22:0;42275:31;;;;;;;;;;;;;:41;42230:86;42226:117;;;42326:7;;42335;;42318:25;;;;;;;42003:581;;:::o;42226:117::-;42369:7;:31;42377:19;42397:1;42377:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42377:22:0;42369:31;;;;;;;;;;;;;42358:42;;;;:::i;:::-;;;42426:7;:31;42434:19;42454:1;42434:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42434:22:0;42426:31;;;;;;;;;;;;;42415:42;;;;:::i;:::-;;-1:-1:-1;42206:3:0;;;;:::i;:::-;;;;42154:315;;;-1:-1:-1;42505:7:0;;42493;;:20;;:11;:20::i;:::-;42483:7;:30;42479:61;;;42523:7;;42532;;42515:25;;;;;;42003:581;;:::o;42479:61::-;42559:7;;42568;;-1:-1:-1;42003:581:0;-1:-1:-1;42003:581:0:o;40766:429::-;40846:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40846:22:0;40882:18;40902:21;40925;40950:39;40965:7;40974:14;40950;:39::i;:::-;40881:108;;-1:-1:-1;40881:108:0;-1:-1:-1;40881:108:0;-1:-1:-1;41000:23:0;41026:61;40881:108;41026:42;40881:108;41026:42;:7;40881:108;41026:11;:23::i;:61::-;41105:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41105:82:0;;40766:429;-1:-1:-1;;40766:429:0:o;41203:623::-;41278:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41278:22:0;41313:19;41335:10;:8;:10::i;:::-;41374:15;;41313:32;;-1:-1:-1;41356:15:0;;41374:32;;41313;41374:19;:32::i;:::-;41356:50;;41417:18;41438:35;41461:11;41438:7;:18;;;:22;;:35;;;;:::i;:::-;41417:56;;41484:21;41508:38;41534:11;41508:7;:21;;;:25;;:38;;;;:::i;:::-;41484:62;;41557:21;41581:38;41607:11;41581:7;:21;;;:25;;:38;;;;:::i;:::-;41557:62;-1:-1:-1;41630:23:0;41656:61;41557:62;41656:42;41684:13;41656:42;:7;41668:10;41656:11;:23::i;:61::-;41735:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41735:83:0;41203:623;-1:-1:-1;;;41203:623:0:o;51857:295::-;52025:15;;-1:-1:-1;;;;;52006:15:0;;52025;52006;;;:7;:15;;;;;:34;;:15;;52025;52006:34;;52025:15;;52006:34;:::i;:::-;;;;-1:-1:-1;;52070:15:0;;-1:-1:-1;;;;;52051:15:0;;52070;52051;;;:7;:15;;;;;:34;;:15;;52070;52051:34;;52070:15;;52051:34;:::i;:::-;;;;-1:-1:-1;;52118:23:0;;;;;-1:-1:-1;;;;;52096:18:0;;;;;;:7;:18;;;;;;:45;;52118:23;;52096:18;;:45;;52118:23;;52096:45;:::i;:::-;;;;-1:-1:-1;;;;;;51857:295:0:o;51537:312::-;51703:15;;-1:-1:-1;;;;;51684:15:0;;51703;51684;;;:7;:15;;;;;:34;;:15;;51703;51684:34;;51703:15;;51684:34;:::i;:::-;;;;-1:-1:-1;;51751:23:0;;;;;-1:-1:-1;;;;;51729:18:0;;;;;;:7;:18;;;;;;:45;;51751:23;;51729:18;;:45;;51751:23;;51729:45;:::i;51318:211::-;51450:15;;-1:-1:-1;;;;;51431:15:0;;51450;51431;;;:7;:15;;;;;:34;;:15;;51450;51431:34;;51450:15;;51431:34;:::i;:::-;;;;-1:-1:-1;;51498:23:0;;;;;-1:-1:-1;;;;;51476:18:0;;;;;;:7;:18;;;;;;:45;;51498:23;;51476:18;;:45;;51498:23;;51476:45;:::i;52160:356::-;52328:15;;-1:-1:-1;;;;;52309:15:0;;52328;52309;;;:7;:15;;;;;:34;;:15;;52328;52309:34;;52328:15;;52309:34;:::i;:::-;;;;-1:-1:-1;;52373:15:0;;-1:-1:-1;;;;;52354:15:0;;52373;52354;;;:7;:15;;;;;:34;;:15;;52373;52354:34;;52373:15;;52354:34;:::i;50599:711::-;50721:13;50737:48;50763:7;:21;;;50737:7;:21;;;:25;;:48;;;;:::i;:::-;50721:64;;50796:13;50812:48;50838:7;:21;;;50812:7;:21;;;:25;;:48;;;;:::i;:::-;50796:64;;50904:7;:21;;;50871:31;;:54;;;;;;;:::i;:::-;;;;-1:-1:-1;;50969:21:0;;;;50936:31;:54;;:31;;:54;;50969:21;;50936:54;:::i;:::-;;;;-1:-1:-1;;51042:4:0;51026:22;;;;:7;:22;;;;;;:33;;51053:5;51026:26;:33::i;:::-;51017:4;51001:22;;;;:7;:22;;;;;;;:58;;;;51075:38;;-1:-1:-1;;;;;51075:38:0;;;;;;;51107:5;160:25:1;;148:2;133:18;;14:177;51075:38:0;;;;;;;;51157:4;51127:36;;;;:21;:36;;;;;;;;51124:112;;;51219:4;51203:22;;;;:7;:22;;;;;;:33;;51230:5;51203:26;:33::i;:::-;51194:4;51178:22;;;;:7;:22;;;;;:58;51124:112;51249:51;51261:7;:18;;;51281:7;:18;;;51249:11;:51::i;42592:403::-;42678:7;42686;42694;42717:17;42714:264;;;42765:13;;42779:3;;42758:20;;42765:13;;;;;42758:6;:20;:::i;:::-;:24;;;;:::i;:::-;42790:16;;42807:3;;42783:23;;42790:16;;;;;42783:6;:23;:::i;:::-;:27;;;;:::i;:::-;42818:16;;42835:3;;42811:23;;42818:16;;;;;42811:6;:23;:::i;:::-;:27;;;;:::i;:::-;42751:88;;;;;;;;42714:264;42895:12;;42908:3;;42888:19;;42895:12;;;;;42888:6;:19;:::i;:::-;:23;;;;:::i;:::-;42919:15;;42935:3;;42912:22;;42919:15;;;;;42912:6;:22;:::i;:::-;:26;;;;:::i;:::-;42946:15;;42962:3;;42939:22;;-1:-1:-1;;;42946:15:0;;;;42939:6;:22;:::i;42714:264::-;42592:403;;;;;:::o;40284:144::-;40375:10;40364:7;;:21;;;;;;;:::i;:::-;;;;;;;;40410:10;40396;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;40284:144:0:o;196:597:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;634:6;631:1;628:13;625:91;;;704:1;699:2;690:6;679:9;675:22;671:31;664:42;625:91;-1:-1:-1;777:2:1;756:15;-1:-1:-1;;752:29:1;737:45;;;;784:2;733:54;;196:597;-1:-1:-1;;;196:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:315;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;1239:2;1224:18;;;;1211:32;;-1:-1:-1;;;934:315:1:o;1635:180::-;1694:6;1747:2;1735:9;1726:7;1722:23;1718:32;1715:52;;;1763:1;1760;1753:12;1715:52;-1:-1:-1;1786:23:1;;1635:180;-1:-1:-1;1635:180:1:o;2055:247::-;2114:6;2167:2;2155:9;2146:7;2142:23;2138:32;2135:52;;;2183:1;2180;2173:12;2135:52;2222:9;2209:23;2241:31;2266:5;2241:31;:::i;2307:456::-;2384:6;2392;2400;2453:2;2441:9;2432:7;2428:23;2424:32;2421:52;;;2469:1;2466;2459:12;2421:52;2508:9;2495:23;2527:31;2552:5;2527:31;:::i;:::-;2577:5;-1:-1:-1;2634:2:1;2619:18;;2606:32;2647:33;2606:32;2647:33;:::i;:::-;2307:456;;2699:7;;-1:-1:-1;;;2753:2:1;2738:18;;;;2725:32;;2307:456::o;2768:160::-;2833:20;;2889:13;;2882:21;2872:32;;2862:60;;2918:1;2915;2908:12;2862:60;2768:160;;;:::o;2933:316::-;3004:6;3012;3020;3073:2;3061:9;3052:7;3048:23;3044:32;3041:52;;;3089:1;3086;3079:12;3041:52;3125:9;3112:23;3102:33;;3154:35;3185:2;3174:9;3170:18;3154:35;:::i;:::-;3144:45;;3208:35;3239:2;3228:9;3224:18;3208:35;:::i;:::-;3198:45;;2933:316;;;;;:::o;3946:315::-;4011:6;4019;4072:2;4060:9;4051:7;4047:23;4043:32;4040:52;;;4088:1;4085;4078:12;4040:52;4127:9;4114:23;4146:31;4171:5;4146:31;:::i;:::-;4196:5;-1:-1:-1;4220:35:1;4251:2;4236:18;;4220:35;:::i;:::-;4210:45;;3946:315;;;;;:::o;4266:156::-;4332:20;;4392:4;4381:16;;4371:27;;4361:55;;4412:1;4409;4402:12;4427:322;4498:6;4506;4514;4567:2;4555:9;4546:7;4542:23;4538:32;4535:52;;;4583:1;4580;4573:12;4535:52;4606:27;4623:9;4606:27;:::i;:::-;4596:37;;4652:36;4684:2;4673:9;4669:18;4652:36;:::i;:::-;4642:46;;4707:36;4739:2;4728:9;4724:18;4707:36;:::i;4754:180::-;4810:6;4863:2;4851:9;4842:7;4838:23;4834:32;4831:52;;;4879:1;4876;4869:12;4831:52;4902:26;4918:9;4902:26;:::i;4939:388::-;5007:6;5015;5068:2;5056:9;5047:7;5043:23;5039:32;5036:52;;;5084:1;5081;5074:12;5036:52;5123:9;5110:23;5142:31;5167:5;5142:31;:::i;:::-;5192:5;-1:-1:-1;5249:2:1;5234:18;;5221:32;5262:33;5221:32;5262:33;:::i;:::-;5314:7;5304:17;;;4939:388;;;;;:::o;5332:335::-;5534:2;5516:21;;;5573:2;5553:18;;;5546:30;-1:-1:-1;;;5607:2:1;5592:18;;5585:41;5658:2;5643:18;;5332:335::o;5672:380::-;5751:1;5747:12;;;;5794;;;5815:61;;5869:4;5861:6;5857:17;5847:27;;5815:61;5922:2;5914:6;5911:14;5891:18;5888:38;5885:161;;;5968:10;5963:3;5959:20;5956:1;5949:31;6003:4;6000:1;5993:15;6031:4;6028:1;6021:15;5885:161;;5672:380;;;:::o;6057:356::-;6259:2;6241:21;;;6278:18;;;6271:30;6337:34;6332:2;6317:18;;6310:62;6404:2;6389:18;;6057:356::o;6835:127::-;6896:10;6891:3;6887:20;6884:1;6877:31;6927:4;6924:1;6917:15;6951:4;6948:1;6941:15;6967:168;7007:7;7073:1;7069;7065:6;7061:14;7058:1;7055:21;7050:1;7043:9;7036:17;7032:45;7029:71;;;7080:18;;:::i;:::-;-1:-1:-1;7120:9:1;;6967:168::o;8779:127::-;8840:10;8835:3;8831:20;8828:1;8821:31;8871:4;8868:1;8861:15;8895:4;8892:1;8885:15;8911:125;8951:4;8979:1;8976;8973:8;8970:34;;;8984:18;;:::i;:::-;-1:-1:-1;9021:9:1;;8911:125::o;9041:127::-;9102:10;9097:3;9093:20;9090:1;9083:31;9133:4;9130:1;9123:15;9157:4;9154:1;9147:15;9173:135;9212:3;-1:-1:-1;;9233:17:1;;9230:43;;;9253:18;;:::i;:::-;-1:-1:-1;9300:1:1;9289:13;;9173:135::o;9738:128::-;9778:3;9809:1;9805:6;9802:1;9799:13;9796:39;;;9815:18;;:::i;:::-;-1:-1:-1;9851:9:1;;9738:128::o;16438:204::-;16476:3;16512:4;16509:1;16505:12;16544:4;16541:1;16537:12;16579:3;16573:4;16569:14;16564:3;16561:23;16558:49;;;16587:18;;:::i;:::-;16623:13;;16438:204;-1:-1:-1;;;16438:204:1:o;24901:217::-;24941:1;24967;24957:132;;25011:10;25006:3;25002:20;24999:1;24992:31;25046:4;25043:1;25036:15;25074:4;25071:1;25064:15;24957:132;-1:-1:-1;25103:9:1;;24901:217::o;25255:251::-;25325:6;25378:2;25366:9;25357:7;25353:23;25349:32;25346:52;;;25394:1;25391;25384:12;25346:52;25426:9;25420:16;25445:31;25470:5;25445:31;:::i;25511:980::-;25773:4;25821:3;25810:9;25806:19;25852:6;25841:9;25834:25;25878:2;25916:6;25911:2;25900:9;25896:18;25889:34;25959:3;25954:2;25943:9;25939:18;25932:31;25983:6;26018;26012:13;26049:6;26041;26034:22;26087:3;26076:9;26072:19;26065:26;;26126:2;26118:6;26114:15;26100:29;;26147:1;26157:195;26171:6;26168:1;26165:13;26157:195;;;26236:13;;-1:-1:-1;;;;;26232:39:1;26220:52;;26327:15;;;;26292:12;;;;26268:1;26186:9;26157:195;;;-1:-1:-1;;;;;;;26408:32:1;;;;26403:2;26388:18;;26381:60;-1:-1:-1;;;26472:3:1;26457:19;26450:35;26369:3;25511:980;-1:-1:-1;;;25511:980:1:o;27510:306::-;27598:6;27606;27614;27667:2;27655:9;27646:7;27642:23;27638:32;27635:52;;;27683:1;27680;27673:12;27635:52;27712:9;27706:16;27696:26;;27762:2;27751:9;27747:18;27741:25;27731:35;;27806:2;27795:9;27791:18;27785:25;27775:35;;27510:306;;;;;:::o

Swarm Source

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