ETH Price: $3,270.50 (+0.75%)
Gas: 1 Gwei

Token

Bibos DAO (BIBO)
 

Overview

Max Total Supply

100,000,000 BIBO

Holders

28

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
likeclockwork.eth
Balance
742,798 BIBO

Value
$0.00
0x58e8869ccf201fdb2ab2014445a59c69b72fc494
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BiboDAO

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-05
*/

/*
 
BibosDAO

A DAO supporting the Bibos community. 
Floating. Hypnotizing. Divine? 
We are community of people who love and adore bibos today.

Supply: 100 000 000 
Max Wallet: 500 000 to start then 2 000 000
Max TX: 250 000 to start then 1 000 000

Tax: 7%

1% LP
3% Marketing/Dev
3% BIBO Buyback Wallet

*/

pragma solidity =0.8.9;

// SPDX-License-Identifier: UNLICENSED

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


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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

interface 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;
}

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

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

interface 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;
}



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

contract BiboDAO is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    event ContractChanged(uint256 indexed value);
    event ContractChangedBool(bool indexed value);
    event ContractChangedAddress(address indexed value);
    event antiBotBan(address indexed value);
    
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;
    mapping ( address => bool ) public blackList;

    EnumerableSet.AddressSet private _excluded;

    //Token Info
    string private constant _name = 'Bibos DAO';
    string private constant _symbol = 'BIBO';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;

    //Amount to Swap variable (0.2%)
    uint256 currentAmountToSwap = 200000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint16 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 9 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0x8b2e2fda0DBE799ef964DE56c57842163e080137);
    address public BuyBackWallet=payable(0x8b2e2fda0DBE799ef964DE56c57842163e080137);
    //Uniswap router (Main & Testnet)
    address private uniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private antiWhale = 2000000 * 10**_decimals; // (2%)

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 1; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
	uint256 private enableAutoBlacklist = 1; //Leave 1 if using, set to 0 if not using.
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;
       
    address private _uniswapV2PairAddress; 
    IuniswapV2Router02 private _uniswapV2Router;

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // Uniswap Router
        _uniswapV2Router = IuniswapV2Router02(uniswapV2Router);
        //Creates a Uniswap Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=0;

        //Set Starting Taxes 
        
        _buyTax=7;
        _sellTax=7;
        _transferTax=10;

        _burnTax=0;
        _liquidityTax=20;
        _marketingTax=80;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(BuyBackWallet);
        _excluded.add(msg.sender);
    
    }

    //Transfer functionality///

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

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

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            //Sells can't exceed the sell limit
            require(amount<=sellLimit,"Dump protection");
            require(blackList[sender] == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[sender] = true;
                emit antiBotBan(sender);
            }
            tax=_sellTax;


        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"Tx amount exceeding max buy amount");
            require(blackList[recipient] == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[recipient] = true;
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(blackList[sender] == false, "Sender address blacklisted!");
            require(blackList[recipient] == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                blackList[sender] = true;
                emit antiBotBan(sender);
            }
            tax=_transferTax;


        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapV2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapV2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

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

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

    }

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

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //adds Token to balances
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }

    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////

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

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

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

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for marketing
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining BETHNB to Marketing
        marketingBalance+=distributeETH;
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapV2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

    //public functions /////////////////////////////////////////////////////////////////////////////////////

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

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

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

    function getTaxes() external view returns(uint256 burnTax,uint256 liquidityTax, uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) external view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() external view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() external{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
	
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
	bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function TeamWithdrawALLMarketingETH() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*37) / 100);
        payable(BuyBackWallet).transfer((amount-(amount*37) / 100));
        emit Transfer(address(this), TeamWallet, (amount*37) / 100);
        emit Transfer(address(this), BuyBackWallet, (amount-(amount*37) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*37) / 100);
        payable(BuyBackWallet).transfer((amount-(amount*37) / 100));
        emit Transfer(address(this), TeamWallet, (amount*37) / 100);
        emit Transfer(address(this), BuyBackWallet, (amount-(amount*37) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) external onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
      emit ContractChanged(antiWhale);
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) external onlyOwner{
      require(newTeamWallet != address(0),
      "Error: Cannot be 0 address.");
      TeamWallet=payable(newTeamWallet);
      emit ContractChangedAddress(TeamWallet);
    }
    
    function TeamChangeBuyBackWallet(address newBuyBackWallet) external onlyOwner{
      require(newBuyBackWallet != address(0),
      "Error: Cannot be 0 address.");
      BuyBackWallet=payable(newBuyBackWallet);
      emit ContractChangedAddress(BuyBackWallet);
    }
	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) external onlyOwner{
        buyLockDisabled=disabled;
        emit ContractChangedBool(buyLockDisabled);
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds) external onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
            emit ContractChanged(buyLockTime);
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) external onlyOwner{
        currentAmountToSwap = newSwapAmount;
        emit ContractChanged(currentAmountToSwap);
    }
    
    //Allows wallet exclusion to be added after launch
    function addWalletExclusion(address exclusionAdd) external onlyOwner{
        _excluded.add(exclusionAdd);
        emit ContractChangedAddress(exclusionAdd);
    }

    //Allows you to remove wallet exclusions after launch
    function removeWalletExclusion(address exclusionRemove) external onlyOwner{
        _excluded.remove(exclusionRemove);
        emit ContractChangedAddress(exclusionRemove);
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        blackList[ blacklistedAddress ] = true;
        emit ContractChangedAddress(blacklistedAddress);
    }

    function blacklistAddressArray ( address [] memory _address ) public onlyOwner {
        
        for ( uint256 x=0; x< _address.length ; x++ ){
            blackList[_address[x]] = true;
            
        }
        
    }

    //Check if address is blacklisted (can be called by anyone)
    function checkAddressBlacklist(address submittedAddress) external view returns (bool isBlacklisted) {
        
        if (blackList[submittedAddress] == true) {
            isBlacklisted = true;
            return isBlacklisted;
        }
        if (blackList[submittedAddress] == false) {
            isBlacklisted = false;
            return isBlacklisted;
        }
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        blackList[ blacklistedAddress ] = false;
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes, uint8 buyTax, uint8 sellTax, uint8 transferTax) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;

        emit ContractChanged(_burnTax);
        emit ContractChanged(_liquidityTax);
        emit ContractChanged(_buyTax);
        emit ContractChanged(_sellTax);
        emit ContractChanged(_transferTax);
    }

    //manually converts contract token to LP
    function TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        uniswapV2Router=newRouter;
        emit ContractChangedAddress(newRouter);
    }
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) external onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100,
        "Error: New sell limit above 1% of circulating supply.");
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

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

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
        emit ContractChanged(balanceLimit);
        emit ContractChanged(sellLimit);
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() external onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

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

    //Adds time to LP lock in seconds.
    function TeamProlongLiquidityLockInSeconds(uint256 secondsUntilUnlock) external onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
        emit ContractChanged(secondsUntilUnlock+block.timestamp);
    }
    //Adds time to LP lock based on set time.
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime,
        "Error: New unlock time is shorter than old one.");
        _liquidityUnlockTime=newUnlockTime;
        emit ContractChanged(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(TeamWallet, amount);
        emit Transfer(address(this), TeamWallet, amount);
        tWAddress = TeamWallet;
        amountSent = amount;
        return (tWAddress, amountSent);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity() external onlyOwner returns (uint256 newBalance) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialETHBalance = address(this).balance;
        
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        marketingBalance+=newETHBalance;
        newBalance=newETHBalance;
        return newBalance;
    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() external onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent,
        "Error: Not sent.");
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // IBEP20 - Helpers

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"ContractChangedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"ContractChangedBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"TeamChangeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBuyBackWallet","type":"address"}],"name":"TeamChangeBuyBackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamProlongLiquidityLockInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[{"internalType":"address","name":"tWAddress","type":"address"},{"internalType":"uint256","name":"amountSent","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveLiquidity","outputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"addWalletExclusion","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":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"blacklistAddressArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"submittedAddress","type":"address"}],"name":"checkAddressBlacklist","outputs":[{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionRemove","type":"address"}],"name":"removeWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"teamUpdateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005b0565b620000219062030d40620005c1565b600755600880546001600160a01b0319908116738b2e2fda0dbe799ef964de56c57842163e0801379081179092556009805482169092178255600a8054909116737a250d5630b4cf539739df2c5dacb4c659f2488d178155620000859190620005b0565b62000095906305f5e100620005c1565b600b819055600c819055600d55620000b06009600a620005b0565b620000bf90621e8480620005c1565b600e5560016010556001601155348015620000d957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600a54601380546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001ba57600080fd5b505afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f59190620005e3565b6001600160a01b031663c9c6539630601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025357600080fd5b505afa15801562000268573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028e9190620005e3565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002d757600080fd5b505af1158015620002ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003129190620005e3565b601280546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003506009600a620005b0565b62000360906305f5e100620005c1565b6200036c919062000615565b600c5560646200037f6009600a620005b0565b6200038f906305f5e100620005c1565b6200039b919062000615565b600d5560006017556012805465ffffffffffff1916655014000a0707179055600854620003e0906005906001600160a01b03166200042b602090811b620024c217901c565b5060095462000407906005906001600160a01b03166200042b602090811b620024c217901c565b50620004233360056200042b60201b620024c21790919060201c565b505062000638565b600062000442836001600160a01b0384166200044b565b90505b92915050565b6000818152600183016020526040812054620004945750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000445565b50600062000445565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004f4578160001904821115620004d857620004d86200049d565b80851615620004e657918102915b93841c9390800290620004b8565b509250929050565b6000826200050d5750600162000445565b816200051c5750600062000445565b8160018114620005355760028114620005405762000560565b600191505062000445565b60ff8411156200055457620005546200049d565b50506001821b62000445565b5060208310610133831016604e8410600b841016171562000585575081810a62000445565b620005918383620004b3565b8060001904821115620005a857620005a86200049d565b029392505050565b60006200044260ff841683620004fc565b6000816000190483118215151615620005de57620005de6200049d565b500290565b600060208284031215620005f657600080fd5b81516001600160a01b03811681146200060e57600080fd5b9392505050565b6000826200063357634e487b7160e01b600052601260045260246000fd5b500490565b613c8f80620006486000396000f3fe6080604052600436106103815760003560e01c80636e94312d116101cf5780639fa62d5f11610101578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610af0578063f2c816ae14610b10578063f2fde38b14610b30578063f9ab736614610b5057005b8063daf9a47a14610a4a578063dd62ed3e14610a6a578063e2fd002a14610ab0578063e7278d6b14610ad057005b8063be636012116100d3578063be636012146109e0578063c3a3c03214610a00578063c3f4f54f14610a15578063d11edf7414610a2a57005b80639fa62d5f14610960578063a457c2d714610980578063a9059cbb146109a0578063b766a386146109c057005b8063828e8b7e11610173578063929dffda11610145578063929dffda146108d357806395d89b41146108f35780639bc845fb146109205780639bf657701461094057005b8063828e8b7e1461088657806386d0ada81461089b578063893d20e8146108b55780638da5cb5b146108b557005b806370a08231116101ac57806370a0823114610810578063715018a614610846578063762bb2821461085b5780637b9e987a1461087157005b80636e94312d146107a65780636eb8c7f1146107c65780636f89e409146107e657005b806339509351116102b35780634cdaf0ae1161024c57806358e553651161021e57806358e55365146107235780635c69f6901461073957806361cb27481461074e578063677a88701461076e57005b80634cdaf0ae146106b85780634f91e48c146106d857806357ad67d1146106ee57806358e1df921461070e57005b806344f3c83a1161028557806344f3c83a1461063e5780634838d165146106545780634ada218b146106845780634cbf8e24146106a357005b806339509351146105b45780633c7a309b146105d45780633cc39b7a146106085780634476f35a1461061e57005b80631eb25d13116103255780633054f8a3116102f75780633054f8a314610544578063311a869714610563578063313ce5671461057857806335e82f3a1461059457005b80631eb25d131461048f57806323b872dd146104a4578063243b529a146104c45780632973ef2d146104d957005b80630fa5b2151161035e5780630fa5b2151461041a5780630fd99e161461043d57806314ddc0951461046557806318160ddd1461047a57005b80630200264b1461038a57806306fdde03146103bf578063095ea7b3146103fa57005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004613573565b610b70565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b506040805180820190915260098152684269626f732044414f60b81b60208201525b6040516103b69190613590565b34801561040657600080fd5b506103aa6104153660046135e5565b610bcb565b34801561042657600080fd5b5061042f610be2565b6040519081526020016103b6565b34801561044957600080fd5b50610452606481565b60405161ffff90911681526020016103b6565b34801561047157600080fd5b5060175461042f565b34801561048657600080fd5b50600b5461042f565b34801561049b57600080fd5b5061042f610e3d565b3480156104b057600080fd5b506103aa6104bf366004613611565b610e5a565b3480156104d057600080fd5b50610388610ef1565b3480156104e557600080fd5b506012546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103b6565b34801561055057600080fd5b506016546103aa90610100900460ff1681565b34801561056f57600080fd5b50610452603281565b34801561058457600080fd5b50604051600981526020016103b6565b3480156105a057600080fd5b506103886105af366004613573565b610f34565b3480156105c057600080fd5b506103aa6105cf3660046135e5565b610fa4565b3480156105e057600080fd5b506105e9610fdb565b604080516001600160a01b0390931683526020830191909152016103b6565b34801561061457600080fd5b5061042f60155481565b34801561062a57600080fd5b50610388610639366004613652565b61118e565b34801561064a57600080fd5b5061042f60175481565b34801561066057600080fd5b506103aa61066f366004613573565b60046020526000908152604090205460ff1681565b34801561069057600080fd5b506018546103aa90610100900460ff1681565b3480156106af57600080fd5b50610388611383565b3480156106c457600080fd5b506103886106d3366004613573565b611477565b3480156106e457600080fd5b5061042f600d5481565b3480156106fa57600080fd5b5061038861070936600461367c565b611500565b34801561071a57600080fd5b50610388611895565b34801561072f57600080fd5b5061042f60145481565b34801561074557600080fd5b50610452600981565b34801561075a57600080fd5b50610388610769366004613573565b6118f3565b34801561077a57600080fd5b5060085461078e906001600160a01b031681565b6040516001600160a01b0390911681526020016103b6565b3480156107b257600080fd5b5060095461078e906001600160a01b031681565b3480156107d257600080fd5b506103886107e1366004613652565b61195d565b3480156107f257600080fd5b506107fb6119cc565b604080519283526020830191909152016103b6565b34801561081c57600080fd5b5061042f61082b366004613573565b6001600160a01b031660009081526001602052604090205490565b34801561085257600080fd5b50610388611a09565b34801561086757600080fd5b5061042f600c5481565b34801561087d57600080fd5b50610388611a8c565b34801561089257600080fd5b50610388611ada565b3480156108a757600080fd5b506018546103aa9060ff1681565b3480156108c157600080fd5b506000546001600160a01b031661078e565b3480156108df57600080fd5b506103886108ee366004613573565b611afe565b3480156108ff57600080fd5b506040805180820190915260048152634249424f60e01b60208201526103ed565b34801561092c57600080fd5b5061038861093b366004613573565b611b95565b34801561094c57600080fd5b5061038861095b3660046136fe565b611c2c565b34801561096c57600080fd5b5061038861097b36600461371b565b611caa565b34801561098c57600080fd5b506103aa61099b3660046135e5565b611ec4565b3480156109ac57600080fd5b506103aa6109bb3660046135e5565b611f40565b3480156109cc57600080fd5b506103886109db3660046136fe565b611f4d565b3480156109ec57600080fd5b506103886109fb366004613573565b611fd5565b348015610a0c57600080fd5b5061042f61206c565b348015610a2157600080fd5b5061042f61208c565b348015610a3657600080fd5b50610388610a45366004613652565b6120cb565b348015610a5657600080fd5b50610388610a65366004613652565b612125565b348015610a7657600080fd5b5061042f610a8536600461373d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610abc57600080fd5b50610388610acb366004613652565b612193565b348015610adc57600080fd5b50610388610aeb36600461378c565b612237565b348015610afc57600080fd5b5061042f610b0b366004613573565b6122dc565b348015610b1c57600080fd5b50610388610b2b366004613573565b612316565b348015610b3c57600080fd5b50610388610b4b366004613573565b612389565b348015610b5c57600080fd5b50610388610b6b366004613573565b612482565b6001600160a01b03811660009081526004602052604081205460ff16151560011415610b9e57506001919050565b6001600160a01b03821660009081526004602052604090205460ff16610bc657506000919050565b919050565b6000610bd83384846124d7565b5060015b92915050565b600033610bf76000546001600160a01b031690565b6001600160a01b031614610c265760405162461bcd60e51b8152600401610c1d90613851565b60405180910390fd5b601954421015610c485760405162461bcd60e51b8152600401610c1d90613886565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906138b0565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610d1d57600080fd5b505af1158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5591906138c9565b5060135447906001600160a01b031663af2979eb30846064610d7882604b6138fc565b610d82919061391b565b6064610d8f88604b6138fc565b610d99919061391b565b30426040518763ffffffff1660e01b8152600401610dbc9695949392919061393d565b602060405180830381600087803b158015610dd657600080fd5b505af1158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906138b0565b506000610e1b8247613978565b90508060146000828254610e2f919061398f565b909155509094505050505090565b610e496009600a613a8b565b610e57906305f5e1006138fc565b81565b6000610e678484846125ca565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610ed25760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c1d565b610ee68533610ee18685613978565b6124d7565b506001949350505050565b33610f046000546001600160a01b031690565b6001600160a01b031614610f2a5760405162461bcd60e51b8152600401610c1d90613851565b610f32612827565b565b33610f476000546001600160a01b031690565b6001600160a01b031614610f6d5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116600081815260046020526040808220805460ff1916905551600080516020613c3a8339815191529190a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bd8918590610ee190869061398f565b60008033610ff16000546001600160a01b031690565b6001600160a01b0316146110175760405162461bcd60e51b8152600401610c1d90613851565b6019544210156110395760405162461bcd60e51b8152600401610c1d90613886565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110be91906138b0565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906138c9565b506008546040518281526001600160a01b03909116903090600080516020613c1a8339815191529060200160405180910390a36008546001600160a01b031693509150509091565b336111a16000546001600160a01b031690565b6001600160a01b0316146111c75760405162461bcd60e51b8152600401610c1d90613851565b60145481111561122f5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610c1d565b80601460008282546112419190613978565b90915550506008546001600160a01b03166108fc60646112628460256138fc565b61126c919061391b565b6040518115909202916000818181858888f19350505050158015611294573d6000803e3d6000fd5b506009546001600160a01b03166108fc60646112b18460256138fc565b6112bb919061391b565b6112c59084613978565b6040518115909202916000818181858888f193505050501580156112ed573d6000803e3d6000fd5b506008546001600160a01b031630600080516020613c1a83398151915260646113178560256138fc565b611321919061391b565b60405190815260200160405180910390a36009546001600160a01b031630600080516020613c1a833981519152606461135b8560256138fc565b611365919061391b565b61136f9085613978565b60405190815260200160405180910390a350565b336113966000546001600160a01b031690565b6001600160a01b0316146113bc5760405162461bcd60e51b8152600401610c1d90613851565b6019544210156113de5760405162461bcd60e51b8152600401610c1d90613886565b6008546040516000916001600160a01b03169047908381818185875af1925050503d806000811461142b576040519150601f19603f3d011682016040523d82523d6000602084013e611430565b606091505b50509050806114745760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610c1d565b50565b3361148a6000546001600160a01b031690565b6001600160a01b0316146114b05760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166114d65760405162461bcd60e51b8152600401610c1d90613a9a565b601880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336115136000546001600160a01b031690565b6001600160a01b0316146115395760405162461bcd60e51b8152600401610c1d90613851565b6000846115468789613ad1565b6115509190613ad1565b90508060ff166064146115b45760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610c1d565b60148460ff16111561162e5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610c1d565b60148360ff1611156116a85760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610c1d565b60148260ff16111561172d5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610c1d565b86601260036101000a81548160ff021916908360ff16021790555085601260046101000a81548160ff021916908360ff16021790555084601260056101000a81548160ff021916908360ff16021790555083601260006101000a81548160ff021916908360ff16021790555082601260016101000a81548160ff021916908360ff16021790555081601260026101000a81548160ff021916908360ff160217905550601260039054906101000a900460ff1660ff16600080516020613bfa83398151915260405160405180910390a260125460405164010000000090910460ff1690600080516020613bfa83398151915290600090a260125460405160ff90911690600080516020613bfa83398151915290600090a260125460405161010090910460ff1690600080516020613bfa83398151915290600090a26012546040516201000090910460ff1690600080516020613bfa83398151915290600090a250505050505050565b336118a86000546001600160a01b031690565b6001600160a01b0316146118ce5760405162461bcd60e51b8152600401610c1d90613851565b6014805460009091556008546001600160a01b03166108fc60646112628460256138fc565b336119066000546001600160a01b031690565b6001600160a01b03161461192c5760405162461bcd60e51b8152600401610c1d90613851565b61193760058261297a565b506040516001600160a01b03821690600080516020613c3a83398151915290600090a250565b336119706000546001600160a01b031690565b6001600160a01b0316146119965760405162461bcd60e51b8152600401610c1d90613851565b6119a86119a3428361398f565b61298f565b6119b2428261398f565b604051600080516020613bfa83398151915290600090a250565b6000806119db6009600a613a8b565b600c546119e8919061391b565b6119f46009600a613a8b565b600d54611a01919061391b565b915091509091565b33611a1c6000546001600160a01b031690565b6001600160a01b031614611a425760405162461bcd60e51b8152600401610c1d90613851565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610c1d90613851565b6018805461ff00191661010017905542600f55565b601754611ae7904261398f565b33600090815260036020526040902055565b905090565b33611b116000546001600160a01b031690565b6001600160a01b031614611b375760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116611b5d5760405162461bcd60e51b8152600401610c1d90613a9a565b600a80546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b33611ba86000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116611bf45760405162461bcd60e51b8152600401610c1d90613a9a565b600880546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b33611c3f6000546001600160a01b031690565b6001600160a01b031614611c655760405162461bcd60e51b8152600401610c1d90613851565b6018805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611cbd6000546001600160a01b031690565b6001600160a01b031614611ce35760405162461bcd60e51b8152600401610c1d90613851565b6064600b54611cf2919061391b565b8110611d5e5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610c1d565b611d6a6009600a613a8b565b611d7490836138fc565b9150611d826009600a613a8b565b611d8c90826138fc565b90506000603261ffff16600b54611da3919061391b565b90506000606461ffff16600b54611dba919061391b565b905081841015611e205760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610c1d565b80831015611e815760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610c1d565b600c849055600d8390556040518490600080516020613bfa83398151915290600090a2600d54604051600080516020613bfa83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611f275760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c1d565b611f363385610ee18685613978565b5060019392505050565b6000610bd83384846125ca565b33611f606000546001600160a01b031690565b6001600160a01b031614611f865760405162461bcd60e51b8152600401610c1d90613851565b6016805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611fe86000546001600160a01b031690565b6001600160a01b03161461200e5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166120345760405162461bcd60e51b8152600401610c1d90613a9a565b600980546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b60006019544210156120865742601954611af99190613978565b50600090565b600061209a6009600a613a8b565b600b546120a96009600a613a8b565b6120b7906305f5e1006138fc565b6120c19190613978565b611af9919061391b565b336120de6000546001600160a01b031690565b6001600160a01b0316146121045760405162461bcd60e51b8152600401610c1d90613851565b60078190556040518190600080516020613bfa83398151915290600090a250565b336121386000546001600160a01b031690565b6001600160a01b03161461215e5760405162461bcd60e51b8152600401610c1d90613851565b61216a6009600a613a8b565b61217490826138fc565b600e819055604051600080516020613bfa83398151915290600090a250565b336121a66000546001600160a01b031690565b6001600160a01b0316146121cc5760405162461bcd60e51b8152600401610c1d90613851565b60098111156122165760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610c1d565b60178190556040518190600080516020613bfa83398151915290600090a250565b3361224a6000546001600160a01b031690565b6001600160a01b0316146122705760405162461bcd60e51b8152600401610c1d90613851565b60005b81518110156122d85760016004600084848151811061229457612294613af6565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806122d081613b0c565b915050612273565b5050565b6001600160a01b0381166000908152600360205260408120544281116123055750600092915050565b61230f4282613978565b9392505050565b336123296000546001600160a01b031690565b6001600160a01b03161461234f5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116600081815260046020526040808220805460ff1916600117905551600080516020613c3a8339815191529190a250565b3361239c6000546001600160a01b031690565b6001600160a01b0316146123c25760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166124275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336124956000546001600160a01b031690565b6001600160a01b0316146124bb5760405162461bcd60e51b8152600401610c1d90613851565b6119376005825b600061230f836001600160a01b038416612a19565b6001600160a01b0383166125215760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c1d565b6001600160a01b0382166125695760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c1d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166126155760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c1d565b6001600160a01b03821661265e5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c1d565b600061266b600585612a68565b8061267c575061267c600584612a68565b905060006001600160a01b03851630148061269f57506001600160a01b03841630145b6013546012549192506001600160a01b0390811691600091888116600160301b909204161480156126e15750816001600160a01b0316866001600160a01b0316145b8061271c57506012546001600160a01b03878116600160301b9092041614801561271c5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127565750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127905750836001600160a01b0316886001600160a01b0316145b9050848061279b5750825b806127a35750855b156127b8576127b3898989612a8a565b61281c565b601854610100900460ff1661280f5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610c1d565b61281c8989898585612b43565b505050505050505050565b6016805460ff19166001908117909155306000908152602091909152604081205460125490919061286f90640100000000810460ff9081169165010000000000900416613ad1565b60ff169050600060075490508083108061288b575061ffff8216155b156128985750505061296e565b60125460009061ffff8416906128b990640100000000900460ff16846138fc565b6128c3919061391b565b905060006128d18284613978565b905060006128e060028461391b565b905060006128ee8285613978565b905060006128fc848361398f565b9050476129088261315c565b60006129148247613978565b905060008361292386846138fc565b61292d919061391b565b905061293986826132c4565b50600090506129488447613978565b9050806014600082825461295c919061398f565b90915550505050505050505050505050505b6016805460ff19169055565b600061230f836001600160a01b0384166133c9565b60195481116129f85760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610c1d565b60198190556040518190600080516020613bfa83398151915290600090a250565b6000818152600183016020526040812054612a6057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b6001600160a01b0381166000908152600183016020526040812054151561230f565b6001600160a01b03831660009081526001602052604090205481811015612aee5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1d565b612af884836134b6565b612b0283836134fb565b826001600160a01b0316846001600160a01b0316600080516020613c1a83398151915284604051612b3591815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612bb15760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1d565b60008315612cde57600d54861115612bfd5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610c1d565b6001600160a01b03881660009081526004602052604090205460ff1615612c5d5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c1d565b601054600f54612c6d919061398f565b4211158015612c7e57506011546001145b15612ccd576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b50601254610100900460ff16613009565b8415612e6b57600c54612cf1878561398f565b1115612d325760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1d565b600e54861115612d8f5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610c1d565b6001600160a01b03871660009081526004602052604090205460ff1615612def5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c1d565b601054600f54612dff919061398f565b4211158015612e1057506011546001145b15612e5f576001600160a01b038716600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125460ff16613009565b6001600160a01b03881660009081526004602052604090205460ff1615612ed45760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610c1d565b6001600160a01b03871660009081526004602052604090205460ff1615612f3d5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610c1d565b600c54612f4a878561398f565b1115612f8b5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1d565b601054600f54612f9b919061398f565b4211158015612fac57506011546001145b15612ffb576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125462010000900460ff165b6012546001600160a01b03898116600160301b9092041614801590613031575060185460ff16155b8015613040575060165460ff16155b80156130495750835b1561305657613056612827565b60006130728783601260039054906101000a900460ff1661351f565b6012549091506000906130a890899085906130a39060ff640100000000820481169165010000000000900416613ad1565b61351f565b905060006130b6828461398f565b6130c0908a613978565b90506130cc8b8a6134b6565b30600090815260016020526040812080548492906130eb90849061398f565b9250508190555082600b60008282546131049190613978565b9091555061311490508a826134fb565b896001600160a01b03168b6001600160a01b0316600080516020613c1a8339815191528360405161314791815260200190565b60405180910390a35050505050505050505050565b6013546131749030906001600160a01b0316836124d7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131a9576131a9613af6565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131fd57600080fd5b505afa158015613211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132359190613b27565b8160018151811061324857613248613af6565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac9479061328e908590600090869030904290600401613b44565b600060405180830381600087803b1580156132a857600080fd5b505af11580156132bc573d6000803e3d6000fd5b505050505050565b60008082601560008282546132d9919061398f565b909155506000905060646132ee85604b6138fc565b6132f8919061391b565b90506000606461330987604b6138fc565b613313919061391b565b60135490915061332e9030906001600160a01b0316886124d7565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061336a9030908b90879089908490429060040161393d565b6060604051808303818588803b15801561338357600080fd5b505af1158015613397573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133bc9190613bb5565b5096979596505050505050565b600081815260018301602052604081205480156134ac5760006133ed600183613978565b855490915060009061340190600190613978565b9050600086600001828154811061341a5761341a613af6565b906000526020600020015490508087600001848154811061343d5761343d613af6565b60009182526020808320909101929092558281526001890190915260409020849055865487908061347057613470613be3565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bdc565b6000915050610bdc565b6001600160a01b0382166000908152600160205260408120546134da908390613978565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546134da90839061398f565b60006127108260ff168460ff168661353791906138fc565b61354191906138fc565b61354b919061391b565b949350505050565b6001600160a01b038116811461147457600080fd5b8035610bc681613553565b60006020828403121561358557600080fd5b813561230f81613553565b600060208083528351808285015260005b818110156135bd578581018301518582016040015282016135a1565b818111156135cf576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156135f857600080fd5b823561360381613553565b946020939093013593505050565b60008060006060848603121561362657600080fd5b833561363181613553565b9250602084013561364181613553565b929592945050506040919091013590565b60006020828403121561366457600080fd5b5035919050565b803560ff81168114610bc657600080fd5b60008060008060008060c0878903121561369557600080fd5b61369e8761366b565b95506136ac6020880161366b565b94506136ba6040880161366b565b93506136c86060880161366b565b92506136d66080880161366b565b91506136e460a0880161366b565b90509295509295509295565b801515811461147457600080fd5b60006020828403121561371057600080fd5b813561230f816136f0565b6000806040838503121561372e57600080fd5b50508035926020909101359150565b6000806040838503121561375057600080fd5b823561375b81613553565b9150602083013561376b81613553565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561379f57600080fd5b823567ffffffffffffffff808211156137b757600080fd5b818501915085601f8301126137cb57600080fd5b8135818111156137dd576137dd613776565b8060051b604051601f19603f8301168101818110858211171561380257613802613776565b60405291825284820192508381018501918883111561382057600080fd5b938501935b828510156138455761383685613568565b84529385019392850192613825565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156138c257600080fd5b5051919050565b6000602082840312156138db57600080fd5b815161230f816136f0565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613916576139166138e6565b500290565b60008261393857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561398a5761398a6138e6565b500390565b600082198211156139a2576139a26138e6565b500190565b600181815b808511156139e25781600019048211156139c8576139c86138e6565b808516156139d557918102915b93841c93908002906139ac565b509250929050565b6000826139f957506001610bdc565b81613a0657506000610bdc565b8160018114613a1c5760028114613a2657613a42565b6001915050610bdc565b60ff841115613a3757613a376138e6565b50506001821b610bdc565b5060208310610133831016604e8410600b8410161715613a65575081810a610bdc565b613a6f83836139a7565b8060001904821115613a8357613a836138e6565b029392505050565b600061230f60ff8416836139ea565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff03821115613aee57613aee6138e6565b019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b2057613b206138e6565b5060010190565b600060208284031215613b3957600080fd5b815161230f81613553565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b945784516001600160a01b031683529383019391830191600101613b6f565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613bca57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220d072f27c40104ac89042cde2d408d88d44e0f85e38deb5398eb851868dc7b5bc64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103815760003560e01c80636e94312d116101cf5780639fa62d5f11610101578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610af0578063f2c816ae14610b10578063f2fde38b14610b30578063f9ab736614610b5057005b8063daf9a47a14610a4a578063dd62ed3e14610a6a578063e2fd002a14610ab0578063e7278d6b14610ad057005b8063be636012116100d3578063be636012146109e0578063c3a3c03214610a00578063c3f4f54f14610a15578063d11edf7414610a2a57005b80639fa62d5f14610960578063a457c2d714610980578063a9059cbb146109a0578063b766a386146109c057005b8063828e8b7e11610173578063929dffda11610145578063929dffda146108d357806395d89b41146108f35780639bc845fb146109205780639bf657701461094057005b8063828e8b7e1461088657806386d0ada81461089b578063893d20e8146108b55780638da5cb5b146108b557005b806370a08231116101ac57806370a0823114610810578063715018a614610846578063762bb2821461085b5780637b9e987a1461087157005b80636e94312d146107a65780636eb8c7f1146107c65780636f89e409146107e657005b806339509351116102b35780634cdaf0ae1161024c57806358e553651161021e57806358e55365146107235780635c69f6901461073957806361cb27481461074e578063677a88701461076e57005b80634cdaf0ae146106b85780634f91e48c146106d857806357ad67d1146106ee57806358e1df921461070e57005b806344f3c83a1161028557806344f3c83a1461063e5780634838d165146106545780634ada218b146106845780634cbf8e24146106a357005b806339509351146105b45780633c7a309b146105d45780633cc39b7a146106085780634476f35a1461061e57005b80631eb25d13116103255780633054f8a3116102f75780633054f8a314610544578063311a869714610563578063313ce5671461057857806335e82f3a1461059457005b80631eb25d131461048f57806323b872dd146104a4578063243b529a146104c45780632973ef2d146104d957005b80630fa5b2151161035e5780630fa5b2151461041a5780630fd99e161461043d57806314ddc0951461046557806318160ddd1461047a57005b80630200264b1461038a57806306fdde03146103bf578063095ea7b3146103fa57005b3661038857005b005b34801561039657600080fd5b506103aa6103a5366004613573565b610b70565b60405190151581526020015b60405180910390f35b3480156103cb57600080fd5b506040805180820190915260098152684269626f732044414f60b81b60208201525b6040516103b69190613590565b34801561040657600080fd5b506103aa6104153660046135e5565b610bcb565b34801561042657600080fd5b5061042f610be2565b6040519081526020016103b6565b34801561044957600080fd5b50610452606481565b60405161ffff90911681526020016103b6565b34801561047157600080fd5b5060175461042f565b34801561048657600080fd5b50600b5461042f565b34801561049b57600080fd5b5061042f610e3d565b3480156104b057600080fd5b506103aa6104bf366004613611565b610e5a565b3480156104d057600080fd5b50610388610ef1565b3480156104e557600080fd5b506012546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103b6565b34801561055057600080fd5b506016546103aa90610100900460ff1681565b34801561056f57600080fd5b50610452603281565b34801561058457600080fd5b50604051600981526020016103b6565b3480156105a057600080fd5b506103886105af366004613573565b610f34565b3480156105c057600080fd5b506103aa6105cf3660046135e5565b610fa4565b3480156105e057600080fd5b506105e9610fdb565b604080516001600160a01b0390931683526020830191909152016103b6565b34801561061457600080fd5b5061042f60155481565b34801561062a57600080fd5b50610388610639366004613652565b61118e565b34801561064a57600080fd5b5061042f60175481565b34801561066057600080fd5b506103aa61066f366004613573565b60046020526000908152604090205460ff1681565b34801561069057600080fd5b506018546103aa90610100900460ff1681565b3480156106af57600080fd5b50610388611383565b3480156106c457600080fd5b506103886106d3366004613573565b611477565b3480156106e457600080fd5b5061042f600d5481565b3480156106fa57600080fd5b5061038861070936600461367c565b611500565b34801561071a57600080fd5b50610388611895565b34801561072f57600080fd5b5061042f60145481565b34801561074557600080fd5b50610452600981565b34801561075a57600080fd5b50610388610769366004613573565b6118f3565b34801561077a57600080fd5b5060085461078e906001600160a01b031681565b6040516001600160a01b0390911681526020016103b6565b3480156107b257600080fd5b5060095461078e906001600160a01b031681565b3480156107d257600080fd5b506103886107e1366004613652565b61195d565b3480156107f257600080fd5b506107fb6119cc565b604080519283526020830191909152016103b6565b34801561081c57600080fd5b5061042f61082b366004613573565b6001600160a01b031660009081526001602052604090205490565b34801561085257600080fd5b50610388611a09565b34801561086757600080fd5b5061042f600c5481565b34801561087d57600080fd5b50610388611a8c565b34801561089257600080fd5b50610388611ada565b3480156108a757600080fd5b506018546103aa9060ff1681565b3480156108c157600080fd5b506000546001600160a01b031661078e565b3480156108df57600080fd5b506103886108ee366004613573565b611afe565b3480156108ff57600080fd5b506040805180820190915260048152634249424f60e01b60208201526103ed565b34801561092c57600080fd5b5061038861093b366004613573565b611b95565b34801561094c57600080fd5b5061038861095b3660046136fe565b611c2c565b34801561096c57600080fd5b5061038861097b36600461371b565b611caa565b34801561098c57600080fd5b506103aa61099b3660046135e5565b611ec4565b3480156109ac57600080fd5b506103aa6109bb3660046135e5565b611f40565b3480156109cc57600080fd5b506103886109db3660046136fe565b611f4d565b3480156109ec57600080fd5b506103886109fb366004613573565b611fd5565b348015610a0c57600080fd5b5061042f61206c565b348015610a2157600080fd5b5061042f61208c565b348015610a3657600080fd5b50610388610a45366004613652565b6120cb565b348015610a5657600080fd5b50610388610a65366004613652565b612125565b348015610a7657600080fd5b5061042f610a8536600461373d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610abc57600080fd5b50610388610acb366004613652565b612193565b348015610adc57600080fd5b50610388610aeb36600461378c565b612237565b348015610afc57600080fd5b5061042f610b0b366004613573565b6122dc565b348015610b1c57600080fd5b50610388610b2b366004613573565b612316565b348015610b3c57600080fd5b50610388610b4b366004613573565b612389565b348015610b5c57600080fd5b50610388610b6b366004613573565b612482565b6001600160a01b03811660009081526004602052604081205460ff16151560011415610b9e57506001919050565b6001600160a01b03821660009081526004602052604090205460ff16610bc657506000919050565b919050565b6000610bd83384846124d7565b5060015b92915050565b600033610bf76000546001600160a01b031690565b6001600160a01b031614610c265760405162461bcd60e51b8152600401610c1d90613851565b60405180910390fd5b601954421015610c485760405162461bcd60e51b8152600401610c1d90613886565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906138b0565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610d1d57600080fd5b505af1158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5591906138c9565b5060135447906001600160a01b031663af2979eb30846064610d7882604b6138fc565b610d82919061391b565b6064610d8f88604b6138fc565b610d99919061391b565b30426040518763ffffffff1660e01b8152600401610dbc9695949392919061393d565b602060405180830381600087803b158015610dd657600080fd5b505af1158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906138b0565b506000610e1b8247613978565b90508060146000828254610e2f919061398f565b909155509094505050505090565b610e496009600a613a8b565b610e57906305f5e1006138fc565b81565b6000610e678484846125ca565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610ed25760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c1d565b610ee68533610ee18685613978565b6124d7565b506001949350505050565b33610f046000546001600160a01b031690565b6001600160a01b031614610f2a5760405162461bcd60e51b8152600401610c1d90613851565b610f32612827565b565b33610f476000546001600160a01b031690565b6001600160a01b031614610f6d5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116600081815260046020526040808220805460ff1916905551600080516020613c3a8339815191529190a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bd8918590610ee190869061398f565b60008033610ff16000546001600160a01b031690565b6001600160a01b0316146110175760405162461bcd60e51b8152600401610c1d90613851565b6019544210156110395760405162461bcd60e51b8152600401610c1d90613886565b6018546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561108657600080fd5b505afa15801561109a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110be91906138b0565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906138c9565b506008546040518281526001600160a01b03909116903090600080516020613c1a8339815191529060200160405180910390a36008546001600160a01b031693509150509091565b336111a16000546001600160a01b031690565b6001600160a01b0316146111c75760405162461bcd60e51b8152600401610c1d90613851565b60145481111561122f5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610c1d565b80601460008282546112419190613978565b90915550506008546001600160a01b03166108fc60646112628460256138fc565b61126c919061391b565b6040518115909202916000818181858888f19350505050158015611294573d6000803e3d6000fd5b506009546001600160a01b03166108fc60646112b18460256138fc565b6112bb919061391b565b6112c59084613978565b6040518115909202916000818181858888f193505050501580156112ed573d6000803e3d6000fd5b506008546001600160a01b031630600080516020613c1a83398151915260646113178560256138fc565b611321919061391b565b60405190815260200160405180910390a36009546001600160a01b031630600080516020613c1a833981519152606461135b8560256138fc565b611365919061391b565b61136f9085613978565b60405190815260200160405180910390a350565b336113966000546001600160a01b031690565b6001600160a01b0316146113bc5760405162461bcd60e51b8152600401610c1d90613851565b6019544210156113de5760405162461bcd60e51b8152600401610c1d90613886565b6008546040516000916001600160a01b03169047908381818185875af1925050503d806000811461142b576040519150601f19603f3d011682016040523d82523d6000602084013e611430565b606091505b50509050806114745760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610c1d565b50565b3361148a6000546001600160a01b031690565b6001600160a01b0316146114b05760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166114d65760405162461bcd60e51b8152600401610c1d90613a9a565b601880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336115136000546001600160a01b031690565b6001600160a01b0316146115395760405162461bcd60e51b8152600401610c1d90613851565b6000846115468789613ad1565b6115509190613ad1565b90508060ff166064146115b45760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610c1d565b60148460ff16111561162e5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610c1d565b60148360ff1611156116a85760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610c1d565b60148260ff16111561172d5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610c1d565b86601260036101000a81548160ff021916908360ff16021790555085601260046101000a81548160ff021916908360ff16021790555084601260056101000a81548160ff021916908360ff16021790555083601260006101000a81548160ff021916908360ff16021790555082601260016101000a81548160ff021916908360ff16021790555081601260026101000a81548160ff021916908360ff160217905550601260039054906101000a900460ff1660ff16600080516020613bfa83398151915260405160405180910390a260125460405164010000000090910460ff1690600080516020613bfa83398151915290600090a260125460405160ff90911690600080516020613bfa83398151915290600090a260125460405161010090910460ff1690600080516020613bfa83398151915290600090a26012546040516201000090910460ff1690600080516020613bfa83398151915290600090a250505050505050565b336118a86000546001600160a01b031690565b6001600160a01b0316146118ce5760405162461bcd60e51b8152600401610c1d90613851565b6014805460009091556008546001600160a01b03166108fc60646112628460256138fc565b336119066000546001600160a01b031690565b6001600160a01b03161461192c5760405162461bcd60e51b8152600401610c1d90613851565b61193760058261297a565b506040516001600160a01b03821690600080516020613c3a83398151915290600090a250565b336119706000546001600160a01b031690565b6001600160a01b0316146119965760405162461bcd60e51b8152600401610c1d90613851565b6119a86119a3428361398f565b61298f565b6119b2428261398f565b604051600080516020613bfa83398151915290600090a250565b6000806119db6009600a613a8b565b600c546119e8919061391b565b6119f46009600a613a8b565b600d54611a01919061391b565b915091509091565b33611a1c6000546001600160a01b031690565b6001600160a01b031614611a425760405162461bcd60e51b8152600401610c1d90613851565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b33611a9f6000546001600160a01b031690565b6001600160a01b031614611ac55760405162461bcd60e51b8152600401610c1d90613851565b6018805461ff00191661010017905542600f55565b601754611ae7904261398f565b33600090815260036020526040902055565b905090565b33611b116000546001600160a01b031690565b6001600160a01b031614611b375760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116611b5d5760405162461bcd60e51b8152600401610c1d90613a9a565b600a80546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b33611ba86000546001600160a01b031690565b6001600160a01b031614611bce5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116611bf45760405162461bcd60e51b8152600401610c1d90613a9a565b600880546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b33611c3f6000546001600160a01b031690565b6001600160a01b031614611c655760405162461bcd60e51b8152600401610c1d90613851565b6018805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611cbd6000546001600160a01b031690565b6001600160a01b031614611ce35760405162461bcd60e51b8152600401610c1d90613851565b6064600b54611cf2919061391b565b8110611d5e5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610c1d565b611d6a6009600a613a8b565b611d7490836138fc565b9150611d826009600a613a8b565b611d8c90826138fc565b90506000603261ffff16600b54611da3919061391b565b90506000606461ffff16600b54611dba919061391b565b905081841015611e205760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610c1d565b80831015611e815760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610c1d565b600c849055600d8390556040518490600080516020613bfa83398151915290600090a2600d54604051600080516020613bfa83398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611f275760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c1d565b611f363385610ee18685613978565b5060019392505050565b6000610bd83384846125ca565b33611f606000546001600160a01b031690565b6001600160a01b031614611f865760405162461bcd60e51b8152600401610c1d90613851565b6016805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611fe86000546001600160a01b031690565b6001600160a01b03161461200e5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166120345760405162461bcd60e51b8152600401610c1d90613a9a565b600980546001600160a01b0319166001600160a01b038316908117909155604051600080516020613c3a83398151915290600090a250565b60006019544210156120865742601954611af99190613978565b50600090565b600061209a6009600a613a8b565b600b546120a96009600a613a8b565b6120b7906305f5e1006138fc565b6120c19190613978565b611af9919061391b565b336120de6000546001600160a01b031690565b6001600160a01b0316146121045760405162461bcd60e51b8152600401610c1d90613851565b60078190556040518190600080516020613bfa83398151915290600090a250565b336121386000546001600160a01b031690565b6001600160a01b03161461215e5760405162461bcd60e51b8152600401610c1d90613851565b61216a6009600a613a8b565b61217490826138fc565b600e819055604051600080516020613bfa83398151915290600090a250565b336121a66000546001600160a01b031690565b6001600160a01b0316146121cc5760405162461bcd60e51b8152600401610c1d90613851565b60098111156122165760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610c1d565b60178190556040518190600080516020613bfa83398151915290600090a250565b3361224a6000546001600160a01b031690565b6001600160a01b0316146122705760405162461bcd60e51b8152600401610c1d90613851565b60005b81518110156122d85760016004600084848151811061229457612294613af6565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806122d081613b0c565b915050612273565b5050565b6001600160a01b0381166000908152600360205260408120544281116123055750600092915050565b61230f4282613978565b9392505050565b336123296000546001600160a01b031690565b6001600160a01b03161461234f5760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b038116600081815260046020526040808220805460ff1916600117905551600080516020613c3a8339815191529190a250565b3361239c6000546001600160a01b031690565b6001600160a01b0316146123c25760405162461bcd60e51b8152600401610c1d90613851565b6001600160a01b0381166124275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336124956000546001600160a01b031690565b6001600160a01b0316146124bb5760405162461bcd60e51b8152600401610c1d90613851565b6119376005825b600061230f836001600160a01b038416612a19565b6001600160a01b0383166125215760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c1d565b6001600160a01b0382166125695760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c1d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166126155760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c1d565b6001600160a01b03821661265e5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c1d565b600061266b600585612a68565b8061267c575061267c600584612a68565b905060006001600160a01b03851630148061269f57506001600160a01b03841630145b6013546012549192506001600160a01b0390811691600091888116600160301b909204161480156126e15750816001600160a01b0316866001600160a01b0316145b8061271c57506012546001600160a01b03878116600160301b9092041614801561271c5750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127565750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b03898116600160301b9092041614806127905750836001600160a01b0316886001600160a01b0316145b9050848061279b5750825b806127a35750855b156127b8576127b3898989612a8a565b61281c565b601854610100900460ff1661280f5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610c1d565b61281c8989898585612b43565b505050505050505050565b6016805460ff19166001908117909155306000908152602091909152604081205460125490919061286f90640100000000810460ff9081169165010000000000900416613ad1565b60ff169050600060075490508083108061288b575061ffff8216155b156128985750505061296e565b60125460009061ffff8416906128b990640100000000900460ff16846138fc565b6128c3919061391b565b905060006128d18284613978565b905060006128e060028461391b565b905060006128ee8285613978565b905060006128fc848361398f565b9050476129088261315c565b60006129148247613978565b905060008361292386846138fc565b61292d919061391b565b905061293986826132c4565b50600090506129488447613978565b9050806014600082825461295c919061398f565b90915550505050505050505050505050505b6016805460ff19169055565b600061230f836001600160a01b0384166133c9565b60195481116129f85760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610c1d565b60198190556040518190600080516020613bfa83398151915290600090a250565b6000818152600183016020526040812054612a6057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bdc565b506000610bdc565b6001600160a01b0381166000908152600183016020526040812054151561230f565b6001600160a01b03831660009081526001602052604090205481811015612aee5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1d565b612af884836134b6565b612b0283836134fb565b826001600160a01b0316846001600160a01b0316600080516020613c1a83398151915284604051612b3591815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612bb15760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1d565b60008315612cde57600d54861115612bfd5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610c1d565b6001600160a01b03881660009081526004602052604090205460ff1615612c5d5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c1d565b601054600f54612c6d919061398f565b4211158015612c7e57506011546001145b15612ccd576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b50601254610100900460ff16613009565b8415612e6b57600c54612cf1878561398f565b1115612d325760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1d565b600e54861115612d8f5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610c1d565b6001600160a01b03871660009081526004602052604090205460ff1615612def5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610c1d565b601054600f54612dff919061398f565b4211158015612e1057506011546001145b15612e5f576001600160a01b038716600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125460ff16613009565b6001600160a01b03881660009081526004602052604090205460ff1615612ed45760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610c1d565b6001600160a01b03871660009081526004602052604090205460ff1615612f3d5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610c1d565b600c54612f4a878561398f565b1115612f8b5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1d565b601054600f54612f9b919061398f565b4211158015612fac57506011546001145b15612ffb576001600160a01b038816600081815260046020526040808220805460ff19166001179055517f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e5713519190a25b5060125462010000900460ff165b6012546001600160a01b03898116600160301b9092041614801590613031575060185460ff16155b8015613040575060165460ff16155b80156130495750835b1561305657613056612827565b60006130728783601260039054906101000a900460ff1661351f565b6012549091506000906130a890899085906130a39060ff640100000000820481169165010000000000900416613ad1565b61351f565b905060006130b6828461398f565b6130c0908a613978565b90506130cc8b8a6134b6565b30600090815260016020526040812080548492906130eb90849061398f565b9250508190555082600b60008282546131049190613978565b9091555061311490508a826134fb565b896001600160a01b03168b6001600160a01b0316600080516020613c1a8339815191528360405161314791815260200190565b60405180910390a35050505050505050505050565b6013546131749030906001600160a01b0316836124d7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106131a9576131a9613af6565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156131fd57600080fd5b505afa158015613211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132359190613b27565b8160018151811061324857613248613af6565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac9479061328e908590600090869030904290600401613b44565b600060405180830381600087803b1580156132a857600080fd5b505af11580156132bc573d6000803e3d6000fd5b505050505050565b60008082601560008282546132d9919061398f565b909155506000905060646132ee85604b6138fc565b6132f8919061391b565b90506000606461330987604b6138fc565b613313919061391b565b60135490915061332e9030906001600160a01b0316886124d7565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061336a9030908b90879089908490429060040161393d565b6060604051808303818588803b15801561338357600080fd5b505af1158015613397573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133bc9190613bb5565b5096979596505050505050565b600081815260018301602052604081205480156134ac5760006133ed600183613978565b855490915060009061340190600190613978565b9050600086600001828154811061341a5761341a613af6565b906000526020600020015490508087600001848154811061343d5761343d613af6565b60009182526020808320909101929092558281526001890190915260409020849055865487908061347057613470613be3565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bdc565b6000915050610bdc565b6001600160a01b0382166000908152600160205260408120546134da908390613978565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b0382166000908152600160205260408120546134da90839061398f565b60006127108260ff168460ff168661353791906138fc565b61354191906138fc565b61354b919061391b565b949350505050565b6001600160a01b038116811461147457600080fd5b8035610bc681613553565b60006020828403121561358557600080fd5b813561230f81613553565b600060208083528351808285015260005b818110156135bd578581018301518582016040015282016135a1565b818111156135cf576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156135f857600080fd5b823561360381613553565b946020939093013593505050565b60008060006060848603121561362657600080fd5b833561363181613553565b9250602084013561364181613553565b929592945050506040919091013590565b60006020828403121561366457600080fd5b5035919050565b803560ff81168114610bc657600080fd5b60008060008060008060c0878903121561369557600080fd5b61369e8761366b565b95506136ac6020880161366b565b94506136ba6040880161366b565b93506136c86060880161366b565b92506136d66080880161366b565b91506136e460a0880161366b565b90509295509295509295565b801515811461147457600080fd5b60006020828403121561371057600080fd5b813561230f816136f0565b6000806040838503121561372e57600080fd5b50508035926020909101359150565b6000806040838503121561375057600080fd5b823561375b81613553565b9150602083013561376b81613553565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561379f57600080fd5b823567ffffffffffffffff808211156137b757600080fd5b818501915085601f8301126137cb57600080fd5b8135818111156137dd576137dd613776565b8060051b604051601f19603f8301168101818110858211171561380257613802613776565b60405291825284820192508381018501918883111561382057600080fd5b938501935b828510156138455761383685613568565b84529385019392850192613825565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156138c257600080fd5b5051919050565b6000602082840312156138db57600080fd5b815161230f816136f0565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613916576139166138e6565b500290565b60008261393857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561398a5761398a6138e6565b500390565b600082198211156139a2576139a26138e6565b500190565b600181815b808511156139e25781600019048211156139c8576139c86138e6565b808516156139d557918102915b93841c93908002906139ac565b509250929050565b6000826139f957506001610bdc565b81613a0657506000610bdc565b8160018114613a1c5760028114613a2657613a42565b6001915050610bdc565b60ff841115613a3757613a376138e6565b50506001821b610bdc565b5060208310610133831016604e8410600b8410161715613a65575081810a610bdc565b613a6f83836139a7565b8060001904821115613a8357613a836138e6565b029392505050565b600061230f60ff8416836139ea565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff03821115613aee57613aee6138e6565b019392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613b2057613b206138e6565b5060010190565b600060208284031215613b3957600080fd5b815161230f81613553565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b945784516001600160a01b031683529383019391830191600101613b6f565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613bca57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220d072f27c40104ac89042cde2d408d88d44e0f85e38deb5398eb851868dc7b5bc64736f6c63430008090033

