Contract 0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe52a0b3e8cb68327e67aa91056d278c5c66851a6a14f2fc7fdc20b74f5e2b88fLock130534632021-10-08 18:54:0053 days 1 hr ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00056442
0x12c96eb42f15fc24f11b4810f52e4aa815627bb7f0babc48ae3fb0c181b43d8fTransfer130514142021-10-08 17:11:3353 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.0015696
0x0b51c05bd66f386854e9cf6f33394fad20cad90fda84ad1c1f5fb4a4e9285d65Transfer130513772021-10-08 17:09:4253 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.0015696
0x738a685ca385d1eae2546b7f1205f4aaee46bd7ff69c9eb808f3e3d3f163c063Transfer130513702021-10-08 17:09:2153 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.0018696
0x5be696006f21a415238cd93ee59ff9c81ff9f3b59d9452b54e4d5dea1ae53e49Set Max Tx Perce...130512792021-10-08 17:04:4853 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.0002872
0x5ab4f7d57cdcfda2a2a6d76cd9d09d898a24ae659e12ec4759f3c26e49ba5b16Enable All Fees130512432021-10-08 17:03:0053 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00050588
0x64f5f2383c88362b1c6c4814be2e9b0a62cdeebabd107e0025808ed7d794fac6Transfer From130512312021-10-08 17:02:2453 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00162565
0x8237177d067cc983469c1eeec39f8305623e22750042c40928e18f98ba47f1abTransfer From130512152021-10-08 17:01:3653 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00162637
0xf620cadcbc9b67328d2c02c21748606f43d132a9a96333f8a0c15f7080c759a7Transfer130511992021-10-08 17:00:4853 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00212262
0x3356688c67fd6a175fbadce3966c0feb00f59ca641eb02858ce7ac9300460b9aApprove130509672021-10-08 16:49:1253 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00044204
0xf1403d3e4e5dfbc26c52d279f64baa4f92f1299c6c82df7e46fd34077dd1e875Include In Rewar...130509512021-10-08 16:48:2453 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00026985
0x2f733f2cd5147d0f36f5d0118cfc208f2eb4abae432c742f62ae1f59e4591e2bInclude In Fee130509482021-10-08 16:48:1553 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.0001429
0x11a324407bf631d58c2455612cdddd1bf99a775fbee1bca93626aef5a807d529Set Num Tokens S...130509412021-10-08 16:47:5453 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00027987
0x675fc49720d79f4c0883d6cf6a3d8b60f9c5b6980b370b0d8b2869794368bc17Withdraw Locked ...130508732021-10-08 16:44:3053 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00022994
0x3d7c611218cb8daee6ee25de3b6ecdffa0bfdd9d4d05893850c24e48abdcfe41Set Marketing Wa...130508472021-10-08 16:43:1253 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00028548
0x47a0abda79151e61d42916fde0f3b9d127d6df6fad81c4d75e4697a13034052eStop Auto Burn130507972021-10-08 16:40:4253 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00014353
0x8033406160e637fd48b8b22f5c5e488b4f3412a28436b3b934425cebe9df0fc9Set Swap And Liq...130507942021-10-08 16:40:3353 days 3 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00029406
0xa9931af02d388aac7dcb7dea804761c44cc3fb2b59b1e5544a5f6b0535ec1c87Set Marketing Wa...130503002021-10-08 16:15:5153 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00028548
0x0ffd5baa1bd0552e43c6686aefbd04f3e6e511a0babf261ad6c4150627968f5eExclude From Rew...130502762021-10-08 16:14:3953 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00113915
0x87981e3057e10248e8edefcf8d3e5134e943b7dae477fcaf1232bb671b8e6dadExclude From Fee130502742021-10-08 16:14:3353 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00024366
0x8de6c4744117603ac0a71baffb58523b50d64160421a4bf78c86241cf253f4c0Enable All Fees130502642021-10-08 16:14:0353 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00189188
0xbacf0faca5365d0da1b6726c7f85e68e64983a316d2c517cfa0121e0aaa4e889Disable All Fees130502492021-10-08 16:13:1853 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d0 BNB0.00032448
0x781cc9ab624e2d66e8fe883eb533a25f9859710b8d3681e1314afc3e59e134580x60806040130500932021-10-08 16:05:3053 days 4 hrs ago0x17ae8871759a0a477c6018dc12048e7e702fad4f IN  Contract Creation0 BNB0.0509896
[ Download CSV Export 
Latest 3 internal transactions
Parent Txn Hash Block From To Value
0x781cc9ab624e2d66e8fe883eb533a25f9859710b8d3681e1314afc3e59e13458130500932021-10-08 16:05:3053 days 4 hrs ago 0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d 0x6725f303b657a9451d8ba641348b6761a6cc7a170 BNB
0x781cc9ab624e2d66e8fe883eb533a25f9859710b8d3681e1314afc3e59e13458130500932021-10-08 16:05:3053 days 4 hrs ago 0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x781cc9ab624e2d66e8fe883eb533a25f9859710b8d3681e1314afc3e59e13458130500932021-10-08 16:05:3053 days 4 hrs ago 0x8ceaf5801259c91380992ac0d7a6835a51f5cf9d 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurioToken

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-08
*/

// SPDX-License-Identifier: Unlicensed

pragma solidity 0.8.9;

/**
 * @dev Interface of the BEP20.
 */
interface IBEP20 {
    
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

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

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

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

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

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

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

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


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions, the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

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


/**
 * @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.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

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

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

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

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

    /**
     * @dev Returns the current time.
     */
        function getTime() public view returns (uint256) {
        return block.timestamp;
    }
    
    /**
     * @dev Returns the unlock time of the locked contract.
     */
    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

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

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


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


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

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

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

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

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

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

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

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

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

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


/**
 * @dev Implementation of the PancakeSwap interfaces.
 * PancakeSwap is a leading decentralized exchange on Binance Smart Chain.
 */
 
// pragma solidity >=0.5.0;

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

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

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

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

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

// pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

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

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

// pragma solidity >=0.6.2;

interface IPancakeswapV2Router02 is IPancakeswapV2Router01 {
    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 Implementation of the {IBEP20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism, see {BEP20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup, see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of BEP20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IBEP20-approve}.
 */
contract CurioToken is Context, IBEP20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    string private _name = "Curio";
    string private _symbol = "CURI";
    uint8 private _decimals = 18;

    /**
     * @dev Percentage of the static reflection fee.
     */    
    uint256 public _taxFee = 3;
    uint256 private _previousTaxFee = _taxFee;

    /**
     * @dev Percentage of the liquidity fee.
     */       
    uint256 public _liquidityFee = 1;
    uint256 private _previousLiquidityFee = _liquidityFee;

    /**
     * @dev Percentage of the auto burn fee.
     */   
    uint256 public _burnFee = 1;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;    
    uint256 private _previousBurnFee = _burnFee;

    /**
     * @dev Percentage of the marketing, development, and team fee.
     */   
    uint256 public _marketingFee = 1;
    address public marketingWallet = 0x4Cb6c7B3D5F82C21BFd9a6CAc3933Df70bBb36AB;
    uint256 private _previousMarketingFee = _marketingFee;

    /**
     * @dev The maximum transaction amount to minimize and break the impact of Whale actions.
     */   
    uint256 public _maxTxAmount = 1000000000 * 10**18;

    /**
     * @dev The amount of token sell to add to liquidity.
     */      
    uint256 private numTokensSellToAddToLiquidity = 1000000 * 10**18;
    
    IPancakeswapV2Router02 public pancakeswapV2Router;
    address public pancakeswapV2Pair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor() {
        _rOwned[owner()] = _rTotal;
        
        IPancakeswapV2Router02 _pancakeswapV2Router = IPancakeswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1);
         // Create a pancakeswap pair for this new token
        pancakeswapV2Pair = IPancakeswapV2Factory(_pancakeswapV2Router.factory())
            .createPair(address(this), _pancakeswapV2Router.WETH());

        // set the rest of the contract variables
        pancakeswapV2Router = _pancakeswapV2Router;
        
        //exclude owner, this contract and burn wallet from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[deadWallet] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external override view returns (address) {
        return owner();
    }
    
    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token decimals.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
    
    /**
     * @dev Returns the token symbol.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {BEP20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    /**
     * @dev See {BEP20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    /**
     * @dev See {BEP20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - The caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {BEP20-allowance}.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {BEP20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {BEP20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {BEP20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - The caller must have an allowance for `sender`'s tokens of at least
     * `amount`.
     */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance"));
    return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as mitigation for
     * problems described in {BEP20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as mitigation for
     * problems described in {BEP20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have an allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero"));
        return true;
    }
    
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

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

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

    function excludeFromReward(address account) external onlyOwner() {
        require(account != 0x10ED43C718714eb63d5aA57B78B54704E256024E, 'We can not exclude PancakeSwap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
     //to receive BNB from pancakeswapV2Router when swapping
    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function removeAllFee() private {
        _taxFee = 0;
        _liquidityFee = 0;
        _burnFee = 0;
        _marketingFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = 3;
        _liquidityFee = 1;
        _burnFee = 1;
        _marketingFee = 1;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: approve to the zero address");

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

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` / `from` cannot be the zero address.
     * - `recipient` / `to` cannot be the zero address.
     * - `sender` / `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from, // sender
        address to, // recipient
        uint256 amount
    ) private {
        require(from != address(0), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
      
         // @dev is the token balance of this contract address over the min number of
         // tokens that we need to initiate a swap + liquidity lock?
         // also, don't get caught in a circular liquidity event.
         // also, don't swap & liquify if sender is pancakswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != pancakeswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            // add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        // transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current BNB balance.
        // this is so that we can capture exactly the amount of BNB that the
        // swap creates and does not make the liquidity event include any BNB that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for BNB
        swapTokensForEth(half); // <- this breaks the BNB -> HATE swap when swap+liquify is triggered

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

        // add liquidity to pancakeswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the pancakeswap pair path of token -> wbnb
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pancakeswapV2Router.WETH();

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pancakeswapV2Router), tokenAmount);

        // add the liquidity
        pancakeswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }        
    
    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount) private {
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){
            removeAllFee();
        }
        else{
            require(amount <= _maxTxAmount, "BEP20: transfer amount exceeds the maxTxAmount.");
        }
        
        //Calculate burn amount and marketing amount
        uint256 burnAmt = amount.mul(_burnFee).div(100);
        uint256 marketingAmt = amount.mul(_marketingFee).div(100);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, (amount.sub(burnAmt).sub(marketingAmt)));
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, (amount.sub(burnAmt).sub(marketingAmt)));
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, (amount.sub(burnAmt).sub(marketingAmt)));
        } else {
            _transferStandard(sender, recipient, (amount.sub(burnAmt).sub(marketingAmt)));
        }
        
        //Temporarily remove fees to transfer to burn address and marketing wallet
        _taxFee = 0;
        _liquidityFee = 0;

        //Send transfers to dead wallt and marketing wallet
        _transferStandard(sender, deadWallet, burnAmt);
        _transferStandard(sender, marketingWallet, marketingAmt);

        //Restore tax and liquidity fees
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;


        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient])
            restoreAllFee();
    }
    
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
     * @dev The owner can withdraw BNB collected in the contract from `swapAndLiquify`
     * or if someone sends BNB directly to the contract.
     * 
     * The swapAndLiquify function converts half of the contractTokenBalance SafeMoon tokens to BNB. 
     * For every swapAndLiquify function call, a small amount of BNB remains in the contract. 
     * This amount grows over time with the swapAndLiquify function being called throughout the life 
     * of the contract.  
     */
    function withdrawLockedETH(address payable recipient, uint256 amount) external onlyOwner() {
        require(amount <= address(this).balance, "BEP20: amount should not exceed the contract balance");
        recipient.transfer(amount);
    }
    
    /**
     * @dev The owner can exclude specific accounts from Fees.
     */    
    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }
 
     /**
     * @dev The owner can include specific accounts from Fees.
     */       
    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }    

    /**
     * @dev Call this function to disable all Fees during the Presale stage.
     */
    function disableAllFees() external onlyOwner() {
        _taxFee = 0;
        _previousTaxFee = 0;
        _liquidityFee = 0;
        _previousLiquidityFee = 0;
        _burnFee = 0;
        _previousBurnFee = _burnFee;
        _marketingFee = 0;
        _previousMarketingFee = 0;
        inSwapAndLiquify = false;
        emit SwapAndLiquifyEnabledUpdated(false);
    }

    /**
     * @dev Call this function to enable Fees after finalizing the Presale.
     */
    function enableAllFees() external onlyOwner() {
        _taxFee = 3;
        _previousTaxFee = _taxFee;
        _liquidityFee = 1;
        _previousLiquidityFee = _liquidityFee;
        _burnFee = 1;
        _previousBurnFee = _taxFee;
        _marketingFee = 1;
        _previousMarketingFee = _marketingFee;
        inSwapAndLiquify = true;
        emit SwapAndLiquifyEnabledUpdated(true);
    }

    /**
     * @dev Call this function to change burnFee to zero percent upon a certain amount of token is burned.
     */
    function stopAutoBurn() external onlyOwner() {
        _burnFee = 0;
        _previousBurnFee = _taxFee;
    }
    
    /**
     * @dev Update the Router address if Pancakeswap upgrades to a newer version.
     */
    function setRouterAddress(address newRouter) external onlyOwner {
        IPancakeswapV2Router02 _newPancakeRouter = IPancakeswapV2Router02(newRouter);
        pancakeswapV2Pair = IPancakeswapV2Factory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH());
        pancakeswapV2Router = _newPancakeRouter;
    }    

    /**
     * @dev Update the amount of 'numTokensSellToAddToLiquidity'.
     */
    function SetNumTokensSellToAddToLiquidity(uint256 newAmount, uint256 decimal) external onlyOwner() {
        numTokensSellToAddToLiquidity = newAmount*10**decimal;
    }
    
    /**
     * @dev Call this function if required to set a different Marketing wallet address.
     */
    function setMarketingWallet(address newWallet) external onlyOwner() {
        marketingWallet = newWallet;
    }
    
    /**
     * @dev Call this function if required to change the Max transaction percentage.
     */   
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }
    
    /**
     * @dev Call this function to enable Swap and Liquify.
     */  
    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"},{"internalType":"uint256","name":"decimal","type":"uint256"}],"name":"SetNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapV2Router","outputs":[{"internalType":"contract IPancakeswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLockedETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526c0c9f2c9cd04674edea4000000060098190556200002590600019620004f2565b620000339060001962000515565b600a5560408051808201909152600580825264437572696f60d81b60209092019182526200006491600c916200044c565b50604080518082019091526004808252634355524960e01b60209092019182526200009291600d916200044c565b50600e805460ff191660129081179091556003600f81905560105560016011819055908190556013819055601480546001600160a01b031990811661dead179091556015829055601682905560178054909116734cb6c7b3d5f82c21bfd9a6cac3933df70bbb36ab1790556018556b033b2e3c9fd0803ce800000060195569d3c21bcecceda1000000601a55601c805460ff60a81b191690553480156200013857600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a5460036000620001946000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600073d99d1c33f9fc3444f8101754abc46c52416550d19050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200020b57600080fd5b505afa15801562000220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024691906200053b565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028f57600080fd5b505afa158015620002a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ca91906200053b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200031357600080fd5b505af115801562000328573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034e91906200053b565b601c80546001600160a01b03199081166001600160a01b0393841617909155601b8054909116918316919091179055600160066000620003966000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526006909352818320805485166001908117909155601454909116835291208054909216179055620003f53390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009546040516200043d91815260200190565b60405180910390a350620005aa565b8280546200045a906200056d565b90600052602060002090601f0160209004810192826200047e5760008555620004c9565b82601f106200049957805160ff1916838001178555620004c9565b82800160010185558215620004c9579182015b82811115620004c9578251825591602001919060010190620004ac565b50620004d7929150620004db565b5090565b5b80821115620004d75760008155600101620004dc565b6000826200051057634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200053657634e487b7160e01b600052601160045260246000fd5b500390565b6000602082840312156200054e57600080fd5b81516001600160a01b03811681146200056657600080fd5b9392505050565b600181811c908216806200058257607f821691505b60208210811415620005a457634e487b7160e01b600052602260045260246000fd5b50919050565b612e7880620005ba6000396000f3fe6080604052600436106102975760003560e01c806370a082311161015a578063a51c3695116100c1578063dd4670641161007a578063dd4670641461079e578063dd62ed3e146107be578063e5dffed314610804578063ea2f0b3714610824578063f2fde38b14610844578063ffc786351461086457600080fd5b8063a51c3695146106fe578063a69df4b514610713578063a9059cbb14610728578063c0b0fda214610748578063c49b9a801461075e578063d543dbeb1461077e57600080fd5b806385141a771161011357806385141a771461065257806388f8202014610672578063893d20e8146106ab5780638da5cb5b146106ab57806395d89b41146106c9578063a457c2d7146106de57600080fd5b806370a08231146105b2578063715018a6146105d2578063741af87f146105e757806374886f94146105fc57806375f0a8741461061c5780637d1db4a51461063c57600080fd5b8063408e6fb8116101fe57806352892884116101b757806352892884146104e35780635342acb41461051b578063557ed1ba146105545780635d098b3814610567578063602bc62b146105875780636bc87c3a1461059c57600080fd5b8063408e6fb81461042257806341cb87fc14610442578063437823ec146104625780634549b039146104825780634a74bb02146104a257806352390c02146104c357600080fd5b80632d838119116102505780632d83811914610368578063313ce567146103885780633685d419146103aa57806339509351146103cc5780633b124fe7146103ec5780633bd5d1731461040257600080fd5b806306fdde03146102a3578063095ea7b3146102ce57806313114a9d146102fe57806318160ddd1461031d57806322976e0d1461033257806323b872dd1461034857600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610879565b6040516102c59190612925565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612992565b61090b565b60405190151581526020016102c5565b34801561030a57600080fd5b50600b545b6040519081526020016102c5565b34801561032957600080fd5b5060095461030f565b34801561033e57600080fd5b5061030f60165481565b34801561035457600080fd5b506102ee6103633660046129be565b610922565b34801561037457600080fd5b5061030f6103833660046129ff565b61098b565b34801561039457600080fd5b50600e5460405160ff90911681526020016102c5565b3480156103b657600080fd5b506103ca6103c5366004612a18565b610a14565b005b3480156103d857600080fd5b506102ee6103e7366004612992565b610bcb565b3480156103f857600080fd5b5061030f600f5481565b34801561040e57600080fd5b506103ca61041d3660046129ff565b610c01565b34801561042e57600080fd5b506103ca61043d366004612992565b610ceb565b34801561044e57600080fd5b506103ca61045d366004612a18565b610dbd565b34801561046e57600080fd5b506103ca61047d366004612a18565b610f8f565b34801561048e57600080fd5b5061030f61049d366004612a4a565b610fdd565b3480156104ae57600080fd5b50601c546102ee90600160a81b900460ff1681565b3480156104cf57600080fd5b506103ca6104de366004612a18565b61106a565b3480156104ef57600080fd5b50601c54610503906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b34801561052757600080fd5b506102ee610536366004612a18565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561056057600080fd5b504261030f565b34801561057357600080fd5b506103ca610582366004612a18565b611239565b34801561059357600080fd5b5060025461030f565b3480156105a857600080fd5b5061030f60115481565b3480156105be57600080fd5b5061030f6105cd366004612a18565b611285565b3480156105de57600080fd5b506103ca6112e4565b3480156105f357600080fd5b506103ca611346565b34801561060857600080fd5b506103ca610617366004612a76565b6113dd565b34801561062857600080fd5b50601754610503906001600160a01b031681565b34801561064857600080fd5b5061030f60195481565b34801561065e57600080fd5b50601454610503906001600160a01b031681565b34801561067e57600080fd5b506102ee61068d366004612a18565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156106b757600080fd5b506000546001600160a01b0316610503565b3480156106d557600080fd5b506102b8611423565b3480156106ea57600080fd5b506102ee6106f9366004612992565b611432565b34801561070a57600080fd5b506103ca611481565b34801561071f57600080fd5b506103ca6114b8565b34801561073457600080fd5b506102ee610743366004612992565b6115d3565b34801561075457600080fd5b5061030f60135481565b34801561076a57600080fd5b506103ca610779366004612a98565b6115e0565b34801561078a57600080fd5b506103ca6107993660046129ff565b611662565b3480156107aa57600080fd5b506103ca6107b93660046129ff565b6116b2565b3480156107ca57600080fd5b5061030f6107d9366004612ab3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081057600080fd5b50601b54610503906001600160a01b031681565b34801561083057600080fd5b506103ca61083f366004612a18565b611737565b34801561085057600080fd5b506103ca61085f366004612a18565b611782565b34801561087057600080fd5b506103ca61185a565b6060600c805461088890612aec565b80601f01602080910402602001604051908101604052809291908181526020018280546108b490612aec565b80156109015780601f106108d657610100808354040283529160200191610901565b820191906000526020600020905b8154815290600101906020018083116108e457829003601f168201915b5050505050905090565b60006109183384846118f4565b5060015b92915050565b600061092f848484611a18565b610981843361097c85604051806060016040528060288152602001612dd6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190611bc0565b6118f4565b5060019392505050565b6000600a548211156109f75760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a01611bfa565b9050610a0d8382611c1d565b9392505050565b6000546001600160a01b03163314610a3e5760405162461bcd60e51b81526004016109ee90612b27565b6001600160a01b03811660009081526007602052604090205460ff16610aa65760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016109ee565b60005b600854811015610bc757816001600160a01b031660088281548110610ad057610ad0612b5c565b6000918252602090912001546001600160a01b03161415610bb55760088054610afb90600190612b88565b81548110610b0b57610b0b612b5c565b600091825260209091200154600880546001600160a01b039092169183908110610b3757610b37612b5c565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610b8f57610b8f612b9f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610bbf81612bb5565b915050610aa9565b5050565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161091891859061097c9086611c5f565b3360008181526007602052604090205460ff1615610c765760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016109ee565b6000610c8183611cbe565b505050506001600160a01b038416600090815260036020526040902054919250610cad91905082611d0d565b6001600160a01b038316600090815260036020526040902055600a54610cd39082611d0d565b600a55600b54610ce39084611c5f565b600b55505050565b6000546001600160a01b03163314610d155760405162461bcd60e51b81526004016109ee90612b27565b47811115610d825760405162461bcd60e51b815260206004820152603460248201527f42455032303a20616d6f756e742073686f756c64206e6f74206578636565642060448201527374686520636f6e74726163742062616c616e636560601b60648201526084016109ee565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610db8573d6000803e3d6000fd5b505050565b6000546001600160a01b03163314610de75760405162461bcd60e51b81526004016109ee90612b27565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2557600080fd5b505afa158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d9190612bd0565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610ea557600080fd5b505afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190612bd0565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190612bd0565b601c80546001600160a01b039283166001600160a01b031991821617909155601b805493909216921691909117905550565b6000546001600160a01b03163314610fb95760405162461bcd60e51b81526004016109ee90612b27565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60006009548311156110315760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016109ee565b8161105057600061104184611cbe565b5093955061091c945050505050565b600061105b84611cbe565b5092955061091c945050505050565b6000546001600160a01b031633146110945760405162461bcd60e51b81526004016109ee90612b27565b7310ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b03821614156111105760405162461bcd60e51b815260206004820152602660248201527f57652063616e206e6f74206578636c7564652050616e63616b6553776170207260448201526537baba32b91760d11b60648201526084016109ee565b6001600160a01b03811660009081526007602052604090205460ff16156111795760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109ee565b6001600160a01b038116600090815260036020526040902054156111d3576001600160a01b0381166000908152600360205260409020546111b99061098b565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b031633146112635760405162461bcd60e51b81526004016109ee90612b27565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff16156112c257506001600160a01b031660009081526004602052604090205490565b6001600160a01b03821660009081526003602052604090205461091c9061098b565b6000546001600160a01b0316331461130e5760405162461bcd60e51b81526004016109ee90612b27565b600080546040516001600160a01b0390911690600080516020612dfe833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113705760405162461bcd60e51b81526004016109ee90612b27565b6000600f8190556010819055601181905560128190556013819055601581905560168190556018819055601c805460ff60a01b191690556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020015b60405180910390a1565b6000546001600160a01b031633146114075760405162461bcd60e51b81526004016109ee90612b27565b61141281600a612cd1565b61141c9083612cdd565b601a555050565b6060600d805461088890612aec565b6000610918338461097c85604051806060016040528060258152602001612e1e602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190611bc0565b6000546001600160a01b031633146114ab5760405162461bcd60e51b81526004016109ee90612b27565b6000601355600f54601555565b6001546001600160a01b0316331461151e5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016109ee565b60025442116115845760405162461bcd60e51b815260206004820152602c60248201527f54686520636f6e7472616374206973206c6f636b656420666f7220612073706560448201526b18da599a58c81c195c9a5bd960a21b60648201526084016109ee565b600154600080546040516001600160a01b039384169390911691600080516020612dfe83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610918338484611a18565b6000546001600160a01b0316331461160a5760405162461bcd60e51b81526004016109ee90612b27565b601c8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061165790831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461168c5760405162461bcd60e51b81526004016109ee90612b27565b6116ac60646116a683600954611d4f90919063ffffffff16565b90611c1d565b60195550565b6000546001600160a01b031633146116dc5760405162461bcd60e51b81526004016109ee90612b27565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561170b8142612cfc565b600255600080546040516001600160a01b0390911690600080516020612dfe833981519152908390a350565b6000546001600160a01b031633146117615760405162461bcd60e51b81526004016109ee90612b27565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146117ac5760405162461bcd60e51b81526004016109ee90612b27565b6001600160a01b0381166118115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ee565b600080546040516001600160a01b0380851693921691600080516020612dfe83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118845760405162461bcd60e51b81526004016109ee90612b27565b6003600f8190556010819055600160118190556012819055601381905560159190915560168190556018819055601c805460ff60a01b1916600160a01b1790556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906020016113d3565b6001600160a01b0383166119565760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109ee565b6001600160a01b0382166119b75760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109ee565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a7c5760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109ee565b6001600160a01b038216611ade5760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109ee565b60008111611b405760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109ee565b6000611b4b30611285565b601a5490915081108015908190611b6c5750601c54600160a01b900460ff16155b8015611b865750601c546001600160a01b03868116911614155b8015611b9b5750601c54600160a81b900460ff165b15611bae57601a549150611bae82611dce565b611bb9858585611e75565b5050505050565b60008184841115611be45760405162461bcd60e51b81526004016109ee9190612925565b506000611bf18486612b88565b95945050505050565b6000806000611c0761215d565b9092509050611c168282611c1d565b9250505090565b6000610a0d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122df565b600080611c6c8385612cfc565b905083811015610a0d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109ee565b6000806000806000806000806000611cd58a61230d565b9250925092506000806000611cf38d8686611cee611bfa565b612349565b919f909e50909c50959a5093985091965092945050505050565b6000610a0d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bc0565b600082611d5e5750600061091c565b6000611d6a8385612cdd565b905082611d778583612d14565b14610a0d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109ee565b601c805460ff60a01b1916600160a01b1790556000611dee826002611c1d565b90506000611dfc8383611d0d565b905047611e0883612399565b6000611e144783611d0d565b9050611e208382612502565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601c805460ff60a01b19169055505050565b6001600160a01b03831660009081526006602052604090205460ff1680611eb457506001600160a01b03821660009081526006602052604090205460ff165b15611ed757611ed26000600f81905560118190556013819055601655565b611f41565b601954811115611f415760405162461bcd60e51b815260206004820152602f60248201527f42455032303a207472616e7366657220616d6f756e742065786365656473207460448201526e34329036b0bc2a3c20b6b7bab73a1760891b60648201526084016109ee565b6000611f5d60646116a660135485611d4f90919063ffffffff16565b90506000611f7b60646116a660165486611d4f90919063ffffffff16565b6001600160a01b03861660009081526007602052604090205490915060ff168015611fbf57506001600160a01b03841660009081526007602052604090205460ff16155b15611fe757611fe28585611fdd84611fd78888611d0d565b90611d0d565b6125bb565b6120ba565b6001600160a01b03851660009081526007602052604090205460ff1615801561202857506001600160a01b03841660009081526007602052604090205460ff165b1561204557611fe2858561204084611fd78888611d0d565b6126e1565b6001600160a01b03851660009081526007602052604090205460ff16801561208557506001600160a01b03841660009081526007602052604090205460ff165b156120a257611fe2858561209d84611fd78888611d0d565b61278a565b6120ba85856120b584611fd78888611d0d565b6127fd565b6000600f8190556011556014546120dc9086906001600160a01b0316846127fd565b6017546120f49086906001600160a01b0316836127fd565b601054600f556012546011556001600160a01b03851660009081526006602052604090205460ff168061213f57506001600160a01b03841660009081526006602052604090205460ff165b15611bb957611bb96003600f55600160118190556013819055601655565b600a546009546000918291825b6008548110156122af5782600360006008848154811061218c5761218c612b5c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121f757508160046000600884815481106121d0576121d0612b5c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561220d57600a54600954945094505050509091565b612253600360006008848154811061222757612227612b5c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d0d565b925061229b600460006008848154811061226f5761226f612b5c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d0d565b9150806122a781612bb5565b91505061216a565b50600954600a546122bf91611c1d565b8210156122d657600a546009549350935050509091565b90939092509050565b600081836123005760405162461bcd60e51b81526004016109ee9190612925565b506000611bf18486612d14565b60008060008061231c85612841565b905060006123298661285d565b9050600061233b82611fd78986611d0d565b979296509094509092505050565b60008080806123588886611d4f565b905060006123668887611d4f565b905060006123748888611d4f565b9050600061238682611fd78686611d0d565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123ce576123ce612b5c565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561242257600080fd5b505afa158015612436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245a9190612bd0565b8160018151811061246d5761246d612b5c565b6001600160a01b039283166020918202929092010152601b5461249391309116846118f4565b601b5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124cc908590600090869030904290600401612d36565b600060405180830381600087803b1580156124e657600080fd5b505af11580156124fa573d6000803e3d6000fd5b505050505050565b601b5461251a9030906001600160a01b0316846118f4565b601b5460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561258257600080fd5b505af1158015612596573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bb99190612da7565b6000806000806000806125cd87611cbe565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506125ff9088611d0d565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461262e9087611d0d565b6001600160a01b03808b1660009081526003602052604080822093909355908a168152205461265d9086611c5f565b6001600160a01b03891660009081526003602052604090205561267f81612879565b6126898483612901565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516126ce91815260200190565b60405180910390a3505050505050505050565b6000806000806000806126f387611cbe565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506127259087611d0d565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461275b9084611c5f565b6001600160a01b03891660009081526004602090815260408083209390935560039052205461265d9086611c5f565b60008060008060008061279c87611cbe565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506127ce9088611d0d565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546127259087611d0d565b60008060008060008061280f87611cbe565b6001600160a01b038f16600090815260036020526040902054959b5093995091975095509350915061262e9087611d0d565b600061091c60646116a6600f5485611d4f90919063ffffffff16565b600061091c60646116a660115485611d4f90919063ffffffff16565b6000612883611bfa565b905060006128918383611d4f565b306000908152600360205260409020549091506128ae9082611c5f565b3060009081526003602090815260408083209390935560079052205460ff1615610db857306000908152600460205260409020546128ec9084611c5f565b30600090815260046020526040902055505050565b600a5461290e9083611d0d565b600a55600b5461291e9082611c5f565b600b555050565b600060208083528351808285015260005b8181101561295257858101830151858201604001528201612936565b81811115612964576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461298f57600080fd5b50565b600080604083850312156129a557600080fd5b82356129b08161297a565b946020939093013593505050565b6000806000606084860312156129d357600080fd5b83356129de8161297a565b925060208401356129ee8161297a565b929592945050506040919091013590565b600060208284031215612a1157600080fd5b5035919050565b600060208284031215612a2a57600080fd5b8135610a0d8161297a565b80358015158114612a4557600080fd5b919050565b60008060408385031215612a5d57600080fd5b82359150612a6d60208401612a35565b90509250929050565b60008060408385031215612a8957600080fd5b50508035926020909101359150565b600060208284031215612aaa57600080fd5b610a0d82612a35565b60008060408385031215612ac657600080fd5b8235612ad18161297a565b91506020830135612ae18161297a565b809150509250929050565b600181811c90821680612b0057607f821691505b60208210811415612b2157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612b9a57612b9a612b72565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415612bc957612bc9612b72565b5060010190565b600060208284031215612be257600080fd5b8151610a0d8161297a565b600181815b80851115612c28578160001904821115612c0e57612c0e612b72565b80851615612c1b57918102915b93841c9390800290612bf2565b509250929050565b600082612c3f5750600161091c565b81612c4c5750600061091c565b8160018114612c625760028114612c6c57612c88565b600191505061091c565b60ff841115612c7d57612c7d612b72565b50506001821b61091c565b5060208310610133831016604e8410600b8410161715612cab575081810a61091c565b612cb58383612bed565b8060001904821115612cc957612cc9612b72565b029392505050565b6000610a0d8383612c30565b6000816000190483118215151615612cf757612cf7612b72565b500290565b60008219821115612d0f57612d0f612b72565b500190565b600082612d3157634e487b7160e01b600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d865784516001600160a01b031683529383019391830191600101612d61565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612dbc57600080fd5b835192506020840151915060408401519050925092509256fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e042455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122029924f4099a532af8c0b5f6b2ad5408349527da63c0ca7d10b447fd19956980864736f6c63430008090033