Deployed Bytecode Sourcemap

27681:29289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46994:386;;;;;;;;;;-1:-1:-1;46994:386:0;;;;;:::i;:::-;;:::i;:::-;;;706:14:1;;699:22;681:41;;669:2;654:18;46994:386:0;;;;;;;;54624:94;;;;;;;;;;-1:-1:-1;54705:5:0;;;;;;;;;;;;-1:-1:-1;;;54705:5:0;;;;54624:94;;;;;;;:::i;55509:161::-;;;;;;;;;;-1:-1:-1;55509:161:0;;;;;:::i;:::-;;:::i;52725:1015::-;;;;;;;;;;;;;:::i;:::-;;;1801:25:1;;;1789:2;1774:18;52725:1015:0;1655:177:1;28827:43:0;;;;;;;;;;;;28867:3;28827:43;;;;;2011:6:1;1999:19;;;1981:38;;1969:2;1954:18;28827:43:0;1837:188:1;42632:102:0;;;;;;;;;;-1:-1:-1;42715:11:0;;42632:102;;54934:108;;;;;;;;;;-1:-1:-1;55016:18:0;;54934:108;;28476:64;;;;;;;;;;;;;:::i;55983:392::-;;;;;;;;;;-1:-1:-1;55983:392:0;;;;;:::i;:::-;;:::i;48860:83::-;;;;;;;;;;;;;:::i;42036:249::-;;;;;;;;;;-1:-1:-1;42210:8:0;;42036:249;;;42210:8;;;;;;2778:25:1;;42219:13:0;;;;;2834:2:1;2819:18;;2812:34;42233:13:0;;;;;2862:18:1;;;2855:34;;;;42247:7:0;;;2920:2:1;2905:18;;2898:34;42210:8:0;42255;;;;2963:3:1;2948:19;;2941:35;42264:12:0;;;;;3007:3:1;2992:19;;2985:35;2765:3;2750:19;42036:249:0;2491:535:1;43103:27:0;;;;;;;;;;-1:-1:-1;43103:27:0;;;;;;;;;;;28713:45;;;;;;;;;;;;28756:2;28713:45;;54832:94;;;;;;;;;;-1:-1:-1;54832:94:0;;28468:1;3173:36:1;;3161:2;3146:18;54832:94:0;3031:184:1;47461:199:0;;;;;;;;;;-1:-1:-1;47461:199:0;;;;;:::i;:::-;;:::i;56410:205::-;;;;;;;;;;-1:-1:-1;56410:205:0;;;;;:::i;:::-;;:::i;51972:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3412:32:1;;;3394:51;;3476:2;3461:18;;3454:34;;;;3367:18;51972:695:0;3220:274:1;38077:25:0;;;;;;;;;;;;;;;;43631:494;;;;;;;;;;-1:-1:-1;43631:494:0;;;;;:::i;:::-;;:::i;43137:26::-;;;;;;;;;;;;;;;;28214:44;;;;;;;;;;-1:-1:-1;28214:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50480:26;;;;;;;;;;-1:-1:-1;50480:26:0;;;;;;;;;;;53826:268;;;;;;;;;;;;;:::i;50789:243::-;;;;;;;;;;-1:-1:-1;50789:243:0;;;;;:::i;:::-;;:::i;29773:46::-;;;;;;;;;;;;;;;;47758:1048;;;;;;;;;;-1:-1:-1;47758:1048:0;;;;;:::i;:::-;;:::i;43208:416::-;;;;;;;;;;;;;:::i;37339:31::-;;;;;;;;;;;;;;;;29007:48;;;;;;;;;;;;29046:9;29007:48;;46227:181;;;;;;;;;;-1:-1:-1;46227:181:0;;;;;:::i;:::-;;:::i;29225:77::-;;;;;;;;;;-1:-1:-1;29225:77:0;;;;-1:-1:-1;;;;;29225:77:0;;;;;;-1:-1:-1;;;;;4549:32:1;;;4531:51;;4519:2;4504:18;29225:77:0;4385:203:1;29309:80:0;;;;;;;;;;-1:-1:-1;29309:80:0;;;;-1:-1:-1;;;;;29309:80:0;;;51279:232;;;;;;;;;;-1:-1:-1;51279:232:0;;;;;:::i;:::-;;:::i;41877:151::-;;;;;;;;;;;;;:::i;:::-;;;;4767:25:1;;;4823:2;4808:18;;4801:34;;;;4740:18;41877:151:0;4593:248:1;55050:121:0;;;;;;;;;;-1:-1:-1;55050:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;55145:18:0;55118:7;55145:18;;;:9;:18;;;;;;;55050:121;9575:142;;;;;;;;;;;;;:::i;29717:49::-;;;;;;;;;;;;;;;;50594:129;;;;;;;;;;;;;:::i;42876:109::-;;;;;;;;;;;;;:::i;43170:28::-;;;;;;;;;;-1:-1:-1;43170:28:0;;;;;;;;54522:94;;;;;;;;;;-1:-1:-1;54574:7:0;8999:6;-1:-1:-1;;;;;8999:6:0;54522:94;;48955:247;;;;;;;;;;-1:-1:-1;48955:247:0;;;;;:::i;:::-;;:::i;54726:98::-;;;;;;;;;;-1:-1:-1;54809:7:0;;;;;;;;;;;;-1:-1:-1;;;54809:7:0;;;;54726:98;;44557:252;;;;;;;;;;-1:-1:-1;44557:252:0;;;;;:::i;:::-;;:::i;44210:165::-;;;;;;;;;;-1:-1:-1;44210:165:0;;;;;:::i;:::-;;:::i;49305:1045::-;;;;;;;;;;-1:-1:-1;49305:1045:0;;;;;:::i;:::-;;:::i;56623:342::-;;;;;;;;;;-1:-1:-1;56623:342:0;;;;;:::i;:::-;;:::i;55179:167::-;;;;;;;;;;-1:-1:-1;55179:167:0;;;;;:::i;:::-;;:::i;45152:156::-;;;;;;;;;;-1:-1:-1;45152:156:0;;;;;:::i;:::-;;:::i;44821:270::-;;;;;;;;;;-1:-1:-1;44821:270:0;;;;;:::i;:::-;;:::i;41508:222::-;;;;;;;;;;;;;:::i;41738:131::-;;;;;;;;;;;;;:::i;45747:179::-;;;;;;;;;;-1:-1:-1;45747:179:0;;;;;:::i;:::-;;:::i;44381:164::-;;;;;;;;;;-1:-1:-1;44381:164:0;;;;;:::i;:::-;;:::i;55354:147::-;;;;;;;;;;-1:-1:-1;55354:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;55465:19:0;;;55438:7;55465:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;55354:147;45377:246;;;;;;;;;;-1:-1:-1;45377:246:0;;;;;:::i;:::-;;:::i;46689:232::-;;;;;;;;;;-1:-1:-1;46689:232:0;;;;;:::i;:::-;;:::i;42351:275::-;;;;;;;;;;-1:-1:-1;42351:275:0;;;;;:::i;:::-;;:::i;46488:193::-;;;;;;;;;;-1:-1:-1;46488:193:0;;;;;:::i;:::-;;:::i;9872:238::-;;;;;;;;;;-1:-1:-1;9872:238:0;;;;;:::i;:::-;;:::i;45994:166::-;;;;;;;;;;-1:-1:-1;45994:166:0;;;;;:::i;:::-;;:::i;46994:386::-;-1:-1:-1;;;;;47119:27:0;;47074:18;47119:27;;;:9;:27;;;;;;;;:35;;:27;:35;47115:123;;;-1:-1:-1;47187:4:0;;46994:386;-1:-1:-1;46994:386:0:o;47115:123::-;-1:-1:-1;;;;;47252:27:0;;;;;;:9;:27;;;;;;;;47248:125;;-1:-1:-1;47321:5:0;;46994:386;-1:-1:-1;46994:386:0:o;47248:125::-;46994:386;;;:::o;55509:161::-;55586:4;55603:37;55612:10;55624:7;55633:6;55603:8;:37::i;:::-;-1:-1:-1;55658:4:0;55509:161;;;;;:::o;52725:1015::-;52784:18;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;;;;;;;;;52900:20:::1;;52881:15;:39;;52873:68;;;;-1:-1:-1::0;;;52873:68:0::1;;;;;;;:::i;:::-;53001:22;::::0;53052:39:::1;::::0;-1:-1:-1;;;53052:39:0;;53085:4:::1;53052:39;::::0;::::1;4531:51:1::0;53001:22:0;;;::::1;-1:-1:-1::0;;;;;53001:22:0::1;::::0;52952:30:::1;::::0;53001:22;;53052:24:::1;::::0;4504:18:1;;53052:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53135:16;::::0;53104:56:::1;::::0;-1:-1:-1;;;53104:56:0;;-1:-1:-1;;;;;53135:16:0;;::::1;53104:56;::::0;::::1;3394:51:1::0;3461:18;;;3454:34;;;53035:56:0;;-1:-1:-1;53104:22:0;::::1;::::0;::::1;::::0;3367:18:1;;53104:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53303:16:0::1;::::0;53261:21:::1;::::0;-1:-1:-1;;;;;53303:16:0::1;:64;53390:4;53410:6:::0;53445:3:::1;53432:9;53410:6:::0;53439:2:::1;53432:9;:::i;:::-;53431:17;;;;:::i;:::-;53477:3;53464:9;:6:::0;53471:2:::1;53464:9;:::i;:::-;53463:17;;;;:::i;:::-;53503:4;53523:15;53303:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53564:21:0::1;53588:39;53610:17:::0;53588:21:::1;:39;:::i;:::-;53564:63;;53656:13;53638:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53691:13:0;;-1:-1:-1;;;;;52725:1015:0;:::o;28476:64::-;28527:13;28468:1;28527:2;:13;:::i;:::-;28515:25;;:9;:25;:::i;:::-;28476:64;:::o;55983:392::-;56083:4;56100:36;56110:6;56118:9;56129:6;56100:9;:36::i;:::-;-1:-1:-1;;;;;56176:19:0;;56149:24;56176:19;;;:11;:19;;;;;;;;56196:10;56176:31;;;;;;;;56226:26;;;;56218:59;;;;-1:-1:-1;;;56218:59:0;;11235:2:1;56218:59:0;;;11217:21:1;11274:2;11254:18;;;11247:30;-1:-1:-1;;;11293:18:1;;;11286:50;11353:18;;56218:59:0;11033:344:1;56218:59:0;56290:55;56299:6;56307:10;56319:25;56338:6;56319:16;:25;:::i;:::-;56290:8;:55::i;:::-;-1:-1:-1;56363:4:0;;55983:392;-1:-1:-1;;;;55983:392:0:o;48860:83::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;48915:20:::1;:18;:20::i;:::-;48860:83::o:0;47461:199::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47555:31:0;::::1;47589:5;47555:31:::0;;;:9:::1;:31;::::0;;;;;:39;;-1:-1:-1;;47555:39:0::1;::::0;;47610:42;-1:-1:-1;;;;;;;;;;;47610:42:0;47589:5;47610:42:::1;47461:199:::0;:::o;56410:205::-;56518:10;56492:4;56539:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56539:32:0;;;;;;;;;;56492:4;;56509:76;;56530:7;;56539:45;;56574:10;;56539:45;:::i;51972:695::-;52032:17;;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;52167:20:::1;;52148:15;:39;;52140:68;;;;-1:-1:-1::0;;;52140:68:0::1;;;;;;;:::i;:::-;52278:22;::::0;52329:39:::1;::::0;-1:-1:-1;;;52329:39:0;;52362:4:::1;52329:39;::::0;::::1;4531:51:1::0;52278:22:0;;;::::1;-1:-1:-1::0;;;;;52278:22:0::1;::::0;52229:30:::1;::::0;52278:22;;52329:24:::1;::::0;4504:18:1;;52329:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52467:10;::::0;52443:43:::1;::::0;-1:-1:-1;;;52443:43:0;;-1:-1:-1;;;;;52467:10:0;;::::1;52443:43;::::0;::::1;3394:51:1::0;3461:18;;;3454:34;;;52312:56:0;;-1:-1:-1;52443:23:0;::::1;::::0;::::1;::::0;3367:18:1;;52443:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52526:10:0::1;::::0;52502:43:::1;::::0;1801:25:1;;;-1:-1:-1;;;;;52526:10:0;;::::1;::::0;52519:4:::1;::::0;-1:-1:-1;;;;;;;;;;;52502:43:0;1789:2:1;1774:18;52502:43:0::1;;;;;;;52568:10;::::0;-1:-1:-1;;;;;52568:10:0::1;::::0;-1:-1:-1;52602:6:0;-1:-1:-1;;51972:695:0;;:::o;43631:494::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;43727:16:::1;;43719:6;:24;;43711:91;;;::::0;-1:-1:-1;;;43711:91:0;;11584:2:1;43711:91:0::1;::::0;::::1;11566:21:1::0;11623:2;11603:18;;;11596:30;11662:34;11642:18;;;11635:62;-1:-1:-1;;;11713:18:1;;;11706:43;11766:19;;43711:91:0::1;11382:409:1::0;43711:91:0::1;43831:6;43813:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43856:10:0::1;::::0;-1:-1:-1;;;;;43856:10:0::1;43848:47;43891:3;43878:9;:6:::0;43885:2:::1;43878:9;:::i;:::-;43877:17;;;;:::i;:::-;43848:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43914:13:0::1;::::0;-1:-1:-1;;;;;43914:13:0::1;43906:59;43960:3;43947:9;:6:::0;43954:2:::1;43947:9;:::i;:::-;43946:17;;;;:::i;:::-;43939:24;::::0;:6;:24:::1;:::i;:::-;43906:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44005:10:0::1;::::0;-1:-1:-1;;;;;44005:10:0::1;43998:4;-1:-1:-1::0;;;;;;;;;;;44031:3:0::1;44018:9;:6:::0;44025:2:::1;44018:9;:::i;:::-;44017:17;;;;:::i;:::-;43981:54;::::0;1801:25:1;;;1789:2;1774:18;43981:54:0::1;;;;;;;44075:13;::::0;-1:-1:-1;;;;;44075:13:0::1;44068:4;-1:-1:-1::0;;;;;;;;;;;44112:3:0::1;44099:9;:6:::0;44106:2:::1;44099:9;:::i;:::-;44098:17;;;;:::i;:::-;44091:24;::::0;:6;:24:::1;:::i;:::-;44051:66;::::0;1801:25:1;;;1789:2;1774:18;44051:66:0::1;;;;;;;43631:494:::0;:::o;53826:268::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;53916:20:::1;;53897:15;:39;;53889:68;;;;-1:-1:-1::0;;;53889:68:0::1;;;;;;;:::i;:::-;53982:10;::::0;:51:::1;::::0;53969:9:::1;::::0;-1:-1:-1;;;;;53982:10:0::1;::::0;54006:21:::1;::::0;53969:9;53982:51;53969:9;53982:51;54006:21;53982:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53968:65;;;54052:4;54044:42;;;::::0;-1:-1:-1;;;54044:42:0;;12208:2:1;54044:42:0::1;::::0;::::1;12190:21:1::0;12247:2;12227:18;;;12220:30;-1:-1:-1;;;12266:18:1;;;12259:46;12322:18;;54044:42:0::1;12006:340:1::0;54044:42:0::1;53878:216;53826:268::o:0;50789:243::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50893:35:0;::::1;50885:84;;;;-1:-1:-1::0;;;50885:84:0::1;;;;;;;:::i;:::-;50980:22;:44:::0;;-1:-1:-1;;;;;50980:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50980:44:0;;::::1;::::0;;;::::1;::::0;;50789:243::o;47758:1048::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;47918:14:::1;47958::::0;47933:24:::1;47943:14:::0;47933:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47918:54;;47991:8;:13;;48001:3;47991:13;47983:64;;;::::0;-1:-1:-1;;;47983:64:0;;13118:2:1;47983:64:0::1;::::0;::::1;13100:21:1::0;13157:2;13137:18;;;13130:30;13196:34;13176:18;;;13169:62;-1:-1:-1;;;13247:18:1;;;13240:36;13293:19;;47983:64:0::1;12916:402:1::0;47983:64:0::1;48076:2;48066:6;:12;;;;48058:95;;;::::0;-1:-1:-1;;;48058:95:0;;13525:2:1;48058:95:0::1;::::0;::::1;13507:21:1::0;13564:2;13544:18;;;13537:30;13603:34;13583:18;;;13576:62;13674:31;13654:18;;;13647:59;13723:19;;48058:95:0::1;13323:425:1::0;48058:95:0::1;48183:2;48172:7;:13;;;;48164:97;;;::::0;-1:-1:-1;;;48164:97:0;;13955:2:1;48164:97:0::1;::::0;::::1;13937:21:1::0;13994:2;13974:18;;;13967:30;14033:34;14013:18;;;14006:62;14104:32;14084:18;;;14077:60;14154:19;;48164:97:0::1;13753:426:1::0;48164:97:0::1;48295:2;48280:11;:17;;;;48272:105;;;::::0;-1:-1:-1;;;48272:105:0;;14386:2:1;48272:105:0::1;::::0;::::1;14368:21:1::0;14425:2;14405:18;;;14398:30;14464:34;14444:18;;;14437:62;14535:34;14515:18;;;14508:62;-1:-1:-1;;;14586:19:1;;;14579:33;14629:19;;48272:105:0::1;14184:470:1::0;48272:105:0::1;48399:9;48390:8;;:18;;;;;;;;;;;;;;;;;;48433:14;48419:13;;:28;;;;;;;;;;;;;;;;;;48472:14;48458:13;;:28;;;;;;;;;;;;;;;;;;48515:6;48507:7;;:14;;;;;;;;;;;;;;;;;;48541:7;48532:8;;:16;;;;;;;;;;;;;;;;;;48572:11;48559:12;;:24;;;;;;;;;;;;;;;;;;48617:8;;;;;;;;;;;48601:25;;-1:-1:-1::0;;;;;;;;;;;48601:25:0::1;;;;;;;;;48658:13;::::0;48642:30:::1;::::0;48658:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48642:30:0;;;::::1;48704:7;::::0;48688:24:::1;::::0;48704:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;48688:24:0;48704:7:::1;::::0;48688:24:::1;48744:8;::::0;48728:25:::1;::::0;48744:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48728:25:0;;;::::1;48785:12;::::0;48769:29:::1;::::0;48785:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48769:29:0;;;::::1;47907:899;47758:1048:::0;;;;;;:::o;43208:416::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;43291:16:::1;::::0;;43276:14:::1;43318:18:::0;;;43355:10:::1;::::0;-1:-1:-1;;;;;43355:10:0::1;43347:47;43390:3;43377:9;43291:16:::0;43384:2:::1;43377:9;:::i;46227:181::-:0;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46312:33:::1;:9;46329:15:::0;46312:16:::1;:33::i;:::-;-1:-1:-1::0;46361:39:0::1;::::0;-1:-1:-1;;;;;46361:39:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46361:39:0;;;::::1;46227:181:::0;:::o;51279:232::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;51379:57:::1;51401:34;51420:15;51401:18:::0;:34:::1;:::i;:::-;51379:21;:57::i;:::-;51468:34;51487:15;51468:18:::0;:34:::1;:::i;:::-;51452:51;::::0;-1:-1:-1;;;;;;;;;;;51452:51:0;;;::::1;51279:232:::0;:::o;41877:151::-;41920:15;;41981:13;28468:1;41981:2;:13;:::i;:::-;41968:12;;:26;;;;:::i;:::-;42006:13;28468:1;42006:2;:13;:::i;:::-;41996:9;;:23;;;;:::i;:::-;41961:59;;;;41877:151;;:::o;9575:142::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;9676:1:::1;9660:6:::0;;9639:40:::1;::::0;-1:-1:-1;;;;;9660:6:0;;::::1;::::0;9639:40:::1;::::0;9676:1;;9639:40:::1;9707:1;9690:19:::0;;-1:-1:-1;;;;;;9690:19:0::1;::::0;;9575:142::o;50594:129::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;50653:14:::1;:19:::0;;-1:-1:-1;;50653:19:0::1;;;::::0;;50700:15:::1;50683:16;:32:::0;50594:129::o;42876:109::-;42963:11;;42947:27;;:15;:27;:::i;:::-;42935:10;42926:20;;;;:8;:20;;;;;:48;42876:109::o;54601:7::-;54594:14;;54522:94;:::o;48955:247::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49045:23:0;::::1;49037:72;;;;-1:-1:-1::0;;;49037:72:0::1;;;;;;;:::i;:::-;49120:15;:25:::0;;-1:-1:-1;;;;;;49120:25:0::1;-1:-1:-1::0;;;;;49120:25:0;::::1;::::0;;::::1;::::0;;;49161:33:::1;::::0;-1:-1:-1;;;;;;;;;;;49161:33:0;-1:-1:-1;;49161:33:0::1;48955:247:::0;:::o;44557:252::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44645:27:0;::::1;44637:74;;;;-1:-1:-1::0;;;44637:74:0::1;;;;;;;:::i;:::-;44720:10;:33:::0;;-1:-1:-1;;;;;;44720:33:0::1;-1:-1:-1::0;;;;;44720:33:0;::::1;::::0;;::::1;::::0;;;44767:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44767:34:0;-1:-1:-1;;44767:34:0::1;44557:252:::0;:::o;44210:165::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;44291:16:::1;:23:::0;;-1:-1:-1;;44291:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44330:37:::1;::::0;44291:23:::1;44350:16:::0;;;44330:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44330:37:0::1;44210:165:::0;:::o;49305:1045::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;49543:3:::1;49524:18;;:22;;;;:::i;:::-;49511:12;:35;49503:110;;;::::0;-1:-1:-1;;;49503:110:0;;14861:2:1;49503:110:0::1;::::0;::::1;14843:21:1::0;14900:2;14880:18;;;14873:30;14939:34;14919:18;;;14912:62;-1:-1:-1;;;14990:18:1;;;14983:51;15051:19;;49503:110:0::1;14659:417:1::0;49503:110:0::1;49691:13;28468:1;49691:2;:13;:::i;:::-;49675:29;::::0;:15;:29:::1;:::i;:::-;49659:45:::0;-1:-1:-1;49741:13:0::1;28468:1;49741:2;:13;:::i;:::-;49728:26;::::0;:12;:26:::1;:::i;:::-;49715:39;;49821:26;28756:2;49848:38;;:18;;:38;;;;:::i;:::-;49821:65;;49897:23;28867:3;49921:35;;:18;;:35;;;;:::i;:::-;49897:59;;49995:18;49978:15;:35;;49969:103;;;::::0;-1:-1:-1;;;49969:103:0;;15283:2:1;49969:103:0::1;::::0;::::1;15265:21:1::0;15322:2;15302:18;;;15295:30;15361:34;15341:18;;;15334:62;-1:-1:-1;;;15412:18:1;;;15405:41;15463:19;;49969:103:0::1;15081:407:1::0;49969:103:0::1;50106:15;50092:12;:29;;50083:94;;;::::0;-1:-1:-1;;;50083:94:0;;15695:2:1;50083:94:0::1;::::0;::::1;15677:21:1::0;15734:2;15714:18;;;15707:30;15773:34;15753:18;;;15746:62;-1:-1:-1;;;15824:18:1;;;15817:38;15872:19;;50083:94:0::1;15493:404:1::0;50083:94:0::1;50190:12;:30:::0;;;50231:9:::1;:24:::0;;;50271:29:::1;::::0;50205:15;;-1:-1:-1;;;;;;;;;;;50271:29:0;-1:-1:-1;;50271:29:0::1;50332:9;::::0;50316:26:::1;::::0;-1:-1:-1;;;;;;;;;;;50316:26:0;;;::::1;49396:954;;49305:1045:::0;;:::o;56623:342::-;56766:10;56710:4;56754:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56754:32:0;;;;;;;;;;56805:35;;;;56797:60;;;;-1:-1:-1;;;56797:60:0;;16104:2:1;56797:60:0;;;16086:21:1;16143:2;16123:18;;;16116:30;-1:-1:-1;;;16162:18:1;;;16155:42;16214:18;;56797:60:0;15902:336:1;56797:60:0;56870:65;56879:10;56891:7;56900:34;56919:15;56900:16;:34;:::i;56870:65::-;-1:-1:-1;56953:4:0;;56623:342;-1:-1:-1;;;56623:342:0:o;55179:167::-;55259:4;55276:40;55286:10;55298:9;55309:6;55276:9;:40::i;45152:156::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;45224:15:::1;:24:::0;;-1:-1:-1;;45224:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45264:36:::1;::::0;45224:24:::1;45284:15:::0;;;::::1;;45264:36;;::::0;::::1;::::0;-1:-1:-1;;45264:36:0::1;45152:156:::0;:::o;44821:270::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44915:30:0;::::1;44907:77;;;;-1:-1:-1::0;;;44907:77:0::1;;;;;;;:::i;:::-;44993:13;:39:::0;;-1:-1:-1;;;;;;44993:39:0::1;-1:-1:-1::0;;;;;44993:39:0;::::1;::::0;;::::1;::::0;;;45046:37:::1;::::0;-1:-1:-1;;;;;;;;;;;45046:37:0;-1:-1:-1;;45046:37:0::1;44821:270:::0;:::o;41508:222::-;41575:7;41613:20;;41597:15;:36;41594:110;;;41677:15;41656:20;;:36;;;;:::i;41594:110::-;-1:-1:-1;41721:1:0;;41508:222::o;41738:131::-;41787:7;41848:13;28468:1;41848:2;:13;:::i;:::-;41828:18;;28527:13;28468:1;28527:2;:13;:::i;:::-;28515:25;;:9;:25;:::i;:::-;41814:32;;;;:::i;:::-;41813:48;;;;:::i;45747:179::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;45831:19:::1;:35:::0;;;45882:36:::1;::::0;45853:13;;-1:-1:-1;;;;;;;;;;;45882:36:0;;;::::1;45747:179:::0;:::o;44381:164::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;44484:13:::1;28468:1;44484:2;:13;:::i;:::-;44469:28;::::0;:12;:28:::1;:::i;:::-;44459:9;:38:::0;;;44511:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44511:26:0;;;::::1;44381:164:::0;:::o;45377:246::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;29046:9:::1;45470:30:::0;::::1;;45462:64;;;::::0;-1:-1:-1;;;45462:64:0;;16445:2:1;45462:64:0::1;::::0;::::1;16427:21:1::0;16484:2;16464:18;;;16457:30;-1:-1:-1;;;16503:18:1;;;16496:52;16565:18;;45462:64:0::1;16243:346:1::0;45462:64:0::1;45541:11;:26:::0;;;45587:28:::1;::::0;45553:14;;-1:-1:-1;;;;;;;;;;;45587:28:0;;;::::1;45377:246:::0;:::o;46689:232::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46795:9:::1;46789:115;46811:8;:15;46808:1;:18;46789:115;;;46874:4;46849:9;:22;46859:8;46868:1;46859:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46849:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46849:22:0;:29;;-1:-1:-1;;46849:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46829:3;::::1;::::0;::::1;:::i;:::-;;;;46789:115;;;;46689:232:::0;:::o;42351:275::-;-1:-1:-1;;;;;42473:24:0;;42438:7;42473:24;;;:8;:24;;;;;;42520:15;42510:25;;42507:71;;-1:-1:-1;42566:1:0;;42351:275;-1:-1:-1;;42351:275:0:o;42507:71::-;42594:24;42603:15;42594:8;:24;:::i;:::-;42587:31;42351:275;-1:-1:-1;;;42351:275:0:o;46488:193::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46577:31:0;::::1;;::::0;;;:9:::1;:31;::::0;;;;;:38;;-1:-1:-1;;46577:38:0::1;46611:4;46577:38;::::0;;46631:42;-1:-1:-1;;;;;;;;;;;46631:42:0;46577:31;46631:42:::1;46488:193:::0;:::o;9872:238::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9955:22:0;::::1;9947:73;;;::::0;-1:-1:-1;;;9947:73:0;;17068:2:1;9947:73:0::1;::::0;::::1;17050:21:1::0;17107:2;17087:18;;;17080:30;17146:34;17126:18;;;17119:62;-1:-1:-1;;;17197:18:1;;;17190:36;17243:19;;9947:73:0::1;16866:402:1::0;9947:73:0::1;10057:6;::::0;;10036:38:::1;::::0;-1:-1:-1;;;;;10036:38:0;;::::1;::::0;10057:6;::::1;::::0;10036:38:::1;::::0;::::1;10085:6;:17:::0;;-1:-1:-1;;;;;;10085:17:0::1;-1:-1:-1::0;;;;;10085:17:0;;;::::1;::::0;;;::::1;::::0;;9872:238::o;45994:166::-;9157:10;9146:7;8972;8999:6;-1:-1:-1;;;;;8999:6:0;;8934:79;9146:7;-1:-1:-1;;;;;9146:21:0;;9138:66;;;;-1:-1:-1;;;9138:66:0;;;;;;;:::i;:::-;46073:27:::1;:9;46087:12:::0;24625:152;24695:4;24719:50;24724:3;-1:-1:-1;;;;;24744:23:0;;24719:4;:50::i;55676:299::-;-1:-1:-1;;;;;55769:19:0;;55761:49;;;;-1:-1:-1;;;55761:49:0;;17475:2:1;55761:49:0;;;17457:21:1;17514:2;17494:18;;;17487:30;-1:-1:-1;;;17533:18:1;;;17526:47;17590:18;;55761:49:0;17273:341:1;55761:49:0;-1:-1:-1;;;;;55829:21:0;;55821:49;;;;-1:-1:-1;;;55821:49:0;;17821:2:1;55821:49:0;;;17803:21:1;17860:2;17840:18;;;17833:30;-1:-1:-1;;;17879:18:1;;;17872:45;17934:18;;55821:49:0;17619:339:1;55821:49:0;-1:-1:-1;;;;;55883:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55935:32;;1801:25:1;;;55935:32:0;;1774:18:1;55935:32:0;;;;;;;55676:299;;;:::o;31895:1540::-;-1:-1:-1;;;;;31991:20:0;;31983:51;;;;-1:-1:-1;;;31983:51:0;;18165:2:1;31983:51:0;;;18147:21:1;18204:2;18184:18;;;18177:30;-1:-1:-1;;;18223:18:1;;;18216:48;18281:18;;31983:51:0;17963:342:1;31983:51:0;-1:-1:-1;;;;;32053:23:0;;32045:52;;;;-1:-1:-1;;;32045:52:0;;18512:2:1;32045:52:0;;;18494:21:1;18551:2;18531:18;;;18524:30;-1:-1:-1;;;18570:18:1;;;18563:46;18626:18;;32045:52:0;18310:340:1;32045:52:0;32190:15;32209:26;:9;32228:6;32209:18;:26::i;:::-;:59;;;-1:-1:-1;32239:29:0;:9;32258;32239:18;:29::i;:::-;32190:79;-1:-1:-1;32368:23:0;-1:-1:-1;;;;;32393:21:0;;32409:4;32393:21;;:49;;-1:-1:-1;;;;;;32418:24:0;;32437:4;32418:24;32393:49;32577:16;;32644:21;;32368:75;;-1:-1:-1;;;;;;32577:16:0;;;;32545:23;;32634:31;;;-1:-1:-1;;;32644:21:0;;;;32634:31;:63;;;;;32682:15;-1:-1:-1;;;;;32669:28:0;:9;-1:-1:-1;;;;;32669:28:0;;32634:63;32633:144;;;-1:-1:-1;32726:21:0;;-1:-1:-1;;;;;32713:34:0;;;-1:-1:-1;;;32726:21:0;;;;32713:34;:63;;;;;32761:15;-1:-1:-1;;;;;32751:25:0;:6;-1:-1:-1;;;;;32751:25:0;;32713:63;32899:21;;32605:173;;-1:-1:-1;32880:10:0;;-1:-1:-1;;;;;32891:29:0;;;-1:-1:-1;;;32899:21:0;;;;32891:29;;:57;;;32933:15;-1:-1:-1;;;;;32923:25:0;:6;-1:-1:-1;;;;;32923:25:0;;32891:57;32982:21;;32880:68;;-1:-1:-1;32959:11:0;;-1:-1:-1;;;;;32971:32:0;;;-1:-1:-1;;;32982:21:0;;;;32971:32;;:63;;;33019:15;-1:-1:-1;;;;;33006:28:0;:9;-1:-1:-1;;;;;33006:28:0;;32971:63;32959:75;;33075:18;:41;;;;33097:19;33075:41;:55;;;;33120:10;33075:55;33072:356;;;33146:43;33163:6;33171:9;33182:6;33146:16;:43::i;:::-;33072:356;;;33308:14;;;;;;;33300:49;;;;-1:-1:-1;;;33300:49:0;;18857:2:1;33300:49:0;;;18839:21:1;18896:2;18876:18;;;18869:30;18935:25;18915:18;;;18908:53;18978:18;;33300:49:0;18655:347:1;33300:49:0;33364:52;33379:6;33386:9;33396:6;33403:5;33409:6;33364:14;:52::i;:::-;31972:1463;;;;;;31895:1540;;;:::o;38482:1582::-;38230:27;:34;;-1:-1:-1;;38230:34:0;38260:4;38230:34;;;;;;38584:4:::1;38230:27:::0;38566:24;;;::::1;::::0;;;;;;;;38631:13:::1;::::0;38566:24;;38230:27;38617::::1;::::0;38631:13;;::::1;38230:34:::0;38631:13;;::::1;::::0;38617;;::::1;;:27;:::i;:::-;38601:43;;;;38655:19;38677;;38655:41;;38823:11;38807:15;:27;:40;;;-1:-1:-1::0;38836:11:0::1;::::0;::::1;::::0;38807:40:::1;38804:77;;;38863:7;;;;;38804:77;39001:13;::::0;38962:25:::1;::::0;38988:36:::1;::::0;::::1;::::0;38989:25:::1;::::0;39001:13;;::::1;;;38989:11:::0;:25:::1;:::i;:::-;38988:36;;;;:::i;:::-;38962:62:::0;-1:-1:-1;39035:25:0::1;39062:29;38962:62:::0;39062:11;:29:::1;:::i;:::-;39035:56:::0;-1:-1:-1;39152:16:0::1;39169:19;39187:1;39169:17:::0;:19:::1;:::i;:::-;39152:36:::0;-1:-1:-1;39199:19:0::1;39219:26;39152:36:::0;39219:17;:26:::1;:::i;:::-;39199:46:::0;-1:-1:-1;39328:17:0::1;39346:29;39358:17:::0;39199:46;39346:29:::1;:::i;:::-;39328:47:::0;-1:-1:-1;39454:21:0::1;39486:27;39328:47:::0;39486:16:::1;:27::i;:::-;39524:14;39540:41;39564:17:::0;39540:21:::1;:41;:::i;:::-;39524:58:::0;-1:-1:-1;39682:14:0::1;39720:9:::0;39700:18:::1;39707:11:::0;39524:58;39700:18:::1;:::i;:::-;39699:30;;;;:::i;:::-;39682:47;;39740:31;39754:8;39764:6;39740:13;:31::i;:::-;-1:-1:-1::0;39896:21:0::1;::::0;-1:-1:-1;39919:41:0::1;39943:17:::0;39919:21:::1;:41;:::i;:::-;39896:65;;40043:13;40025:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38275:1:0::1;38287:27:::0;:35;;-1:-1:-1;;38287:35:0;;;38482:1582::o;24953:158::-;25026:4;25050:53;25058:3;-1:-1:-1;;;;;25078:23:0;;25050:7;:53::i;51564:343::-;51720:20;;51706:13;:34;51698:103;;;;-1:-1:-1;;;51698:103:0;;19209:2:1;51698:103:0;;;19191:21:1;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;-1:-1:-1;;;19338:18:1;;;19331:45;19393:19;;51698:103:0;19007:411:1;51698:103:0;51812:20;:34;;;51862:37;;51833:13;;-1:-1:-1;;;;;;;;;;;51862:37:0;;;;51564:343;:::o;19680:414::-;19743:4;22006:19;;;:12;;;:19;;;;;;19760:327;;-1:-1:-1;19803:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19986:18;;19964:19;;;:12;;;:19;;;;;;:40;;;;20019:11;;19760:327;-1:-1:-1;20070:5:0;20063:12;;25197:167;-1:-1:-1;;;;;25331:23:0;;25277:4;22006:19;;;:12;;;:19;;;;;;:24;;25301:55;21909:129;36673:400;-1:-1:-1;;;;;36792:17:0;;36768:21;36792:17;;;:9;:17;;;;;;36828:23;;;;36820:60;;;;-1:-1:-1;;;36820:60:0;;19625:2:1;36820:60:0;;;19607:21:1;19664:2;19644:18;;;19637:30;-1:-1:-1;;;19683:18:1;;;19676:54;19747:18;;36820:60:0;19423:348:1;36820:60:0;36916:27;36929:6;36936;36916:12;:27::i;:::-;36976:28;36986:9;36997:6;36976:9;:28::i;:::-;37046:9;-1:-1:-1;;;;;37030:33:0;37039:6;-1:-1:-1;;;;;37030:33:0;-1:-1:-1;;;;;;;;;;;37056:6:0;37030:33;;;;1801:25:1;;1789:2;1774:18;;1655:177;37030:33:0;;;;;;;;36757:316;36673:400;;;:::o;33505:3121::-;-1:-1:-1;;;;;33648:20:0;;;33621:24;33648:20;;;:9;:20;;;;;;;33703:17;;;;;;;;33739:23;;;;33731:60;;;;-1:-1:-1;;;33731:60:0;;19625:2:1;33731:60:0;;;19607:21:1;19664:2;19644:18;;;19637:30;-1:-1:-1;;;19683:18:1;;;19676:54;19747:18;;33731:60:0;19423:348:1;33731:60:0;33804:9;33827:6;33824:1611;;;33914:9;;33906:6;:17;;33898:44;;;;-1:-1:-1;;;33898:44:0;;19978:2:1;33898:44:0;;;19960:21:1;20017:2;19997:18;;;19990:30;-1:-1:-1;;;20036:18:1;;;20029:45;20091:18;;33898:44:0;19776:339:1;33898:44:0;-1:-1:-1;;;;;33965:17:0;;;;;;:9;:17;;;;;;;;:26;33957:59;;;;-1:-1:-1;;;33957:59:0;;20322:2:1;33957:59:0;;;20304:21:1;20361:2;20341:18;;;20334:30;-1:-1:-1;;;20380:18:1;;;20373:50;20440:18;;33957:59:0;20120:344:1;33957:59:0;34073:11;;34054:16;;:30;;;;:::i;:::-;34035:15;:49;;:77;;;;;34088:19;;34111:1;34088:24;34035:77;34031:184;;;-1:-1:-1;;;;;34133:17:0;;;;;;:9;:17;;;;;;:24;;-1:-1:-1;;34133:24:0;34153:4;34133:24;;;34181:18;;;34133:17;34181:18;34031:184;-1:-1:-1;34233:8:0;;;;;;;33824:1611;;;34266:5;34263:1172;;;34411:12;;34386:23;34403:6;34386:16;:23;:::i;:::-;:37;;34378:65;;;;-1:-1:-1;;;34378:65:0;;20671:2:1;34378:65:0;;;20653:21:1;20710:2;20690:18;;;20683:30;-1:-1:-1;;;20729:18:1;;;20722:46;20785:18;;34378:65:0;20469:340:1;34378:65:0;34467:9;;34457:6;:19;;34449:65;;;;-1:-1:-1;;;34449:65:0;;21016:2:1;34449:65:0;;;20998:21:1;21055:2;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;-1:-1:-1;;;21145:18:1;;;21138:32;21187:19;;34449:65:0;20814:398:1;34449:65:0;-1:-1:-1;;;;;34537:20:0;;;;;;:9;:20;;;;;;;;:29;34529:62;;;;-1:-1:-1;;;34529:62:0;;20322:2:1;34529:62:0;;;20304:21:1;20361:2;20341:18;;;20334:30;-1:-1:-1;;;20380:18:1;;;20373:50;20440:18;;34529:62:0;20120:344:1;34529:62:0;34648:11;;34629:16;;:30;;;;:::i;:::-;34610:15;:49;;:77;;;;;34663:19;;34686:1;34663:24;34610:77;34606:190;;;-1:-1:-1;;;;;34708:20:0;;;;;;:9;:20;;;;;;:27;;-1:-1:-1;;34708:27:0;34731:4;34708:27;;;34759:21;;;34708:20;34759:21;34606:190;-1:-1:-1;34814:7:0;;;;34263:1172;;;-1:-1:-1;;;;;34965:17:0;;;;;;:9;:17;;;;;;;;:26;34957:66;;;;-1:-1:-1;;;34957:66:0;;21419:2:1;34957:66:0;;;21401:21:1;21458:2;21438:18;;;21431:30;21497:29;21477:18;;;21470:57;21544:18;;34957:66:0;21217:351:1;34957:66:0;-1:-1:-1;;;;;35046:20:0;;;;;;:9;:20;;;;;;;;:29;35038:72;;;;-1:-1:-1;;;35038:72:0;;21775:2:1;35038:72:0;;;21757:21:1;21814:2;21794:18;;;21787:30;21853:32;21833:18;;;21826:60;21903:18;;35038:72:0;21573:354:1;35038:72:0;35158:12;;35133:23;35150:6;35133:16;:23;:::i;:::-;:37;;35125:65;;;;-1:-1:-1;;;35125:65:0;;20671:2:1;35125:65:0;;;20653:21:1;20710:2;20690:18;;;20683:30;-1:-1:-1;;;20729:18:1;;;20722:46;20785:18;;35125:65:0;20469:340:1;35125:65:0;35247:11;;35228:16;;:30;;;;:::i;:::-;35209:15;:49;;:77;;;;;35262:19;;35285:1;35262:24;35209:77;35205:184;;;-1:-1:-1;;;;;35307:17:0;;;;;;:9;:17;;;;;;:24;;-1:-1:-1;;35307:24:0;35327:4;35307:24;;;35355:18;;;35307:17;35355:18;35205:184;-1:-1:-1;35407:12:0;;;;;;;34263:1172;35772:21;;-1:-1:-1;;;;;35764:29:0;;;-1:-1:-1;;;35772:21:0;;;;35764:29;;;;35763:52;;-1:-1:-1;35798:16:0;;;;35797:17;35763:52;:84;;;;-1:-1:-1;35819:27:0;;;;35818:28;35763:84;:92;;;;;35849:6;35763:92;35760:130;;;35870:20;:18;:20::i;:::-;35959:23;35983:36;35997:6;36005:3;36010:8;;;;;;;;;;;35983:13;:36::i;:::-;36093:13;;35959:60;;-1:-1:-1;36030:21:0;;36052:55;;36066:6;;36074:3;;36079:27;;36093:13;;;;;;;36079;;;;:27;:::i;:::-;36052:13;:55::i;:::-;36030:77;-1:-1:-1;36171:19:0;36199:31;36030:77;36199:15;:31;:::i;:::-;36191:40;;:6;:40;:::i;:::-;36171:60;;36269:27;36282:6;36289;36269:12;:27::i;:::-;36391:4;36373:24;;;;:9;:24;;;;;:41;;36401:13;;36373:24;:41;;36401:13;;36373:41;:::i;:::-;;;;;;;;36469:15;36449:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36519:33:0;;-1:-1:-1;36529:9:0;36540:11;36519:9;:33::i;:::-;36594:9;-1:-1:-1;;;;;36578:38:0;36587:6;-1:-1:-1;;;;;36578:38:0;-1:-1:-1;;;;;;;;;;;36604:11:0;36578:38;;;;1801:25:1;;1789:2;1774:18;;1655:177;36578:38:0;;;;;;;;33610:3016;;;;;;33505:3121;;;;;:::o;40114:461::-;40207:16;;40175:58;;40192:4;;-1:-1:-1;;;;;40207:16:0;40226:6;40175:8;:58::i;:::-;40268:16;;;40282:1;40268:16;;;;;;;;40244:21;;40268:16;;;;;;;;;;-1:-1:-1;40268:16:0;40244:40;;40313:4;40295;40300:1;40295:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40295:23:0;;;:7;;;;;;;;;;:23;;;;40339:16;;:23;;;-1:-1:-1;;;40339:23:0;;;;:16;;;;;:21;;:23;;;;;40295:7;;40339:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40329:4;40334:1;40329:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40329:33:0;;;:7;;;;;;;;;:33;40375:16;;:192;;-1:-1:-1;;;40375:192:0;;:16;;;:67;;:192;;40457:6;;40375:16;;40494:4;;40521;;40541:15;;40375:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40164:411;40114:461;:::o;40702:686::-;40782:19;40803:21;40849:9;40837:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40869:14:0;;-1:-1:-1;40903:3:0;40887:12;:9;40897:2;40887:12;:::i;:::-;40886:20;;;;:::i;:::-;40869:37;-1:-1:-1;40917:17:0;40956:3;40938:14;:11;40950:2;40938:14;:::i;:::-;40937:22;;;;:::i;:::-;41002:16;;40917:42;;-1:-1:-1;40970:63:0;;40987:4;;-1:-1:-1;;;;;41002:16:0;41021:11;40970:8;:63::i;:::-;41044:16;;:218;;-1:-1:-1;;;41044:218:0;;-1:-1:-1;;;;;41044:16:0;;;;:32;;41084:9;;41044:218;;41117:4;;41137:11;;41163:9;;41187:6;;41117:4;;41236:15;;41044:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41287:11:0;;41325:9;;-1:-1:-1;;;;;;40702:686:0:o;20270:1553::-;20336:4;20475:19;;;:12;;;:19;;;;;;20511:15;;20507:1309;;20873:21;20897:14;20910:1;20897:10;:14;:::i;:::-;20946:18;;20873:38;;-1:-1:-1;20926:17:0;;20946:22;;20967:1;;20946:22;:::i;:::-;20926:42;;21213:17;21233:3;:11;;21245:9;21233:22;;;;;;;;:::i;:::-;;;;;;;;;21213:42;;21379:9;21350:3;:11;;21362:13;21350:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21456:23;;;:12;;;:23;;;;;;:36;;;21617:17;;21456:3;;21617:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21712:3;:12;;:19;21725:5;21712:19;;;;;;;;;;;21705:26;;;21755:4;21748:11;;;;;;;;20507:1309;21799:5;21792:12;;;;;37673:228;-1:-1:-1;;;;;37808:15:0;;37790:17;37808:15;;;:9;:15;;;;;;:22;;37824:6;;37808:22;:::i;:::-;-1:-1:-1;;;;;37868:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37673:228:0:o;37409:225::-;-1:-1:-1;;;;;37541:15:0;;37523:17;37541:15;;;:9;:15;;;;;;:22;;37557:6;;37541:22;:::i;37128:156::-;37218:7;37271:5;37257:10;37246:21;;37253:3;37246:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37245:31;;;;:::i;:::-;37238:38;37128:156;-1:-1:-1;;;;37128:156:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;733:597::-;845:4;874:2;903;892:9;885:21;935:6;929:13;978:6;973:2;962:9;958:18;951:34;1003:1;1013:140;1027:6;1024:1;1021:13;1013:140;;;1122:14;;;1118:23;;1112:30;1088:17;;;1107:2;1084:26;1077:66;1042:10;;1013:140;;;1171:6;1168:1;1165:13;1162:91;;;1241:1;1236:2;1227:6;1216:9;1212:22;1208:31;1201:42;1162:91;-1:-1:-1;1314:2:1;1293:15;-1:-1:-1;;1289:29:1;1274:45;;;;1321:2;1270:54;;733:597;-1:-1:-1;;;733:597:1:o;1335:315::-;1403:6;1411;1464:2;1452:9;1443:7;1439:23;1435:32;1432:52;;;1480:1;1477;1470:12;1432:52;1519:9;1506:23;1538:31;1563:5;1538:31;:::i;:::-;1588:5;1640:2;1625:18;;;;1612:32;;-1:-1:-1;;;1335:315:1:o;2030:456::-;2107:6;2115;2123;2176:2;2164:9;2155:7;2151:23;2147:32;2144:52;;;2192:1;2189;2182:12;2144:52;2231:9;2218:23;2250:31;2275:5;2250:31;:::i;:::-;2300:5;-1:-1:-1;2357:2:1;2342:18;;2329:32;2370:33;2329:32;2370:33;:::i;:::-;2030:456;;2422:7;;-1:-1:-1;;;2476:2:1;2461:18;;;;2448:32;;2030:456::o;3499:180::-;3558:6;3611:2;3599:9;3590:7;3586:23;3582:32;3579:52;;;3627:1;3624;3617:12;3579:52;-1:-1:-1;3650:23:1;;3499:180;-1:-1:-1;3499:180:1:o;3684:156::-;3750:20;;3810:4;3799:16;;3789:27;;3779:55;;3830:1;3827;3820:12;3845:535;3937:6;3945;3953;3961;3969;3977;4030:3;4018:9;4009:7;4005:23;4001:33;3998:53;;;4047:1;4044;4037:12;3998:53;4070:27;4087:9;4070:27;:::i;:::-;4060:37;;4116:36;4148:2;4137:9;4133:18;4116:36;:::i;:::-;4106:46;;4171:36;4203:2;4192:9;4188:18;4171:36;:::i;:::-;4161:46;;4226:36;4258:2;4247:9;4243:18;4226:36;:::i;:::-;4216:46;;4281:37;4313:3;4302:9;4298:19;4281:37;:::i;:::-;4271:47;;4337:37;4369:3;4358:9;4354:19;4337:37;:::i;:::-;4327:47;;3845:535;;;;;;;;:::o;4846:118::-;4932:5;4925:13;4918:21;4911:5;4908:32;4898:60;;4954:1;4951;4944:12;4969:241;5025:6;5078:2;5066:9;5057:7;5053:23;5049:32;5046:52;;;5094:1;5091;5084:12;5046:52;5133:9;5120:23;5152:28;5174:5;5152:28;:::i;5215:248::-;5283:6;5291;5344:2;5332:9;5323:7;5319:23;5315:32;5312:52;;;5360:1;5357;5350:12;5312:52;-1:-1:-1;;5383:23:1;;;5453:2;5438:18;;;5425:32;;-1:-1:-1;5215:248:1:o;5468:388::-;5536:6;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5652:9;5639:23;5671:31;5696:5;5671:31;:::i;:::-;5721:5;-1:-1:-1;5778:2:1;5763:18;;5750:32;5791:33;5750:32;5791:33;:::i;:::-;5843:7;5833:17;;;5468:388;;;;;:::o;5861:127::-;5922:10;5917:3;5913:20;5910:1;5903:31;5953:4;5950:1;5943:15;5977:4;5974:1;5967:15;5993:1121;6077:6;6108:2;6151;6139:9;6130:7;6126:23;6122:32;6119:52;;;6167:1;6164;6157:12;6119:52;6207:9;6194:23;6236:18;6277:2;6269:6;6266:14;6263:34;;;6293:1;6290;6283:12;6263:34;6331:6;6320:9;6316:22;6306:32;;6376:7;6369:4;6365:2;6361:13;6357:27;6347:55;;6398:1;6395;6388:12;6347:55;6434:2;6421:16;6456:2;6452;6449:10;6446:36;;;6462:18;;:::i;:::-;6508:2;6505:1;6501:10;6540:2;6534:9;6603:2;6599:7;6594:2;6590;6586:11;6582:25;6574:6;6570:38;6658:6;6646:10;6643:22;6638:2;6626:10;6623:18;6620:46;6617:72;;;6669:18;;:::i;:::-;6705:2;6698:22;6755:18;;;6789:15;;;;-1:-1:-1;6831:11:1;;;6827:20;;;6859:19;;;6856:39;;;6891:1;6888;6881:12;6856:39;6915:11;;;;6935:148;6951:6;6946:3;6943:15;6935:148;;;7017:23;7036:3;7017:23;:::i;:::-;7005:36;;6968:12;;;;7061;;;;6935:148;;;7102:6;5993:1121;-1:-1:-1;;;;;;;;5993:1121:1:o;7119:356::-;7321:2;7303:21;;;7340:18;;;7333:30;7399:34;7394:2;7379:18;;7372:62;7466:2;7451:18;;7119:356::o;7480:340::-;7682:2;7664:21;;;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7755:2:1;7740:18;;7733:46;7811:2;7796:18;;7480:340::o;7825:184::-;7895:6;7948:2;7936:9;7927:7;7923:23;7919:32;7916:52;;;7964:1;7961;7954:12;7916:52;-1:-1:-1;7987:16:1;;7825:184;-1:-1:-1;7825:184:1:o;8014:245::-;8081:6;8134:2;8122:9;8113:7;8109:23;8105:32;8102:52;;;8150:1;8147;8140:12;8102:52;8182:9;8176:16;8201:28;8223:5;8201:28;:::i;8264:127::-;8325:10;8320:3;8316:20;8313:1;8306:31;8356:4;8353:1;8346:15;8380:4;8377:1;8370:15;8396:168;8436:7;8502:1;8498;8494:6;8490:14;8487:1;8484:21;8479:1;8472:9;8465:17;8461:45;8458:71;;;8509:18;;:::i;:::-;-1:-1:-1;8549:9:1;;8396:168::o;8569:217::-;8609:1;8635;8625:132;;8679:10;8674:3;8670:20;8667:1;8660:31;8714:4;8711:1;8704:15;8742:4;8739:1;8732:15;8625:132;-1:-1:-1;8771:9:1;;8569:217::o;8791:591::-;-1:-1:-1;;;;;9134:15:1;;;9116:34;;9181:2;9166:18;;9159:34;;;;9224:2;9209:18;;9202:34;;;;9267:2;9252:18;;9245:34;;;;9316:15;;;9310:3;9295:19;;9288:44;9096:3;9348:19;;9341:35;;;;9065:3;9050:19;;8791:591::o;9387:125::-;9427:4;9455:1;9452;9449:8;9446:34;;;9460:18;;:::i;:::-;-1:-1:-1;9497:9:1;;9387:125::o;9517:128::-;9557:3;9588:1;9584:6;9581:1;9578:13;9575:39;;;9594:18;;:::i;:::-;-1:-1:-1;9630:9:1;;9517:128::o;9650:422::-;9739:1;9782:5;9739:1;9796:270;9817:7;9807:8;9804:21;9796:270;;;9876:4;9872:1;9868:6;9864:17;9858:4;9855:27;9852:53;;;9885:18;;:::i;:::-;9935:7;9925:8;9921:22;9918:55;;;9955:16;;;;9918:55;10034:22;;;;9994:15;;;;9796:270;;;9800:3;9650:422;;;;;:::o;10077:806::-;10126:5;10156:8;10146:80;;-1:-1:-1;10197:1:1;10211:5;;10146:80;10245:4;10235:76;;-1:-1:-1;10282:1:1;10296:5;;10235:76;10327:4;10345:1;10340:59;;;;10413:1;10408:130;;;;10320:218;;10340:59;10370:1;10361:10;;10384:5;;;10408:130;10445:3;10435:8;10432:17;10429:43;;;10452:18;;:::i;:::-;-1:-1:-1;;10508:1:1;10494:16;;10523:5;;10320:218;;10622:2;10612:8;10609:16;10603:3;10597:4;10594:13;10590:36;10584:2;10574:8;10571:16;10566:2;10560:4;10557:12;10553:35;10550:77;10547:159;;;-1:-1:-1;10659:19:1;;;10691:5;;10547:159;10738:34;10763:8;10757:4;10738:34;:::i;:::-;10808:6;10804:1;10800:6;10796:19;10787:7;10784:32;10781:58;;;10819:18;;:::i;:::-;10857:20;;10077:806;-1:-1:-1;;;10077:806:1:o;10888:140::-;10946:5;10975:47;11016:4;11006:8;11002:19;10996:4;10975:47;:::i;12351:351::-;12553:2;12535:21;;;12592:2;12572:18;;;12565:30;12631:29;12626:2;12611:18;;12604:57;12693:2;12678:18;;12351:351::o;12707:204::-;12745:3;12781:4;12778:1;12774:12;12813:4;12810:1;12806:12;12848:3;12842:4;12838:14;12833:3;12830:23;12827:49;;;12856:18;;:::i;:::-;12892:13;;12707:204;-1:-1:-1;;;12707:204:1:o;16594:127::-;16655:10;16650:3;16646:20;16643:1;16636:31;16686:4;16683:1;16676:15;16710:4;16707:1;16700:15;16726:135;16765:3;-1:-1:-1;;16786:17:1;;16783:43;;;16806:18;;:::i;:::-;-1:-1:-1;16853:1:1;16842:13;;16726:135::o;21932:251::-;22002:6;22055:2;22043:9;22034:7;22030:23;22026:32;22023:52;;;22071:1;22068;22061:12;22023:52;22103:9;22097:16;22122:31;22147:5;22122:31;:::i;22188:980::-;22450:4;22498:3;22487:9;22483:19;22529:6;22518:9;22511:25;22555:2;22593:6;22588:2;22577:9;22573:18;22566:34;22636:3;22631:2;22620:9;22616:18;22609:31;22660:6;22695;22689:13;22726:6;22718;22711:22;22764:3;22753:9;22749:19;22742:26;;22803:2;22795:6;22791:15;22777:29;;22824:1;22834:195;22848:6;22845:1;22842:13;22834:195;;;22913:13;;-1:-1:-1;;;;;22909:39:1;22897:52;;23004:15;;;;22969:12;;;;22945:1;22863:9;22834:195;;;-1:-1:-1;;;;;;;23085:32:1;;;;23080:2;23065:18;;23058:60;-1:-1:-1;;;23149:3:1;23134:19;23127:35;23046:3;22188:980;-1:-1:-1;;;22188:980:1:o;23173:306::-;23261:6;23269;23277;23330:2;23318:9;23309:7;23305:23;23301:32;23298:52;;;23346:1;23343;23336:12;23298:52;23375:9;23369:16;23359:26;;23425:2;23414:9;23410:18;23404:25;23394:35;;23469:2;23458:9;23454:18;23448:25;23438:35;;23173:306;;;;;:::o;23484:127::-;23545:10;23540:3;23536:20;23533:1;23526:31;23576:4;23573:1;23566:15;23600:4;23597:1;23590:15

Swarm Source

ipfs://d072f27c40104ac89042cde2d408d88d44e0f85e38deb5398eb851868dc7b5bc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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