Deployed ByteCode Sourcemap

28350:26093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32205:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33743:161;;;;;;;;;;-1:-1:-1;33743:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;33743:161:0;1072:187:1;36206:87:0;;;;;;;;;;-1:-1:-1;36275:10:0;;36206:87;;;1410:25:1;;;1398:2;1383:18;36206:87:0;1264:177:1;32658:95:0;;;;;;;;;;-1:-1:-1;32738:7:0;;32658:95;;30091:32;;;;;;;;;;;;;;;;34376:294;;;;;;;;;;-1:-1:-1;34376:294:0;;;;;:::i;:::-;;:::i;37130:253::-;;;;;;;;;;-1:-1:-1;37130:253:0;;;;;:::i;:::-;;:::i;32355:83::-;;;;;;;;;;-1:-1:-1;32421:9:0;;32355:83;;32421:9;;;;2234:36:1;;2222:2;2207:18;32355:83:0;2092:184:1;37849:475:0;;;;;;;;;;-1:-1:-1;37849:475:0;;;;;:::i;:::-;;:::i;:::-;;35076:218;;;;;;;;;;-1:-1:-1;35076:218:0;;;;;:::i;:::-;;:::i;29512:26::-;;;;;;;;;;;;;;;;36301:377;;;;;;;;;;-1:-1:-1;36301:377:0;;;;;:::i;:::-;;:::i;51025:243::-;;;;;;;;;;-1:-1:-1;51025:243:0;;;;;:::i;:::-;;:::i;53051:342::-;;;;;;;;;;-1:-1:-1;53051:342:0;;;;;:::i;:::-;;:::i;51366:113::-;;;;;;;;;;-1:-1:-1;51366:113:0;;;;;:::i;:::-;;:::i;36686:436::-;;;;;;;;;;-1:-1:-1;36686:436:0;;;;;:::i;:::-;;:::i;30737:41::-;;;;;;;;;;-1:-1:-1;30737:41:0;;;;-1:-1:-1;;;30737:41:0;;;;;;37391:450;;;;;;;;;;-1:-1:-1;37391:450:0;;;;;:::i;:::-;;:::i;30664:32::-;;;;;;;;;;-1:-1:-1;30664:32:0;;;;-1:-1:-1;;;;;30664:32:0;;;;;;-1:-1:-1;;;;;3443:32:1;;;3425:51;;3413:2;3398:18;30664:32:0;3279:203:1;42200:123:0;;;;;;;;;;-1:-1:-1;42200:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;42288:27:0;42264:4;42288:27;;;:18;:27;;;;;;;;;42200:123;6395:90;;;;;;;;;;-1:-1:-1;6462:15:0;6395:90;;53780:114;;;;;;;;;;-1:-1:-1;53780:114:0;;;;;:::i;:::-;;:::i;6576:90::-;;;;;;;;;;-1:-1:-1;6649:9:0;;6576:90;;29666:32;;;;;;;;;;;;;;;;32815:198;;;;;;;;;;-1:-1:-1;32815:198:0;;;;;:::i;:::-;;:::i;5779:148::-;;;;;;;;;;;;;:::i;51798:382::-;;;;;;;;;;;;;:::i;53490:171::-;;;;;;;;;;-1:-1:-1;53490:171:0;;;;;:::i;:::-;;:::i;30130:75::-;;;;;;;;;;-1:-1:-1;30130:75:0;;;;-1:-1:-1;;;;;30130:75:0;;;30390:49;;;;;;;;;;;;;;;;29868:70;;;;;;;;;;-1:-1:-1;29868:70:0;;;;-1:-1:-1;;;;;29868:70:0;;;36078:120;;;;;;;;;;-1:-1:-1;36078:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;36170:20:0;36146:4;36170:20;;;:11;:20;;;;;;;;;36078:120;32037:94;;;;;;;;;;-1:-1:-1;32089:7:0;5195:6;-1:-1:-1;;;;;5195:6:0;32037:94;;32507:87;;;;;;;;;;;;;:::i;35797:269::-;;;;;;;;;;-1:-1:-1;35797:269:0;;;;;:::i;:::-;;:::i;52825:113::-;;;;;;;;;;;;;:::i;7103:318::-;;;;;;;;;;;;;:::i;33225:167::-;;;;;;;;;;-1:-1:-1;33225:167:0;;;;;:::i;:::-;;:::i;29834:27::-;;;;;;;;;;;;;;;;54267:173;;;;;;;;;;-1:-1:-1;54267:173:0;;;;;:::i;:::-;;:::i;54013:162::-;;;;;;;;;;-1:-1:-1;54013:162:0;;;;;:::i;:::-;;:::i;6771:226::-;;;;;;;;;;-1:-1:-1;6771:226:0;;;;;:::i;:::-;;:::i;33454:143::-;;;;;;;;;;-1:-1:-1;33454:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;33562:18:0;;;33535:7;33562:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;33454:143;30608:49;;;;;;;;;;-1:-1:-1;30608:49:0;;;;-1:-1:-1;;;;;30608:49:0;;;51578:112;;;;;;;;;;-1:-1:-1;51578:112:0;;;;;:::i;:::-;;:::i;6082:244::-;;;;;;;;;;-1:-1:-1;6082:244:0;;;;;:::i;:::-;;:::i;52283:408::-;;;;;;;;;;;;;:::i;32205:83::-;32242:13;32275:5;32268:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32205:83;:::o;33743:161::-;33818:4;33835:39;3792:10;33858:7;33867:6;33835:8;:39::i;:::-;-1:-1:-1;33892:4:0;33743:161;;;;;:::o;34376:294::-;34467:4;34480:36;34490:6;34498:9;34509:6;34480:9;:36::i;:::-;34523:121;34532:6;3792:10;34554:89;34592:6;34554:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34554:19:0;;;;;;:11;:19;;;;;;;;3792:10;34554:33;;;;;;;;;;:37;:89::i;:::-;34523:8;:121::i;:::-;-1:-1:-1;34658:4:0;34376:294;;;;;:::o;37130:253::-;37196:7;37235;;37224;:18;;37216:73;;;;-1:-1:-1;;;37216:73:0;;5144:2:1;37216:73:0;;;5126:21:1;5183:2;5163:18;;;5156:30;5222:34;5202:18;;;5195:62;-1:-1:-1;;;5273:18:1;;;5266:40;5323:19;;37216:73:0;;;;;;;;;37300:19;37323:10;:8;:10::i;:::-;37300:33;-1:-1:-1;37351:24:0;:7;37300:33;37351:11;:24::i;:::-;37344:31;37130:253;-1:-1:-1;;;37130:253:0:o;37849:475::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37931:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37923:56;;;::::0;-1:-1:-1;;;37923:56:0;;5916:2:1;37923:56:0::1;::::0;::::1;5898:21:1::0;5955:2;5935:18;;;5928:30;5994:25;5974:18;;;5967:53;6037:18;;37923:56:0::1;5714:347:1::0;37923:56:0::1;37995:9;37990:327;38014:9;:16:::0;38010:20;::::1;37990:327;;;38072:7;-1:-1:-1::0;;;;;38056:23:0::1;:9;38066:1;38056:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38056:12:0::1;:23;38052:254;;;38115:9;38125:16:::0;;:20:::1;::::0;38144:1:::1;::::0;38125:20:::1;:::i;:::-;38115:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;38100:9:::1;:12:::0;;-1:-1:-1;;;;;38115:31:0;;::::1;::::0;38110:1;;38100:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;38100:46:0::1;-1:-1:-1::0;;;;;38100:46:0;;::::1;;::::0;;38165:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;38204:11:::1;:20:::0;;;;:28;;-1:-1:-1;;38204:28:0::1;::::0;;38251:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;38251:15:0;;;;;-1:-1:-1;;;;;;38251:15:0::1;::::0;;;;;37990:327:::1;37849:475:::0;:::o;38052:254::-:1;38032:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37990:327;;;;37849:475:::0;:::o;35076:218::-;3792:10;35164:4;35213:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;35213:34:0;;;;;;;;;;35164:4;;35181:83;;35204:7;;35213:50;;35252:10;35213:38;:50::i;36301:377::-;3792:10;36353:14;36402:19;;;:11;:19;;;;;;;;36401:20;36393:77;;;;-1:-1:-1;;;36393:77:0;;6934:2:1;36393:77:0;;;6916:21:1;6973:2;6953:18;;;6946:30;7012:34;6992:18;;;6985:62;-1:-1:-1;;;7063:18:1;;;7056:42;7115:19;;36393:77:0;6732:408:1;36393:77:0;36482:15;36506:19;36517:7;36506:10;:19::i;:::-;-1:-1:-1;;;;;;;;;36554:15:0;;;;;;:7;:15;;;;;;36481:44;;-1:-1:-1;36554:28:0;;:15;-1:-1:-1;36481:44:0;36554:19;:28::i;:::-;-1:-1:-1;;;;;36536:15:0;;;;;;:7;:15;;;;;:46;36603:7;;:20;;36615:7;36603:11;:20::i;:::-;36593:7;:30;36647:10;;:23;;36662:7;36647:14;:23::i;:::-;36634:10;:36;-1:-1:-1;;;36301:377:0:o;51025:243::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;51145:21:::1;51135:6;:31;;51127:96;;;::::0;-1:-1:-1;;;51127:96:0;;7347:2:1;51127:96:0::1;::::0;::::1;7329:21:1::0;7386:2;7366:18;;;7359:30;7425:34;7405:18;;;7398:62;-1:-1:-1;;;7476:18:1;;;7469:50;7536:19;;51127:96:0::1;7145:416:1::0;51127:96:0::1;51234:26;::::0;-1:-1:-1;;;;;51234:18:0;::::1;::::0;:26;::::1;;;::::0;51253:6;;51234:26:::1;::::0;;;51253:6;51234:18;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51025:243:::0;;:::o;53051:342::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;53126:40:::1;53192:9;53126:76;;53255:17;-1:-1:-1::0;;;;;53255:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53233:61:0::1;;53303:4;53310:17;-1:-1:-1::0;;;;;53310:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53233:102;::::0;-1:-1:-1;;;;;;53233:102:0::1;::::0;;;;;;-1:-1:-1;;;;;8052:15:1;;;53233:102:0::1;::::0;::::1;8034:34:1::0;8104:15;;8084:18;;;8077:43;7969:18;;53233:102:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53213:17;:122:::0;;-1:-1:-1;;;;;53213:122:0;;::::1;-1:-1:-1::0;;;;;;53213:122:0;;::::1;;::::0;;;53346:19:::1;:39:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;53051:342:0:o;51366:113::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51437:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;51437:34:0::1;51467:4;51437:34;::::0;;51366:113::o;36686:436::-;36776:7;36815;;36804;:18;;36796:62;;;;-1:-1:-1;;;36796:62:0;;8333:2:1;36796:62:0;;;8315:21:1;8372:2;8352:18;;;8345:30;8411:33;8391:18;;;8384:61;8462:18;;36796:62:0;8131:355:1;36796:62:0;36874:17;36869:246;;36909:15;36933:19;36944:7;36933:10;:19::i;:::-;-1:-1:-1;36908:44:0;;-1:-1:-1;36967:14:0;;-1:-1:-1;;;;;36967:14:0;36869:246;37016:23;37047:19;37058:7;37047:10;:19::i;:::-;-1:-1:-1;37014:52:0;;-1:-1:-1;37081:22:0;;-1:-1:-1;;;;;37081:22:0;37391:450;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;37486:42:::1;-1:-1:-1::0;;;;;37475:53:0;::::1;;;37467:104;;;::::0;-1:-1:-1;;;37467:104:0;;8693:2:1;37467:104:0::1;::::0;::::1;8675:21:1::0;8732:2;8712:18;;;8705:30;8771:34;8751:18;;;8744:62;-1:-1:-1;;;8822:18:1;;;8815:36;8868:19;;37467:104:0::1;8491:402:1::0;37467:104:0::1;-1:-1:-1::0;;;;;37591:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37590:21;37582:61;;;::::0;-1:-1:-1;;;37582:61:0;;9100:2:1;37582:61:0::1;::::0;::::1;9082:21:1::0;9139:2;9119:18;;;9112:30;9178:29;9158:18;;;9151:57;9225:18;;37582:61:0::1;8898:351:1::0;37582:61:0::1;-1:-1:-1::0;;;;;37657:16:0;::::1;37676:1;37657:16:::0;;;:7:::1;:16;::::0;;;;;:20;37654:108:::1;;-1:-1:-1::0;;;;;37733:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;37713:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;37694:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;37654:108:::1;-1:-1:-1::0;;;;;37772:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;37772:27:0::1;37795:4;37772:27:::0;;::::1;::::0;;;37810:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37810:23:0::1;::::0;;::::1;::::0;;37391:450::o;53780:114::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;53859:15:::1;:27:::0;;-1:-1:-1;;;;;;53859:27:0::1;-1:-1:-1::0;;;;;53859:27:0;;;::::1;::::0;;;::::1;::::0;;53780:114::o;32815:198::-;-1:-1:-1;;;;;32905:20:0;;32881:7;32905:20;;;:11;:20;;;;;;;;32901:49;;;-1:-1:-1;;;;;;32934:16:0;;;;;:7;:16;;;;;;;32815:198::o;32901:49::-;-1:-1:-1;;;;;32988:16:0;;;;;;:7;:16;;;;;;32968:37;;:19;:37::i;5779:148::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;5886:1:::1;5870:6:::0;;5849:40:::1;::::0;-1:-1:-1;;;;;5870:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;5849:40:0;5886:1;;5849:40:::1;5917:1;5900:19:::0;;-1:-1:-1;;;;;;5900:19:0::1;::::0;;5779:148::o;51798:382::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;51866:1:::1;51856:7;:11:::0;;;51878:15:::1;:19:::0;;;51908:13:::1;:17:::0;;;51936:21:::1;:25:::0;;;51972:8:::1;:12:::0;;;51995:16:::1;:27:::0;;;52033:13:::1;:17:::0;;;52061:21:::1;:25:::0;;;52097:16:::1;:24:::0;;-1:-1:-1;;;;52097:24:0::1;::::0;;52137:35:::1;::::0;1212:41:1;;;52137:35:0::1;::::0;1200:2:1;1185:18;52137:35:0::1;;;;;;;;51798:382::o:0;53490:171::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;53642:11:::1;53646:7:::0;53642:2:::1;:11;:::i;:::-;53632:21;::::0;:9;:21:::1;:::i;:::-;53600:29;:53:::0;-1:-1:-1;;53490:171:0:o;32507:87::-;32546:13;32579:7;32572:14;;;;;:::i;35797:269::-;35890:4;35907:129;3792:10;35930:7;35939:96;35978:15;35939:96;;;;;;;;;;;;;;;;;3792:10;35939:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;35939:34:0;;;;;;;;;;;;:38;:96::i;52825:113::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;52892:1:::1;52881:8;:12:::0;52923:7:::1;::::0;52904:16:::1;:26:::0;52825:113::o;7103:318::-;7155:14;;-1:-1:-1;;;;;7155:14:0;7173:10;7155:28;7147:76;;;;-1:-1:-1;;;7147:76:0;;11003:2:1;7147:76:0;;;10985:21:1;11042:2;11022:18;;;11015:30;11081:34;11061:18;;;11054:62;-1:-1:-1;;;11132:18:1;;;11125:33;11175:19;;7147:76:0;10801:399:1;7147:76:0;7260:9;;7242:15;:27;7234:85;;;;-1:-1:-1;;;7234:85:0;;11407:2:1;7234:85:0;;;11389:21:1;11446:2;11426:18;;;11419:30;11485:34;11465:18;;;11458:62;-1:-1:-1;;;11536:18:1;;;11529:42;11588:19;;7234:85:0;11205:408:1;7234:85:0;7364:14;;;7356:6;;7335:44;;-1:-1:-1;;;;;7364:14:0;;;;7356:6;;;;-1:-1:-1;;;;;;;;;;;7335:44:0;;7399:14;;;7390:23;;-1:-1:-1;;;;;;7390:23:0;-1:-1:-1;;;;;7399:14:0;;;7390:23;;;;;;7103:318::o;33225:167::-;33303:4;33320:42;3792:10;33344:9;33355:6;33320:9;:42::i;54267:173::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;54346:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;54346:32:0::1;-1:-1:-1::0;;;;54346:32:0;;::::1;;::::0;;54394:38:::1;::::0;::::1;::::0;::::1;::::0;54370:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;54394:38:0::1;;;;;;;;54267:173:::0;:::o;54013:162::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;54107:60:::1;54151:5;54107:25;54119:12;54107:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:60::i;:::-;54092:12;:75:::0;-1:-1:-1;54013:162:0:o;6771:226::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;6852:6:::1;::::0;;;6835:23;;-1:-1:-1;;;;;;6835:23:0;;::::1;-1:-1:-1::0;;;;;6852:6:0;::::1;6835:23;::::0;;;6869:19:::1;::::0;;6911:22:::1;6929:4:::0;6911:15:::1;:22;:::i;:::-;6899:9;:34:::0;6986:1:::1;6970:6:::0;;6949:40:::1;::::0;-1:-1:-1;;;;;6970:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;6949:40:0;6986:1;;6949:40:::1;6771:226:::0;:::o;51578:112::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51647:27:0::1;51677:5;51647:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;51647:35:0::1;::::0;;51578:112::o;6082:244::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6171:22:0;::::1;6163:73;;;::::0;-1:-1:-1;;;6163:73:0;;11953:2:1;6163:73:0::1;::::0;::::1;11935:21:1::0;11992:2;11972:18;;;11965:30;12031:34;12011:18;;;12004:62;-1:-1:-1;;;12082:18:1;;;12075:36;12128:19;;6163:73:0::1;11751:402:1::0;6163:73:0::1;6273:6;::::0;;6252:38:::1;::::0;-1:-1:-1;;;;;6252:38:0;;::::1;::::0;6273:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;6252:38:0;::::1;6301:6;:17:::0;;-1:-1:-1;;;;;;6301:17:0::1;-1:-1:-1::0;;;;;6301:17:0;;;::::1;::::0;;;::::1;::::0;;6082:244::o;52283:408::-;5342:6;;-1:-1:-1;;;;;5342:6:0;3792:10;5342:22;5334:67;;;;-1:-1:-1;;;5334:67:0;;;;;;;:::i;:::-;52350:1:::1;52340:7;:11:::0;;;52362:15:::1;:25:::0;;;52414:1:::1;52398:13;:17:::0;;;52426:21:::1;:37:::0;;;52474:8:::1;:12:::0;;;52497:16:::1;:26:::0;;;;52534:13:::1;:17:::0;;;52562:21:::1;:37:::0;;;52610:16:::1;:23:::0;;-1:-1:-1;;;;52610:23:0::1;-1:-1:-1::0;;;52610:23:0::1;::::0;;52649:34:::1;::::0;1212:41:1;;;52649:34:0::1;::::0;1200:2:1;1185:18;52649:34:0::1;1072:187:1::0;42763:337:0;-1:-1:-1;;;;;42856:19:0;;42848:68;;;;-1:-1:-1;;;42848:68:0;;12360:2:1;42848:68:0;;;12342:21:1;12399:2;12379:18;;;12372:30;12438:34;12418:18;;;12411:62;-1:-1:-1;;;12489:18:1;;;12482:34;12533:19;;42848:68:0;12158:400:1;42848:68:0;-1:-1:-1;;;;;42935:21:0;;42927:68;;;;-1:-1:-1;;;42927:68:0;;12765:2:1;42927:68:0;;;12747:21:1;12804:2;12784:18;;;12777:30;12843:34;12823:18;;;12816:62;-1:-1:-1;;;12894:18:1;;;12887:32;12936:19;;42927:68:0;12563:398:1;42927:68:0;-1:-1:-1;;;;;43008:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43060:32;;1410:25:1;;;43060:32:0;;1383:18:1;43060:32:0;;;;;;;42763:337;;;:::o;43615:1281::-;-1:-1:-1;;;;;43760:18:0;;43752:68;;;;-1:-1:-1;;;43752:68:0;;13168:2:1;43752:68:0;;;13150:21:1;13207:2;13187:18;;;13180:30;13246:34;13226:18;;;13219:62;-1:-1:-1;;;13297:18:1;;;13290:35;13342:19;;43752:68:0;12966:401:1;43752:68:0;-1:-1:-1;;;;;43839:16:0;;43831:64;;;;-1:-1:-1;;;43831:64:0;;13574:2:1;43831:64:0;;;13556:21:1;13613:2;13593:18;;;13586:30;13652:34;13632:18;;;13625:62;-1:-1:-1;;;13703:18:1;;;13696:33;13746:19;;43831:64:0;13372:399:1;43831:64:0;43923:1;43914:6;:10;43906:64;;;;-1:-1:-1;;;43906:64:0;;13978:2:1;43906:64:0;;;13960:21:1;14017:2;13997:18;;;13990:30;14056:34;14036:18;;;14029:62;-1:-1:-1;;;14107:18:1;;;14100:39;14156:19;;43906:64:0;13776:405:1;43906:64:0;44283:28;44314:24;44332:4;44314:9;:24::i;:::-;44408:29;;44283:55;;-1:-1:-1;44384:53:0;;;;;;;44466;;-1:-1:-1;44503:16:0;;-1:-1:-1;;;44503:16:0;;;;44502:17;44466:53;:95;;;;-1:-1:-1;44544:17:0;;-1:-1:-1;;;;;44536:25:0;;;44544:17;;44536:25;;44466:95;:133;;;;-1:-1:-1;44578:21:0;;-1:-1:-1;;;44578:21:0;;;;44466:133;44448:323;;;44649:29;;44626:52;;44723:36;44738:20;44723:14;:36::i;:::-;44858:30;44873:4;44878:2;44881:6;44858:14;:30::i;:::-;43741:1155;;43615:1281;;;:::o;9175:192::-;9261:7;9297:12;9289:6;;;;9281:29;;;;-1:-1:-1;;;9281:29:0;;;;;;;;:::i;:::-;-1:-1:-1;9321:9:0;9333:5;9337:1;9333;:5;:::i;:::-;9321:17;9175:192;-1:-1:-1;;;;;9175:192:0:o;40442:163::-;40483:7;40504:15;40521;40540:19;:17;:19::i;:::-;40503:56;;-1:-1:-1;40503:56:0;-1:-1:-1;40577:20:0;40503:56;;40577:11;:20::i;:::-;40570:27;;;;40442:163;:::o;10573:132::-;10631:7;10658:39;10662:1;10665;10658:39;;;;;;;;;;;;;;;;;:3;:39::i;8270:181::-;8328:7;;8360:5;8364:1;8360;:5;:::i;:::-;8348:17;;8389:1;8384;:6;;8376:46;;;;-1:-1:-1;;;8376:46:0;;14388:2:1;8376:46:0;;;14370:21:1;14427:2;14407:18;;;14400:30;14466:29;14446:18;;;14439:57;14513:18;;8376:46:0;14186:351:1;39240:419:0;39299:7;39308;39317;39326;39335;39344;39365:23;39390:12;39404:18;39426:20;39438:7;39426:11;:20::i;:::-;39364:82;;;;;;39458:15;39475:23;39500:12;39516:50;39528:7;39537:4;39543:10;39555;:8;:10::i;:::-;39516:11;:50::i;:::-;39457:109;;;;-1:-1:-1;39457:109:0;;-1:-1:-1;39617:15:0;;-1:-1:-1;39634:4:0;;-1:-1:-1;39640:10:0;;-1:-1:-1;39240:419:0;;-1:-1:-1;;;;;39240:419:0:o;8734:136::-;8792:7;8819:43;8823:1;8826;8819:43;;;;;;;;;;;;;;;;;:3;:43::i;9626:471::-;9684:7;9929:6;9925:47;;-1:-1:-1;9959:1:0;9952:8;;9925:47;9984:9;9996:5;10000:1;9996;:5;:::i;:::-;9984:17;-1:-1:-1;10029:1:0;10020:5;10024:1;9984:17;10020:5;:::i;:::-;:10;10012:56;;;;-1:-1:-1;;;10012:56:0;;14966:2:1;10012:56:0;;;14948:21:1;15005:2;14985:18;;;14978:30;15044:34;15024:18;;;15017:62;-1:-1:-1;;;15095:18:1;;;15088:31;15136:19;;10012:56:0;14764:397:1;44904:993:0;31082:16;:23;;-1:-1:-1;;;;31082:23:0;-1:-1:-1;;;31082:23:0;;;;45055:27:::1;:20:::0;45080:1:::1;45055:24;:27::i;:::-;45040:42:::0;-1:-1:-1;45093:17:0::1;45113:30;:20:::0;45040:42;45113:24:::1;:30::i;:::-;45093:50:::0;-1:-1:-1;45450:21:0::1;45516:22;45533:4:::0;45516:16:::1;:22::i;:::-;45669:18;45690:41;:21;45716:14:::0;45690:25:::1;:41::i;:::-;45669:62;;45785:35;45798:9;45809:10;45785:12;:35::i;:::-;45846:43;::::0;;15368:25:1;;;15424:2;15409:18;;15402:34;;;15452:18;;;15445:34;;;45846:43:0::1;::::0;15356:2:1;15341:18;45846:43:0::1;;;;;;;-1:-1:-1::0;;31128:16:0;:24;;-1:-1:-1;;;;31128:24:0;;;-1:-1:-1;;;44904:993:0:o;47138:1695::-;-1:-1:-1;;;;;47235:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;47265:29:0;;;;;;:18;:29;;;;;;;;47235:59;47232:227;;;47310:14;41946:1;41936:7;:11;;;41958:13;:17;;;41986:8;:12;;;42009:13;:17;41893:141;47310:14;47232:227;;;47383:12;;47373:6;:22;;47365:82;;;;-1:-1:-1;;;47365:82:0;;15692:2:1;47365:82:0;;;15674:21:1;15731:2;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;-1:-1:-1;;;15821:18:1;;;15814:45;15876:19;;47365:82:0;15490:411:1;47365:82:0;47533:15;47551:29;47576:3;47551:20;47562:8;;47551:6;:10;;:20;;;;:::i;:29::-;47533:47;;47591:20;47614:34;47644:3;47614:25;47625:13;;47614:6;:10;;:25;;;;:::i;:34::-;-1:-1:-1;;;;;47665:19:0;;;;;;:11;:19;;;;;;47591:57;;-1:-1:-1;47665:19:0;;:46;;;;-1:-1:-1;;;;;;47689:22:0;;;;;;:11;:22;;;;;;;;47688:23;47665:46;47661:599;;;47728:81;47750:6;47758:9;47770:37;47794:12;47770:19;:6;47781:7;47770:10;:19::i;:::-;:23;;:37::i;:::-;47728:21;:81::i;:::-;47661:599;;;-1:-1:-1;;;;;47832:19:0;;;;;;:11;:19;;;;;;;;47831:20;:46;;;;-1:-1:-1;;;;;;47855:22:0;;;;;;:11;:22;;;;;;;;47831:46;47827:433;;;47894:79;47914:6;47922:9;47934:37;47958:12;47934:19;:6;47945:7;47934:10;:19::i;:37::-;47894:19;:79::i;47827:433::-;-1:-1:-1;;;;;47995:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;48018:22:0;;;;;;:11;:22;;;;;;;;47995:45;47991:269;;;48057:81;48079:6;48087:9;48099:37;48123:12;48099:19;:6;48110:7;48099:10;:19::i;:37::-;48057:21;:81::i;47991:269::-;48171:77;48189:6;48197:9;48209:37;48233:12;48209:19;:6;48220:7;48209:10;:19::i;:37::-;48171:17;:77::i;:::-;48374:1;48364:7;:11;;;48386:13;:17;48503:10;;48477:46;;48495:6;;-1:-1:-1;;;;;48503:10:0;48515:7;48477:17;:46::i;:::-;48560:15;;48534:56;;48552:6;;-1:-1:-1;;;;;48560:15:0;48577:12;48534:17;:56::i;:::-;48655:15;;48645:7;:25;48697:21;;48681:13;:37;-1:-1:-1;;;;;48736:26:0;;-1:-1:-1;48736:26:0;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;48766:29:0;;;;;;:18;:29;;;;;;;;48736:59;48733:92;;;48810:15;42100:1;42090:7;:11;42128:1;42112:13;:17;;;42140:8;:12;;;42163:13;:17;42046:142;40613:561;40710:7;;40746;;40663;;;;;40770:289;40794:9;:16;40790:20;;40770:289;;;40860:7;40836;:21;40844:9;40854:1;40844:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40844:12:0;40836:21;;;;;;;;;;;;;:31;;:66;;;40895:7;40871;:21;40879:9;40889:1;40879:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40879:12:0;40871:21;;;;;;;;;;;;;:31;40836:66;40832:97;;;40912:7;;40921;;40904:25;;;;;;;40613:561;;:::o;40832:97::-;40954:34;40966:7;:21;40974:9;40984:1;40974:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40974:12:0;40966:21;;;;;;;;;;;;;40954:7;;:11;:34::i;:::-;40944:44;;41013:34;41025:7;:21;41033:9;41043:1;41033:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41033:12:0;41025:21;;;;;;;;;;;;;41013:7;;:11;:34::i;:::-;41003:44;-1:-1:-1;40812:3:0;;;;:::i;:::-;;;;40770:289;;;-1:-1:-1;41095:7:0;;41083;;:20;;:11;:20::i;:::-;41073:7;:30;41069:61;;;41113:7;;41122;;41105:25;;;;;;40613:561;;:::o;41069:61::-;41149:7;;41158;;-1:-1:-1;40613:561:0;-1:-1:-1;40613:561:0:o;11203:278::-;11289:7;11324:12;11317:5;11309:28;;;;-1:-1:-1;;;11309:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11348:9:0;11360:5;11364:1;11360;:5;:::i;39667:330::-;39727:7;39736;39745;39765:12;39780:24;39796:7;39780:15;:24::i;:::-;39765:39;;39815:18;39836:30;39858:7;39836:21;:30::i;:::-;39815:51;-1:-1:-1;39877:23:0;39903:33;39815:51;39903:17;:7;39915:4;39903:11;:17::i;:33::-;39877:59;39972:4;;-1:-1:-1;39978:10:0;;-1:-1:-1;39667:330:0;;-1:-1:-1;;;39667:330:0:o;40005:429::-;40120:7;;;;40176:24;:7;40188:11;40176;:24::i;:::-;40158:42;-1:-1:-1;40211:12:0;40226:21;:4;40235:11;40226:8;:21::i;:::-;40211:36;-1:-1:-1;40258:18:0;40279:27;:10;40294:11;40279:14;:27::i;:::-;40258:48;-1:-1:-1;40317:23:0;40343:33;40258:48;40343:17;:7;40355:4;40343:11;:17::i;:33::-;40395:7;;;;-1:-1:-1;40421:4:0;;-1:-1:-1;40005:429:0;;-1:-1:-1;;;;;;;40005:429:0:o;45905:605::-;46059:16;;;46073:1;46059:16;;;;;;;;46035:21;;46059:16;;;;;;;;;;-1:-1:-1;46059:16:0;46035:40;;46104:4;46086;46091:1;46086:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46086:23:0;;;:7;;;;;;;;;;:23;;;;46130:19;;:26;;;-1:-1:-1;;;46130:26:0;;;;:19;;;;;:24;;:26;;;;;46086:7;;46130:26;;;;;:19;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46120:4;46125:1;46120:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46120:36:0;;;:7;;;;;;;;;:36;46201:19;;46169:66;;46186:4;;46201:19;46223:11;46169:8;:66::i;:::-;46274:19;;:228;;-1:-1:-1;;;46274:228:0;;-1:-1:-1;;;;;46274:19:0;;;;:70;;:228;;46359:11;;46274:19;;46429:4;;46456;;46476:15;;46274:228;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45960:550;45905:605;:::o;46518:527::-;46698:19;;46666:66;;46683:4;;-1:-1:-1;;;;;46698:19:0;46720:11;46666:8;:66::i;:::-;46775:19;;:262;;-1:-1:-1;;;46775:262:0;;46851:4;46775:262;;;17364:34:1;;;17414:18;;;17407:34;;;46775:19:0;17457:18:1;;;17450:34;;;17500:18;;;17493:34;17543:19;;;17536:44;47011:15:0;17596:19:1;;;17589:35;-1:-1:-1;;;;;46775:19:0;;;;:35;;46818:9;;17298:19:1;;46775:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49949:566::-;50052:15;50069:23;50094:12;50108:23;50133:12;50147:18;50169:19;50180:7;50169:10;:19::i;:::-;-1:-1:-1;;;;;50217:15:0;;;;;;:7;:15;;;;;;50051:137;;-1:-1:-1;50051:137:0;;-1:-1:-1;50051:137:0;;-1:-1:-1;50051:137:0;-1:-1:-1;50051:137:0;-1:-1:-1;50051:137:0;-1:-1:-1;50217:28:0;;50237:7;50217:19;:28::i;:::-;-1:-1:-1;;;;;50199:15:0;;;;;;:7;:15;;;;;;;;:46;;;;50274:7;:15;;;;:28;;50294:7;50274:19;:28::i;:::-;-1:-1:-1;;;;;50256:15:0;;;;;;;:7;:15;;;;;;:46;;;;50334:18;;;;;;;:39;;50357:15;50334:22;:39::i;:::-;-1:-1:-1;;;;;50313:18:0;;;;;;:7;:18;;;;;:60;50387:26;50402:10;50387:14;:26::i;:::-;50424:23;50436:4;50442;50424:11;:23::i;:::-;50480:9;-1:-1:-1;;;;;50463:44:0;50472:6;-1:-1:-1;;;;;50463:44:0;;50491:15;50463:44;;;;1410:25:1;;1398:2;1383:18;;1264:177;50463:44:0;;;;;;;;50040:475;;;;;;49949:566;;;:::o;49355:586::-;49456:15;49473:23;49498:12;49512:23;49537:12;49551:18;49573:19;49584:7;49573:10;:19::i;:::-;-1:-1:-1;;;;;49621:15:0;;;;;;:7;:15;;;;;;49455:137;;-1:-1:-1;49455:137:0;;-1:-1:-1;49455:137:0;;-1:-1:-1;49455:137:0;-1:-1:-1;49455:137:0;-1:-1:-1;49455:137:0;-1:-1:-1;49621:28:0;;49455:137;49621:19;:28::i;:::-;-1:-1:-1;;;;;49603:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;49681:18;;;;;:7;:18;;;;;:39;;49704:15;49681:22;:39::i;:::-;-1:-1:-1;;;;;49660:18:0;;;;;;:7;:18;;;;;;;;:60;;;;49752:7;:18;;;;:39;;49775:15;49752:22;:39::i;38332:642::-;38435:15;38452:23;38477:12;38491:23;38516:12;38530:18;38552:19;38563:7;38552:10;:19::i;:::-;-1:-1:-1;;;;;38600:15:0;;;;;;:7;:15;;;;;;38434:137;;-1:-1:-1;38434:137:0;;-1:-1:-1;38434:137:0;;-1:-1:-1;38434:137:0;-1:-1:-1;38434:137:0;-1:-1:-1;38434:137:0;-1:-1:-1;38600:28:0;;38620:7;38600:19;:28::i;:::-;-1:-1:-1;;;;;38582:15:0;;;;;;:7;:15;;;;;;;;:46;;;;38657:7;:15;;;;:28;;38677:7;38657:19;:28::i;48845:502::-;48944:15;48961:23;48986:12;49000:23;49025:12;49039:18;49061:19;49072:7;49061:10;:19::i;:::-;-1:-1:-1;;;;;49109:15:0;;;;;;:7;:15;;;;;;48943:137;;-1:-1:-1;48943:137:0;;-1:-1:-1;48943:137:0;;-1:-1:-1;48943:137:0;-1:-1:-1;48943:137:0;-1:-1:-1;48943:137:0;-1:-1:-1;49109:28:0;;48943:137;49109:19;:28::i;41553:154::-;41617:7;41644:55;41683:5;41644:20;41656:7;;41644;:11;;:20;;;;:::i;41715:166::-;41785:7;41812:61;41857:5;41812:26;41824:13;;41812:7;:11;;:26;;;;:::i;41186:355::-;41249:19;41272:10;:8;:10::i;:::-;41249:33;-1:-1:-1;41293:18:0;41314:27;:10;41249:33;41314:14;:27::i;:::-;41393:4;41377:22;;;;:7;:22;;;;;;41293:48;;-1:-1:-1;41377:38:0;;41293:48;41377:26;:38::i;:::-;41368:4;41352:22;;;;:7;:22;;;;;;;;:63;;;;41429:11;:26;;;;;;41426:107;;;41511:4;41495:22;;;;:7;:22;;;;;;:38;;41522:10;41495:26;:38::i;:::-;41486:4;41470:22;;;;:7;:22;;;;;:63;41238:303;;41186:355;:::o;39085:147::-;39163:7;;:17;;39175:4;39163:11;:17::i;:::-;39153:7;:27;39204:10;;:20;;39219:4;39204:14;:20::i;:::-;39191:10;:33;-1:-1:-1;;39085:147:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;671:70;616:131;:::o;752:315::-;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1446:456::-;1523:6;1531;1539;1592:2;1580:9;1571:7;1567:23;1563:32;1560:52;;;1608:1;1605;1598:12;1560:52;1647:9;1634:23;1666:31;1691:5;1666:31;:::i;:::-;1716:5;-1:-1:-1;1773:2:1;1758:18;;1745:32;1786:33;1745:32;1786:33;:::i;:::-;1446:456;;1838:7;;-1:-1:-1;;;1892:2:1;1877:18;;;;1864:32;;1446:456::o;1907:180::-;1966:6;2019:2;2007:9;1998:7;1994:23;1990:32;1987:52;;;2035:1;2032;2025:12;1987:52;-1:-1:-1;2058:23:1;;1907:180;-1:-1:-1;1907:180:1:o;2281:247::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2448:9;2435:23;2467:31;2492:5;2467:31;:::i;2861:160::-;2926:20;;2982:13;;2975:21;2965:32;;2955:60;;3011:1;3008;3001:12;2955:60;2861:160;;;:::o;3026:248::-;3091:6;3099;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3204:9;3191:23;3181:33;;3233:35;3264:2;3253:9;3249:18;3233:35;:::i;:::-;3223:45;;3026:248;;;;;:::o;3487:::-;3555:6;3563;3616:2;3604:9;3595:7;3591:23;3587:32;3584:52;;;3632:1;3629;3622:12;3584:52;-1:-1:-1;;3655:23:1;;;3725:2;3710:18;;;3697:32;;-1:-1:-1;3487:248:1:o;3740:180::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3888:26;3904:9;3888:26;:::i;3925:388::-;3993:6;4001;4054:2;4042:9;4033:7;4029:23;4025:32;4022:52;;;4070:1;4067;4060:12;4022:52;4109:9;4096:23;4128:31;4153:5;4128:31;:::i;:::-;4178:5;-1:-1:-1;4235:2:1;4220:18;;4207:32;4248:33;4207:32;4248:33;:::i;:::-;4300:7;4290:17;;;3925:388;;;;;:::o;4557:380::-;4636:1;4632:12;;;;4679;;;4700:61;;4754:4;4746:6;4742:17;4732:27;;4700:61;4807:2;4799:6;4796:14;4776:18;4773:38;4770:161;;;4853:10;4848:3;4844:20;4841:1;4834:31;4888:4;4885:1;4878:15;4916:4;4913:1;4906:15;4770:161;;4557:380;;;:::o;5353:356::-;5555:2;5537:21;;;5574:18;;;5567:30;5633:34;5628:2;5613:18;;5606:62;5700:2;5685:18;;5353:356::o;6066:127::-;6127:10;6122:3;6118:20;6115:1;6108:31;6158:4;6155:1;6148:15;6182:4;6179:1;6172:15;6198:127;6259:10;6254:3;6250:20;6247:1;6240:31;6290:4;6287:1;6280:15;6314:4;6311:1;6304:15;6330:125;6370:4;6398:1;6395;6392:8;6389:34;;;6403:18;;:::i;:::-;-1:-1:-1;6440:9:1;;6330:125::o;6460:127::-;6521:10;6516:3;6512:20;6509:1;6502:31;6552:4;6549:1;6542:15;6576:4;6573:1;6566:15;6592:135;6631:3;-1:-1:-1;;6652:17:1;;6649:43;;;6672:18;;:::i;:::-;-1:-1:-1;6719:1:1;6708:13;;6592:135::o;7566:251::-;7636:6;7689:2;7677:9;7668:7;7664:23;7660:32;7657:52;;;7705:1;7702;7695:12;7657:52;7737:9;7731:16;7756:31;7781:5;7756:31;:::i;9254:422::-;9343:1;9386:5;9343:1;9400:270;9421:7;9411:8;9408:21;9400:270;;;9480:4;9476:1;9472:6;9468:17;9462:4;9459:27;9456:53;;;9489:18;;:::i;:::-;9539:7;9529:8;9525:22;9522:55;;;9559:16;;;;9522:55;9638:22;;;;9598:15;;;;9400:270;;;9404:3;9254:422;;;;;:::o;9681:806::-;9730:5;9760:8;9750:80;;-1:-1:-1;9801:1:1;9815:5;;9750:80;9849:4;9839:76;;-1:-1:-1;9886:1:1;9900:5;;9839:76;9931:4;9949:1;9944:59;;;;10017:1;10012:130;;;;9924:218;;9944:59;9974:1;9965:10;;9988:5;;;10012:130;10049:3;10039:8;10036:17;10033:43;;;10056:18;;:::i;:::-;-1:-1:-1;;10112:1:1;10098:16;;10127:5;;9924:218;;10226:2;10216:8;10213:16;10207:3;10201:4;10198:13;10194:36;10188:2;10178:8;10175:16;10170:2;10164:4;10161:12;10157:35;10154:77;10151:159;;;-1:-1:-1;10263:19:1;;;10295:5;;10151:159;10342:34;10367:8;10361:4;10342:34;:::i;:::-;10412:6;10408:1;10404:6;10400:19;10391:7;10388:32;10385:58;;;10423:18;;:::i;:::-;10461:20;;9681:806;-1:-1:-1;;;9681:806:1:o;10492:131::-;10552:5;10581:36;10608:8;10602:4;10581:36;:::i;10628:168::-;10668:7;10734:1;10730;10726:6;10722:14;10719:1;10716:21;10711:1;10704:9;10697:17;10693:45;10690:71;;;10741:18;;:::i;:::-;-1:-1:-1;10781:9:1;;10628:168::o;11618:128::-;11658:3;11689:1;11685:6;11682:1;11679:13;11676:39;;;11695:18;;:::i;:::-;-1:-1:-1;11731:9:1;;11618:128::o;14542:217::-;14582:1;14608;14598:132;;14652:10;14647:3;14643:20;14640:1;14633:31;14687:4;14684:1;14677:15;14715:4;14712:1;14705:15;14598:132;-1:-1:-1;14744:9:1;;14542:217::o;16038:980::-;16300:4;16348:3;16337:9;16333:19;16379:6;16368:9;16361:25;16405:2;16443:6;16438:2;16427:9;16423:18;16416:34;16486:3;16481:2;16470:9;16466:18;16459:31;16510:6;16545;16539:13;16576:6;16568;16561:22;16614:3;16603:9;16599:19;16592:26;;16653:2;16645:6;16641:15;16627:29;;16674:1;16684:195;16698:6;16695:1;16692:13;16684:195;;;16763:13;;-1:-1:-1;;;;;16759:39:1;16747:52;;16854:15;;;;16819:12;;;;16795:1;16713:9;16684:195;;;-1:-1:-1;;;;;;;16935:32:1;;;;16930:2;16915:18;;16908:60;-1:-1:-1;;;16999:3:1;16984:19;16977:35;16896:3;16038:980;-1:-1:-1;;;16038:980:1:o;17635:306::-;17723:6;17731;17739;17792:2;17780:9;17771:7;17767:23;17763:32;17760:52;;;17808:1;17805;17798:12;17760:52;17837:9;17831:16;17821:26;;17887:2;17876:9;17872:18;17866:25;17856:35;;17931:2;17920:9;17916:18;17910:25;17900:35;;17635:306;;;;;:::o

Swarm Source

ipfs://29924f4099a532af8c0b5f6b2ad5408349527da63c0ca7d10b447fd199569808
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading