ETH Price: $3,676.50 (+2.73%)
Gas: 5.92 Gwei

Token

ERC-20: Boobies (BOOB)
 

Overview

Max Total Supply

5,763,290.521196475983104058 BOOB

Holders

94

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
8,644.921448468768157956 BOOB

Value
$0.00
0x51656447524f4838628a5ce7b53f0edaa5d63492
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Boobies

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-17
*/

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol


pragma solidity >=0.5.0;

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

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

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

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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol


pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol


pragma solidity >=0.6.2;


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

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

// File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol


pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: boobies1.sol


pragma solidity ^0.8.26;








    /**
    * THIS CONTRACT IS NOT FULLY AUDITED AND IS STILL IN THE TESTING PHASE.
    * USE AT YOUR OWN RISK.
    * 
    * Twitter: https://twitter.com/5318008eth 
    *
    * TOKENOMICS:
    * Initial Supply: 1,000,000 BOOBS
    *
    * 2.5% of Supply to Dev
    * 2.5% of Supply to Rebase Rewards
    * 25% of Supply to Initial Liquidity Pool
    * 70% of Supply to Tranche Releases
    * 
    * Tranches unlocks at: [4x, 8x, 16x, 32x, 64x, 128x, 256x, 512x, 1024x, 2048x, 4096x, 8192x]
    * Tranche supply sizes are: [5%, 5%, 5%, 5%, 2.5%, 2.5%, 2.5%, 2.5%, 1.25%, 1.25%, 1.25%, 1.25%]
    * Ethereum raised in Tranche sales are immediately paired with unreleased tokens to add liquidity.
    *
    * Token Rebases to maintain peg of 5318008 * 10^y
    *
    * PLEASE READ BEFORE CHANGING ANY ACCOUNTING OR MATH
    * Anytime there is division, there is a risk of numerical instability from rounding errors. In
    * order to minimize this risk, we adhere to the following guidelines:
    * 1) The conversion rate adopted is the number of BaseUnits (BU) that equals 1 PublicUnit (PU).
    *    The inverse rate must not be used—TOTAL_BASE_UNITS is always the numerator and _totalSupply is
    *    always the denominator. (i.e., If you want to convert BU to PU, instead of multiplying by the inverse rate,
    *    you should divide by the normal rate).
    * 2) BaseUnit balances converted into PublicUnits are always rounded down (truncated).
    *
    * We make the following guarantees:
    * - If address 'A' transfers x PublicUnits to address 'B', A's resulting external balance will
    *   be decreased by precisely x PublicUnits, and B's external balance will be precisely
    *   increased by x PublicUnits.
    *
    * We do not guarantee that the sum of all balances equals the result of calling totalSupply().
    * This is because, for any conversion function 'f()' that has non-zero rounding error,
    * f(x0) + f(x1) + ... + f(xn) is not always equal to f(x0 + x1 + ... xn).
    */

contract Boobies is IERC20, ReentrancyGuard, Ownable {
    string private _name = "Boobies";
    string private _symbol = "BOOB";
    uint8 private _decimals = 18;

    // Constants
    uint256 private constant MAX_UINT256 = type(uint256).max;
    uint256 private constant INITIAL_SUPPLY = 1_000_000 * 1e18;
    uint256 private constant TOTAL_BASE_UNITS = MAX_UINT256 - (MAX_UINT256 % INITIAL_SUPPLY); // TOTAL_BASE_UNITS is a multiple of INITIAL_SUPPLY so that _baseUnitsPerPublicUnit is an integer.

    // Token Variables
    uint256 private _totalSupply;
    uint256 private _baseUnitsPerPublicUnit;
    mapping(address => uint256) private _baseUnitBalances;
    mapping(address => mapping(address => uint256)) private _allowedPublicUnits; // This is denominated in PublicUnits (PU), because the BaseUnit-PublicUnit conversion might change before it's fully paid.

    // Rebase Variables
    uint256 public pegValue = 531800800800800800; // $0.5318008
    uint256 public lastRebaseBlock = 0;
    uint256 public maxPriceDifference = 3; // Maximum allowed price difference in percentage (3%)
    bool public launched = false;

    // Tranche Prices
    uint256 public initialPricePerInitialSupply;
    uint256[] public priceMultiples = [4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192];
    uint256[12] public trancheSupplyBaseUnits;
    uint256[12] public trancheSoldBaseUnits;

    // Sniper Protection
    bool private _locked;
    bool public sniperProtection = false;
    mapping(address => bool) private _isExcludedFromSniperProtection;
    uint256 public maxTransaction = TOTAL_BASE_UNITS / 100; // 1% Max Transaction Size
    uint256 public maxPriorityFee = 33 * 1e8; // 3.3 gwei

    // Addresses
    IUniswapV2Router02 public uniswapV2Router;
    IUniswapV2Pair public uniswapV2Pair;
    IUniswapV2Pair public ethUsdcPair;
    AggregatorV3Interface public ethPriceFeed;

    // Rebase Rewards
    uint256 public rewardMultiplier = 250; // 250% by default (should be around 150% of actual gas spent)
    mapping(address => uint256) public successfulRebaseCalls;

    // Events
    event Rebase(uint256 _totalSupply, uint256 pegValue);
    event LiquidityDeployed(address pair, uint256 tokenAmount, uint256 ethAmount);
    event RewardUnpaid(address indexed recipient, uint256 attemptedTokenAmount);
    event WithdrawalRequested(address indexed requester, uint256 amount, uint256 executeAfter);
    event WithdrawalExecuted(address indexed executor, uint256 amount);

    // Withdrawal Struct
    struct Withdrawal {
        uint256 amount;
        uint256 executeAfter;
    }

    // Timelock Mappings for Withdrawals
    mapping(address => Withdrawal) public pendingETHWithdrawals;
    mapping(address => Withdrawal) public pendingTokenWithdrawals;

    // Price and calculation errors
    error DivisionByZeroError(string context);
    error InvalidPriceError(string priceType);
    error PriceOutsideAcceptableRange();
    error PriceDifferenceOutOfRange();

    // Balance and allowance errors
    error InsufficientBalanceError(string balanceType);
    error InvalidRecipient(address recipient);

    // Input and validation errors
    error InvalidInputError(string inputType);
    error LaunchStatus(bool launched);
    error TranchePriceExceedsCurrentPrice();
    error TrancheSoldOut();

    // Access control errors
    error OnlyOwnerAllowed();
    error ReentrantCall();

    // Transaction limit errors
    error MaxTransactionExceeded();
    error MaxPriorityFeeExceeded();

    // Rebase errors
    error RebaseTimeLock();

    // Miscellaneous errors
    error NoETHToWithdraw();

    // Modifiers
    modifier validRecipient(address to) {
        if (to == address(0)) revert InvalidRecipient(to);
        _;
    }

    modifier trancheReentrant() {
        if (_locked) revert ReentrantCall();
        _locked = true;
        _;
        _locked = false;
    }

    /**
     * @dev Constructor initializes the contract with Uniswap V2 Router, ETH-USDC pair, and Chainlink oracle addresses.
     * 
     * Uniswap V2 Router Addresses:
     * Mainnet: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D (Mainnet Uniswap V2 Router address).
     * Sepolia: 0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008 (Sepolia Uniswap V2 Router address).
     * 
     * ETH-USDC Pair Addresses:
     * Mainnet: 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc (ETH/USDC Uniswap V2 Pair on Mainnet).
     * Sepolia: 0x6c1bBfD6330CA6c3f27C29b3a3330dB2B6B0980a (ETH/USDC Uniswap V2 Pair on Sepolia).
     * 
     * USDC Token Address:
     * Mainnet: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC on Mainnet).
     * Sepolia: 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 (USDC on Sepolia).
     *
     * Chainlink Oracle Addresses:
     * Mainnet: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419 (ETH/USD on Mainnet).
     * Sepolia: 0x694AA1769357215DE4FAC081bf1f309aDC325306 (ETH/USD on Sepolia).
     */
    constructor(
        address _uniswapV2Router, 
        address _ethPriceFeed, 
        address _ethUsdcPair
    ) Ownable(msg.sender) {
        uniswapV2Router = IUniswapV2Router02(_uniswapV2Router);
        ethPriceFeed = AggregatorV3Interface(_ethPriceFeed);
        ethUsdcPair = IUniswapV2Pair(_ethUsdcPair);
        uniswapV2Pair  = IUniswapV2Pair(IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()));

        _totalSupply = INITIAL_SUPPLY;
        _baseUnitBalances[address(this)] = TOTAL_BASE_UNITS;
        _baseUnitsPerPublicUnit = TOTAL_BASE_UNITS / _totalSupply;

        emit Transfer(address(0x0), address(this), _totalSupply);

        setExcludedFromSniperProtection(owner(), true);
        setExcludedFromSniperProtection(address(uniswapV2Router), true);
        setExcludedFromSniperProtection(address(this), true);
        setExcludedFromSniperProtection(address(0xdead), true);
        setExcludedFromSniperProtection(address(uniswapV2Pair), true);
    }

    /**
     * @dev Receive function to accept ETH deposits.
     */
    receive() external payable {
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @notice Sets the maximum allowed price difference to allow for rebase.
     * @dev Only callable by the contract owner.
     * @param _maxPriceDifference The new maximum price difference percentage.
     */
    function setMaxPriceDifference(uint256 _maxPriceDifference) external onlyOwner {
        maxPriceDifference = _maxPriceDifference;
    }

    /**
     * @notice Sets the reward multiplier to adjust the payout of rebase rewards.
     * @dev Only callable by the contract owner.
     * @param newRewardMultiplier The new reward multiplier.
     */
    function setRewardMultiplier(uint256 newRewardMultiplier) external onlyOwner {
        if (newRewardMultiplier > 1000) revert InvalidInputError("Reward multiplier");
        rewardMultiplier = newRewardMultiplier;
    }

    /**
     * @notice Toggles sniper protection on or off.
     * @dev Only callable by the contract owner.
     */
    function toggleSniperProtection() external onlyOwner {
        sniperProtection = !sniperProtection;
    }

    /**
     * @notice Excludes or includes an account from sniper protection.
     * @dev Only callable by the contract owner.
     * @param account The address to exclude or include.
     * @param excluded Boolean indicating exclusion status.
     */
    function setExcludedFromSniperProtection(address account, bool excluded) public onlyOwner {
        _isExcludedFromSniperProtection[account] = excluded;
    }

    /**
     * @notice Requests to withdraw a specified amount of ETH from the contract.
     * @dev Only callable by the contract owner. Initiates a timelock of 24 hours.
     * @param amount The amount of ETH to withdraw.
     */
    function requestWithdrawETH(uint256 amount) external onlyOwner {
        if (amount > address(this).balance) revert NoETHToWithdraw();
        pendingETHWithdrawals[msg.sender] = Withdrawal({
            amount: amount,
            executeAfter: block.timestamp + 24 hours
        });
        emit WithdrawalRequested(msg.sender, amount, block.timestamp + 24 hours);
    }

    /**
     * @notice Executes the ETH withdrawal after the timelock period.
     * @dev Only callable by the contract owner once the timelock has passed.
     */
    function executeWithdrawETH() external onlyOwner nonReentrant {
        Withdrawal memory withdrawal = pendingETHWithdrawals[msg.sender];
        if (withdrawal.amount == 0) revert NoETHToWithdraw();
        if (block.timestamp < withdrawal.executeAfter) revert RebaseTimeLock();

        pendingETHWithdrawals[msg.sender].amount = 0;

        payable(owner()).transfer(withdrawal.amount);
        emit WithdrawalExecuted(msg.sender, withdrawal.amount);
    }

    /**
     * @notice Requests to withdraw a specified amount of tokens.
     * @dev Only callable by the contract owner. Initiates a timelock of 24 hours.
     * @param amount The amount of tokens to withdraw.
     */
    function requestWithdrawTokens(uint256 amount) external onlyOwner {
        if (amount == 0) revert InvalidInputError("Withdraw amount");
        uint256 baseUnitValue = amount * _baseUnitsPerPublicUnit;
        if (_baseUnitBalances[address(this)] < baseUnitValue) revert InsufficientBalanceError("Token balance");

        pendingTokenWithdrawals[msg.sender] = Withdrawal({
            amount: amount,
            executeAfter: block.timestamp + 24 hours
        });
        emit WithdrawalRequested(msg.sender, amount, block.timestamp + 24 hours);
    }

    /**
     * @notice Executes the token withdrawal after the timelock period.
     * @dev Only callable by the contract owner once the timelock has passed.
     */
    function executeWithdrawTokens() external onlyOwner nonReentrant {
        Withdrawal memory withdrawal = pendingTokenWithdrawals[msg.sender];
        if (withdrawal.amount == 0) revert NoETHToWithdraw();
        if (block.timestamp < withdrawal.executeAfter) revert RebaseTimeLock();

        pendingTokenWithdrawals[msg.sender].amount = 0;

        uint256 baseUnitValue = withdrawal.amount * _baseUnitsPerPublicUnit;
        _baseUnitBalances[address(this)] -= baseUnitValue;
        _baseUnitBalances[owner()] += baseUnitValue;

        emit Transfer(address(this), owner(), withdrawal.amount);
        emit WithdrawalExecuted(msg.sender, withdrawal.amount);
    }

    /**
     * @dev Rebalances the supply of PublicUnits to adjust for the current market price, bringing
     * the token supply back in line with its peg. The peg and supply adjustments are made based on the
     * current price of the token in USD, retrieved through external oracles and the Uniswap price feed.
     *
     * Internally adjusts the BaseUnit balance by recalculating the conversion rate between PublicUnits and BaseUnits.
     * The `totalSupply()` will be modified in accordance with the price peg.
     * 
     * In addition, the caller of the `rebase()` function will be paid a bonus in PublicUnits equivalent to 
     * cover gas cost incurred, adjusted by the reward multiplier. The token amount is calculated based 
     * on the ETH cost of gas, and the tokens are transferred to the caller's specified recipient.
     *
     * Emits a `Rebase` event reflecting the new total supply and peg value.
     * Emits a `Transfer` event if the reward payment to the caller is successful.
     * Emits a `RewardUnpaid` event if the contract does not have enough tokens to pay the reward.
     */
    function rebase(address paymentRecipient) external nonReentrant {
        if (block.number < (lastRebaseBlock + 300)) revert RebaseTimeLock();

        if (paymentRecipient == address(0)) {
            paymentRecipient = msg.sender;
        }

        uint256 gasStart = gasleft();

        _rebase();

        successfulRebaseCalls[msg.sender] += 1;

        if (rewardMultiplier > 0) {
            uint256 boobsPriceInETH = getBoobsPriceInETH();
            if (boobsPriceInETH == 0) revert InvalidPriceError("BOOBS/ETH");

            uint256 gasUsed = gasStart - gasleft();
            uint256 gasCost = gasUsed * block.basefee;
            uint256 payoutInETH = ((gasCost + (1.5 * 1e9)) * rewardMultiplier) / 100;

            uint256 tokenAmount = (payoutInETH * 1e18) / boobsPriceInETH;
            uint256 baseUnitValue = tokenAmount * _baseUnitsPerPublicUnit;

            if (_baseUnitBalances[address(this)] >= baseUnitValue) {
                _baseUnitBalances[address(this)] -= baseUnitValue;
                _baseUnitBalances[paymentRecipient] += baseUnitValue;

                emit Transfer(address(this), paymentRecipient, tokenAmount);
            } else {
                emit RewardUnpaid(paymentRecipient, tokenAmount);
            }
        }
    }

    /**
     * @dev Internal function that performs the rebase operation, adjusting the supply of PublicUnits 
     * based on the current price in USD and the target peg value.
     *
     * The function fetches the price of ETH from both Chainlink and Uniswap, ensuring that the price
     * discrepancy is within the acceptable range. Then, it calculates the new rebase factor and adjusts
     * the total supply of PublicUnits accordingly.
     * 
     * If the total supply has grown too large or too small, it adjusts the peg value by a factor of 10
     * in either direction. After adjusting the supply, the function syncs the Uniswap liquidity pair.
     * 
     * The `lastRebaseBlock` is updated to the current block after a successful rebase.
     *
     * Emits a `Rebase` event reflecting the new total supply and peg value.
     * 
     * return The updated supply of PublicUnits after the rebase.
     */
    function _rebase() internal {
        uint256 ethPriceFromChainlink = getETHPriceFromChainlink();
        uint256 ethPriceFromUniswap = getETHPriceFromUniswap();

        if (ethPriceFromChainlink == 0 || ethPriceFromUniswap == 0) revert InvalidPriceError("ETH");
        if (!isPriceDifferenceAcceptable(ethPriceFromUniswap, ethPriceFromChainlink)) revert PriceDifferenceOutOfRange();

        uint256 boobsPriceInUSD = getBoobsPriceInUSD(ethPriceFromUniswap);
        if (boobsPriceInUSD == 0) revert InvalidPriceError("BOOBS/USD");

        uint256 rebaseFactor = (boobsPriceInUSD * 1e18) / pegValue;
        uint256 supplyAdjustment = (rebaseFactor * _totalSupply) / 1e18;

        if (supplyAdjustment > (12_000_000 * 1e18)) {
            supplyAdjustment = supplyAdjustment / 10;
            pegValue = pegValue * 10;
        } else if (supplyAdjustment < (800_000 * 1e18)) {
            supplyAdjustment = supplyAdjustment * 10;
            pegValue = pegValue / 10;
        }

        _totalSupply = supplyAdjustment;
        _baseUnitsPerPublicUnit = TOTAL_BASE_UNITS / _totalSupply;
        lastRebaseBlock = block.number;

        emit Rebase(_totalSupply, pegValue);

        IUniswapV2Pair(address(uniswapV2Pair)).sync();
    }

    /**
     * @dev Retrieves the current price of BOOBS in USD based on Uniswap prices.
     * 
     * @param ethPriceFromUniswap The price of ETH from Uniswap.
     * @return The price of BOOBS in USD.
     */
    function getBoobsPriceInUSD(uint256 ethPriceFromUniswap) public view returns (uint256) {
        uint256 boobsPriceInETH = getBoobsPriceInETH();
        if (boobsPriceInETH == 0 || ethPriceFromUniswap == 0) revert InvalidPriceError("BOOBS/ETH or ETH/USD");

        return (boobsPriceInETH * ethPriceFromUniswap) / 1e18;
    }

    /**
     * @dev Retrieves the current price of BOOBS in ETH based on the Uniswap liquidity pool.
     * 
     * @return The price of BOOBS in ETH.
     */
    function getBoobsPriceInETH() public view returns (uint256) {
        IUniswapV2Pair pair = IUniswapV2Pair(address(uniswapV2Pair));
        (uint112 reserve0, uint112 reserve1, ) = pair.getReserves();
        if (reserve0 == 0 || reserve1 == 0) revert DivisionByZeroError("BOOBS/ETH reserves");

        if (pair.token0() == address(this)) {
            return uint256(reserve1) * 1e18 / uint256(reserve0);
        } else {
            return uint256(reserve0) * 1e18 / uint256(reserve1);
        }
    }

    /**
     * @dev Retrieves the current price of ETH in USD from Uniswap's ETH/USDC pool.
     * 
     * @return The price of ETH in USD.
     */
    function getETHPriceFromUniswap() public view returns (uint256) {
        IUniswapV2Pair pair = IUniswapV2Pair(ethUsdcPair);
        (uint112 reserve0, uint112 reserve1, ) = pair.getReserves();
        if (reserve0 == 0 || reserve1 == 0) revert DivisionByZeroError("ETH/USDC reserves");

        if (pair.token0() == uniswapV2Router.WETH()) {
            return uint256(reserve1) * 1e30 / uint256(reserve0);
        } else {
            return uint256(reserve0) * 1e30 / uint256(reserve1);
        }
    }

    /**
     * @dev Retrieves the current price of ETH in USD from Chainlink's price feed.
     * 
     * @return The price of ETH in USD (18 decimal places).
     */
    function getETHPriceFromChainlink() public view returns (uint256) {
        (,int256 price,,,) = ethPriceFeed.latestRoundData();
        if (price <= 0) revert InvalidPriceError("ETH from Chainlink");
        return uint256(price) * 1e10;
    }

    /**
     * @dev Checks if the price difference between Uniswap and Chainlink is within the acceptable range.
     * 
     * @param uniswapPrice The price of ETH from Uniswap.
     * @param chainlinkPrice The price of ETH from Chainlink.
     * @return True if the price difference is acceptable, false otherwise.
     */
    function isPriceDifferenceAcceptable(uint256 uniswapPrice, uint256 chainlinkPrice) public view returns (bool) {
        uint256 difference = uniswapPrice > chainlinkPrice ? uniswapPrice - chainlinkPrice : chainlinkPrice - uniswapPrice;
        uint256 percentageDifference = (difference * 100) / ((uniswapPrice + chainlinkPrice) / 2);
        return percentageDifference <= maxPriceDifference;
    }

    /**
     * @dev Deploys initial liquidity to Uniswap, sets up tranche supplies, and initializes key contract parameters.
     * This function can only be called once by the owner when the contract is unlaunched.
     * It requires ETH to be sent along with the transaction to provide initial liquidity.
     */
    function deployAndSendLiquidity() external payable onlyOwner {
        if (launched) revert LaunchStatus(launched);
        if (msg.value == 0) revert InsufficientBalanceError("ETH");
        

        uint256 ethAmount = msg.value;
        uint256 tokenAmount = _totalSupply;

        uint256 devTokenAmount = (tokenAmount * 25) / 1000; // 2.5%
        uint256 vaultTokenAmount = (tokenAmount * 725) / 1000; // 72.5%
        uint256 tokensToLP = tokenAmount - devTokenAmount - vaultTokenAmount; // 25%

        uint256 baseUnitValueDev = devTokenAmount * _baseUnitsPerPublicUnit;
        _baseUnitBalances[address(this)] -= baseUnitValueDev;
        _baseUnitBalances[owner()] += baseUnitValueDev;
        emit Transfer(address(this), owner(), devTokenAmount);

        if (balanceOf(address(this)) < tokensToLP) revert InsufficientBalanceError("Token balance for liquidity");

        _allowedPublicUnits[address(this)][address(uniswapV2Router)] = tokensToLP;

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokensToLP,
            0,
            0,
            owner(),
            block.timestamp
        );

        // Record initial price per initial supply
        initialPricePerInitialSupply = (ethAmount * 1e18) / tokensToLP;

        // Tranche Sizes (4 tranches of 5%, 4 tranches of 2.5%, and 4 tranches of 1.25%)
        uint256 trancheOne = (TOTAL_BASE_UNITS / 10000) * 500;
        uint256 trancheTwo = (TOTAL_BASE_UNITS / 10000) * 250;
        uint256 trancheThree = (TOTAL_BASE_UNITS / 10000) * 125;

        for (uint256 i = 0; i < priceMultiples.length; i++) {
            if (i < 4) {
                trancheSupplyBaseUnits[i] = trancheOne;
            } else if (i < 8) {
                trancheSupplyBaseUnits[i] = trancheTwo;
            } else {
                trancheSupplyBaseUnits[i] = trancheThree;
            }
        }

        launched = true;

        emit LiquidityDeployed(address(uniswapV2Pair), tokensToLP, ethAmount);
    }

    /**
     * @dev Allows users to purchase tokens from a specific tranche.
     * The tranche must be available for purchase (current price >= tranche price).
     * The transaction will be rejected if the current price differs from the tranche price by more than the specified percentage.
     * Excess ETH is refunded, and purchased tokens are added to Uniswap liquidity.
     * @param trancheIndex The index of the tranche to purchase from.
     * @param maxPriceDifferencePercent The maximum allowed percentage difference between current price and tranche price (must be greater than 1).
     */
    function buyTranche(uint256 trancheIndex, uint256 maxPriceDifferencePercent) external payable trancheReentrant {
        if (msg.value == 0) revert InsufficientBalanceError("ETH sent");
        if (!launched) revert LaunchStatus(launched);
        if (trancheIndex >= priceMultiples.length) revert InvalidInputError("Tranche index");
        if (maxPriceDifferencePercent < 100) revert InvalidInputError("Max price difference");

        uint256 currentPrice = getBoobsPriceInETH();
        uint256 tranchePricePerInitialSupply = initialPricePerInitialSupply * priceMultiples[trancheIndex];
        uint256 tranchePrice = (tranchePricePerInitialSupply * INITIAL_SUPPLY) / totalSupply();

        if (currentPrice < tranchePrice) revert TranchePriceExceedsCurrentPrice();
        if (currentPrice > (tranchePrice + (tranchePrice * maxPriceDifferencePercent / 10000))) revert PriceOutsideAcceptableRange();

        uint256 remainingBaseUnits = trancheSupplyBaseUnits[trancheIndex] - trancheSoldBaseUnits[trancheIndex];
        if (remainingBaseUnits == 0) revert TrancheSoldOut();

        uint256 tokensToBuy = (msg.value * 1e18) / currentPrice;

        uint256 baseUnitsToBuy = tokensToBuy * _baseUnitsPerPublicUnit;
        if (baseUnitsToBuy > remainingBaseUnits) {
            baseUnitsToBuy = remainingBaseUnits;
            tokensToBuy = baseUnitsToBuy / _baseUnitsPerPublicUnit;
        }

        uint256 ethToUse = (tokensToBuy * currentPrice) / 1e18;

        if (_baseUnitBalances[address(this)] < baseUnitsToBuy) revert InsufficientBalanceError("Token balance");

        _baseUnitBalances[address(this)] -= baseUnitsToBuy;
        _baseUnitBalances[msg.sender] += baseUnitsToBuy;

        trancheSoldBaseUnits[trancheIndex] += baseUnitsToBuy;

        if (ethToUse < msg.value) {
            payable(msg.sender).transfer(msg.value - ethToUse);
        }

        _allowedPublicUnits[address(this)][address(uniswapV2Router)] = tokensToBuy;

        uint256 minTokens = (tokensToBuy * 95) / 100; // 5% slippage tolerance
        uint256 minETH = (ethToUse * 95) / 100; // 5% slippage tolerance

        uniswapV2Router.addLiquidityETH{value: ethToUse}(
            address(this),
            tokensToBuy,
            minTokens,
            minETH,
            owner(),
            block.timestamp
        );

        emit Transfer(address(this), msg.sender, tokensToBuy);
    }
    
    /**
     * @dev Returns an array of boolean values indicating which tranches are currently available for purchase.
     * A tranche is available if its price is less than or equal to the current market price
     * and it still has tokens available for sale.
     * @return An array of boolean values where true indicates the tranche is available.
     */
    function getAvailableTranches() public view returns (bool[] memory) {
        bool[] memory availableTranches = new bool[](priceMultiples.length);
        uint256 currentPricePerInitialSupply = (getBoobsPriceInETH() * totalSupply()) / INITIAL_SUPPLY;
        
        for (uint256 i = 0; i < priceMultiples.length; i++) {
            uint256 tranchePricePerInitialSupply = initialPricePerInitialSupply * priceMultiples[i];
            if (currentPricePerInitialSupply >= tranchePricePerInitialSupply &&
                trancheSoldBaseUnits[i] < trancheSupplyBaseUnits[i]) {
                availableTranches[i] = true;
            } else {
                availableTranches[i] = false;
            }
        }
        
        return availableTranches;
    }

    /**
     * @dev Calculates the percentage difference between the current price and the tranche price.
     * @param trancheIndex The index of the tranche to compare against.
     * @return The percentage difference, expressed as a number where 10000 represents 100%.
     * Returns 0 if the current price is lower than or equal to the tranche price.
     */
    function getCurrentPriceDifferencePercent(uint256 trancheIndex) public view returns (uint256) {
        if (trancheIndex >= priceMultiples.length) revert InvalidInputError("Tranche index");
        
        uint256 currentPrice = getBoobsPriceInETH();
        uint256 tranchePricePerInitialSupply = initialPricePerInitialSupply * priceMultiples[trancheIndex];
        uint256 tranchePrice = (tranchePricePerInitialSupply * INITIAL_SUPPLY) / totalSupply();
        
        if (currentPrice <= tranchePrice) {
            return 0;
        }
        
        uint256 priceDifference = currentPrice - tranchePrice;
        uint256 percentageDifference = (priceDifference * 10000) / tranchePrice;
        
        return percentageDifference;
    }

    /**
     * @dev Returns the total supply of PublicUnits in the system.
     * This value is dynamically calculated based on the number of BaseUnits in existence
     * and the conversion rate from BaseUnits to PublicUnits.
     *
     * @return The total number of PublicUnits.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Returns the number of PublicUnits held by a specific address.
     * This function performs an internal conversion from BaseUnits to PublicUnits.
     * 
     * @param who The address whose PublicUnit balance is being queried.
     * @return The number of PublicUnits held by the specified address.
     */
    function balanceOf(address who) public view override returns (uint256) {
        return _baseUnitBalances[who] / _baseUnitsPerPublicUnit;
    }

    /**
     * @dev Returns the raw balance in BaseUnits for a specific address.
     * This function does not convert BaseUnits to PublicUnits and is used for internal calculations.
     * 
     * @param who The address whose BaseUnit balance is being queried.
     * @return The raw balance of BaseUnits held by the specified address.
     */
    function scaledBalanceOf(address who) public view returns (uint256) {
        return _baseUnitBalances[who];
    }

    /**
     * @dev Returns the total number of BaseUnits in the system.
     * This function is used for internal accounting and is not directly tied to the PublicUnit supply.
     * 
     * @return The total number of BaseUnits.
     */
    function scaledTotalSupply() public pure returns (uint256) {
        return TOTAL_BASE_UNITS;
    }

    /**
     * @dev Transfers PublicUnits from the caller's account to the recipient's account.
     * The actual transfer is done by adjusting the BaseUnit balances internally. The public-facing
     * balance in PublicUnits is updated accordingly by the conversion between BaseUnits and PublicUnits.
     *
     * @param to The address to transfer PublicUnits to.
     * @param value The amount of PublicUnits to be transferred.
     * @return True if the transfer was successful.
     */
    function transfer(address to, uint256 value) public override validRecipient(to) nonReentrant returns (bool) {
        uint256 baseUnitValue = value * _baseUnitsPerPublicUnit;
        
        if (sniperProtection && !_isExcludedFromSniperProtection[to]){
            if (baseUnitValue > maxTransaction) revert MaxTransactionExceeded();
            if ((tx.gasprice - block.basefee) > maxPriorityFee) revert MaxPriorityFeeExceeded();
        }

        _baseUnitBalances[msg.sender] -= baseUnitValue;
        _baseUnitBalances[to] += baseUnitValue;

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Transfers the entire PublicUnit balance from the caller's account to the specified recipient.
     * The PublicUnits are converted from BaseUnits before performing the transfer.
     * 
     * The caller's BaseUnit balance is set to zero after the transfer.
     *
     * Emits a `Transfer` event.
     * 
     * @param to The recipient of the entire PublicUnit balance.
     * @return True if the transfer is successful.
     */
    function transferAll(address to) public validRecipient(to) nonReentrant returns (bool) {
        uint256 baseUnitValue = _baseUnitBalances[msg.sender];
        uint256 value = baseUnitValue / _baseUnitsPerPublicUnit;

        if (sniperProtection && !_isExcludedFromSniperProtection[to]){
            if (baseUnitValue > maxTransaction) revert MaxTransactionExceeded();
            if ((tx.gasprice - block.basefee) > maxPriorityFee) revert MaxPriorityFeeExceeded();
        }

        delete _baseUnitBalances[msg.sender];
        _baseUnitBalances[to] += baseUnitValue;

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Checks the amount of PublicUnits that an owner has allowed a spender to use on their behalf.
     * This function is part of the ERC20 standard and is used to manage allowances for token transfers.
     *
     * The allowance is denominated in PublicUnits, not BaseUnits, and will always return the remaining
     * amount of PublicUnits the spender can transfer.
     *
     * @param owner_ The address that owns the tokens.
     * @param spender The address that is allowed to spend the tokens.
     * @return The remaining number of PublicUnits that the spender can transfer.
     */
    function allowance(address owner_, address spender) public view override returns (uint256) {
        return _allowedPublicUnits[owner_][spender];
    }

    /**
     * @dev Transfers PublicUnits from one account (`from`) to another (`to`) on behalf of the
     * account holder, provided that the caller has been approved to spend at least `value` PublicUnits.
     * This function adjusts BaseUnit balances internally.
     *
     * @param from The address from which to transfer PublicUnits.
     * @param to The address to which PublicUnits will be transferred.
     * @param value The amount of PublicUnits to be transferred.
     * @return True if the transfer is successful.
     */
    function transferFrom(address from, address to, uint256 value) public override nonReentrant returns (bool) {
        if (_allowedPublicUnits[from][msg.sender] < value) revert InsufficientBalanceError("Allowance");
        _allowedPublicUnits[from][msg.sender] -= value;

        uint256 baseUnitValue = value * _baseUnitsPerPublicUnit;

        if (sniperProtection && !_isExcludedFromSniperProtection[to]){
            if (baseUnitValue > maxTransaction) revert MaxTransactionExceeded();
            if ((tx.gasprice - block.basefee) > maxPriorityFee) revert MaxPriorityFeeExceeded();
        }

        if (_baseUnitBalances[from] < baseUnitValue) revert InsufficientBalanceError("Sender");

        _baseUnitBalances[from] -= baseUnitValue;
        _baseUnitBalances[to] += baseUnitValue;

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Transfers the entire PublicUnit balance from one account to another, using the allowance mechanism.
     * This function transfers all the BaseUnits held by the sender to the recipient and adjusts the 
     * allowance accordingly.
     *
     * Emits a `Transfer` event.
     * 
     * @param from The account from which PublicUnits are being transferred.
     * @param to The recipient of the PublicUnits.
     * @return True if the transfer is successful.
     */
    function transferAllFrom(address from, address to) public validRecipient(to) nonReentrant returns (bool) {
        uint256 senderBalance = balanceOf(from);
        if (_allowedPublicUnits[from][msg.sender] < senderBalance) revert InsufficientBalanceError("Allowance");

        uint256 baseUnitValue = _baseUnitBalances[from];
        uint256 value = baseUnitValue / _baseUnitsPerPublicUnit;

        if (sniperProtection && !_isExcludedFromSniperProtection[to]){
            if (baseUnitValue > maxTransaction) revert MaxTransactionExceeded();
            if ((tx.gasprice - block.basefee) > maxPriorityFee) revert MaxPriorityFeeExceeded();
        }

        _allowedPublicUnits[from][msg.sender] -= value;

        delete _baseUnitBalances[from];
        _baseUnitBalances[to] += baseUnitValue;

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of PublicUnits on behalf of
     * msg.sender. This method is included for ERC20 compatibility.
     * increaseAllowance and decreaseAllowance should be used instead.
     * Changing an allowance with this method brings the risk that someone may transfer both
     * the old and the new allowance—if they are both greater than zero—if a transfer
     * transaction is mined before the later approve() call is mined.
     *
     * @param spender The address which will spend the PublicUnits.
     * @param value The amount of PublicUnits to be spent.
     * @return True if the approval was successful.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        _allowedPublicUnits[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Increases the allowance that `spender` has over the caller's PublicUnits.
     * This is safer than using `approve()` because it prevents the double-spend vulnerability.
     *
     * @param spender The address to which the allowance will be granted.
     * @param addedValue The amount of PublicUnits to add to the allowance.
     * @return True if the operation was successful.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _allowedPublicUnits[msg.sender][spender] += addedValue;

        emit Approval(msg.sender, spender, _allowedPublicUnits[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decreases the allowance that `spender` has over the caller's PublicUnits.
     * This is safer than using `approve()` because it prevents the double-spend vulnerability.
     *
     * @param spender The address for which to decrease the allowance.
     * @param subtractedValue The amount of PublicUnits to subtract from the allowance.
     * @return True if the operation was successful.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        uint256 oldValue = _allowedPublicUnits[msg.sender][spender];
        _allowedPublicUnits[msg.sender][spender] = (subtractedValue >= oldValue)
            ? 0
            : oldValue - subtractedValue;

        emit Approval(msg.sender, spender, _allowedPublicUnits[msg.sender][spender]);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"},{"internalType":"address","name":"_ethPriceFeed","type":"address"},{"internalType":"address","name":"_ethUsdcPair","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"context","type":"string"}],"name":"DivisionByZeroError","type":"error"},{"inputs":[{"internalType":"string","name":"balanceType","type":"string"}],"name":"InsufficientBalanceError","type":"error"},{"inputs":[{"internalType":"string","name":"inputType","type":"string"}],"name":"InvalidInputError","type":"error"},{"inputs":[{"internalType":"string","name":"priceType","type":"string"}],"name":"InvalidPriceError","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"InvalidRecipient","type":"error"},{"inputs":[{"internalType":"bool","name":"launched","type":"bool"}],"name":"LaunchStatus","type":"error"},{"inputs":[],"name":"MaxPriorityFeeExceeded","type":"error"},{"inputs":[],"name":"MaxTransactionExceeded","type":"error"},{"inputs":[],"name":"NoETHToWithdraw","type":"error"},{"inputs":[],"name":"OnlyOwnerAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PriceDifferenceOutOfRange","type":"error"},{"inputs":[],"name":"PriceOutsideAcceptableRange","type":"error"},{"inputs":[],"name":"RebaseTimeLock","type":"error"},{"inputs":[],"name":"ReentrantCall","type":"error"},{"inputs":[],"name":"TranchePriceExceedsCurrentPrice","type":"error"},{"inputs":[],"name":"TrancheSoldOut","type":"error"},{"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":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"LiquidityDeployed","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":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pegValue","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"attemptedTokenAmount","type":"uint256"}],"name":"RewardUnpaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executeAfter","type":"uint256"}],"name":"WithdrawalRequested","type":"event"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"trancheIndex","type":"uint256"},{"internalType":"uint256","name":"maxPriceDifferencePercent","type":"uint256"}],"name":"buyTranche","outputs":[],"stateMutability":"payable","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":[],"name":"deployAndSendLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ethPriceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethUsdcPair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executeWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAvailableTranches","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBoobsPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceFromUniswap","type":"uint256"}],"name":"getBoobsPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"trancheIndex","type":"uint256"}],"name":"getCurrentPriceDifferencePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHPriceFromChainlink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHPriceFromUniswap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialPricePerInitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"uniswapPrice","type":"uint256"},{"internalType":"uint256","name":"chainlinkPrice","type":"uint256"}],"name":"isPriceDifferenceAcceptable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceDifference","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriorityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingETHWithdrawals","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"executeAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingTokenWithdrawals","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"executeAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"priceMultiples","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"paymentRecipient","type":"address"}],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestWithdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"scaledBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaledTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromSniperProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPriceDifference","type":"uint256"}],"name":"setMaxPriceDifference","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardMultiplier","type":"uint256"}],"name":"setRewardMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"successfulRebaseCalls","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSniperProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"trancheSoldBaseUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"trancheSupplyBaseUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferAllFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"uniswapV2Pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526040518060400160405280600781526020017f426f6f6269657300000000000000000000000000000000000000000000000000815250600290816100489190610c2f565b506040518060400160405280600481526020017f424f4f42000000000000000000000000000000000000000000000000000000008152506003908161008d9190610c2f565b50601260045f6101000a81548160ff021916908360ff1602179055506707615602bf0000206009555f600a556003600b555f600c5f6101000a81548160ff021916908315150217905550604051806101800160405280600461ffff168152602001600861ffff168152602001601061ffff168152602001602061ffff168152602001604061ffff168152602001608061ffff16815260200161010061ffff16815260200161020061ffff16815260200161040061ffff16815260200161080061ffff16815260200161100061ffff16815260200161200061ffff16815250600e90600c61017b929190610989565b505f602760016101000a81548160ff021916908315150217905550606469d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101ce9190610d2b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101f99190610d88565b6102039190610dbb565b60295563c4b20100602a5560fa602f5534801561021e575f80fd5b50604051616cb1380380616cb183398181016040528101906102409190610e49565b3360015f819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036102b8575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016102af9190610ea8565b60405180910390fd5b6102c78161079860201b60201c565b5082602b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104169190610ec1565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561049c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c09190610ec1565b6040518363ffffffff1660e01b81526004016104dd929190610eec565b6020604051808303815f875af11580156104f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051d9190610ec1565b602c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555069d3c21bcecceda100000060058190555069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105a39190610d2b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105ce9190610d88565b60075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060055469d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6106489190610d2b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6106739190610d88565b61067d9190610dbb565b6006819055503073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6005546040516106e29190610f22565b60405180910390a36107086106fb61085b60201b60201c565b600161088360201b60201c565b61073a602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161088360201b60201c565b61074b30600161088360201b60201c565b61075e61dead600161088360201b60201c565b610790602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161088360201b60201c565b505050610f3b565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6108916108e960201b60201c565b8060285f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6108f761098260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661091b61085b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146109805761094461098260201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016109779190610ea8565b60405180910390fd5b565b5f33905090565b828054828255905f5260205f209081019282156109c9579160200282015b828111156109c8578251829061ffff169055916020019190600101906109a7565b5b5090506109d691906109da565b5090565b5b808211156109f1575f815f9055506001016109db565b5090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610a7057607f821691505b602082108103610a8357610a82610a2c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610ae57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610aaa565b610aef8683610aaa565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610b33610b2e610b2984610b07565b610b10565b610b07565b9050919050565b5f819050919050565b610b4c83610b19565b610b60610b5882610b3a565b848454610ab6565b825550505050565b5f90565b610b74610b68565b610b7f818484610b43565b505050565b5b81811015610ba257610b975f82610b6c565b600181019050610b85565b5050565b601f821115610be757610bb881610a89565b610bc184610a9b565b81016020851015610bd0578190505b610be4610bdc85610a9b565b830182610b84565b50505b505050565b5f82821c905092915050565b5f610c075f1984600802610bec565b1980831691505092915050565b5f610c1f8383610bf8565b9150826002028217905092915050565b610c38826109f5565b67ffffffffffffffff811115610c5157610c506109ff565b5b610c5b8254610a59565b610c66828285610ba6565b5f60209050601f831160018114610c97575f8415610c85578287015190505b610c8f8582610c14565b865550610cf6565b601f198416610ca586610a89565b5f5b82811015610ccc57848901518255600182019150602085019450602081019050610ca7565b86831015610ce95784890151610ce5601f891682610bf8565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610d3582610b07565b9150610d4083610b07565b925082610d5057610d4f610cfe565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610d9282610b07565b9150610d9d83610b07565b9250828203905081811115610db557610db4610d5b565b5b92915050565b5f610dc582610b07565b9150610dd083610b07565b925082610de057610ddf610cfe565b5b828204905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e1882610def565b9050919050565b610e2881610e0e565b8114610e32575f80fd5b50565b5f81519050610e4381610e1f565b92915050565b5f805f60608486031215610e6057610e5f610deb565b5b5f610e6d86828701610e35565b9350506020610e7e86828701610e35565b9250506040610e8f86828701610e35565b9150509250925092565b610ea281610e0e565b82525050565b5f602082019050610ebb5f830184610e99565b92915050565b5f60208284031215610ed657610ed5610deb565b5b5f610ee384828501610e35565b91505092915050565b5f604082019050610eff5f830185610e99565b610f0c6020830184610e99565b9392505050565b610f1c81610b07565b82525050565b5f602082019050610f355f830184610f13565b92915050565b615d6980610f485f395ff3fe608060405260043610610353575f3560e01c80638091f3bf116101c5578063b1bf962d116100f6578063dd62ed3e11610094578063e55cf5821161006e578063e55cf58214610c66578063e6a06def14610ca2578063f2fde38b14610cde578063fc739af014610d065761035a565b8063dd62ed3e14610bea578063df65f62014610c26578063e0c318a714610c505761035a565b8063c31a6faf116100d0578063c31a6faf14610b34578063c3f70b5214610b5c578063d0df137414610b86578063d13bccfc14610bae5761035a565b8063b1bf962d14610ab6578063b33cccbd14610ae0578063c1159b8a14610b0a5761035a565b806395d89b4111610163578063a3a7e7f31161013d578063a3a7e7f3146109d8578063a457c2d714610a14578063a9059cbb14610a50578063af7665ce14610a8c5761035a565b806395d89b411461094a5780639f77bfca14610974578063a25ac82d146109b05761035a565b806385fd52d11161019f57806385fd52d1146108b25780638bab6f34146108da5780638d187d39146109045780638da5cb5b146109205761035a565b80638091f3bf1461082457806381b320d41461084e57806384d4b410146108765761035a565b80632fbcf0981161029f578063649ac0d51161023d57806370a082311161021757806370a082311461076c578063715018a6146107a85780637944f56b146107be57806380184e12146107fa5761035a565b8063649ac0d51461070257806369ac38fe146107185780636f2c590a146107425761035a565b8063395093511161027957806339509351146106355780634939c9dd1461067157806349bd5a5e1461069b5780634e9beead146106c55761035a565b80632fbcf098146105c4578063313ce567146105ce57806335d77f05146105f85761035a565b806318160ddd1161030c57806323b872dd116102e657806323b872dd146104f8578063265899c21461053457806329ea47211461055e5780632bf769a6146105885761035a565b806318160ddd1461047c5780631923b563146104a65780631da24f3e146104bc5761035a565b80630263030b1461035e57806306fdde0314610388578063095ea7b3146103b25780630bd075a1146103ee5780631365ec66146104165780631694505e146104525761035a565b3661035a57005b5f80fd5b348015610369575f80fd5b50610372610d30565b60405161037f9190614b43565b60405180910390f35b348015610393575f80fd5b5061039c610d36565b6040516103a99190614bcc565b60405180910390f35b3480156103bd575f80fd5b506103d860048036038101906103d39190614c74565b610dc6565b6040516103e59190614ccc565b60405180910390f35b3480156103f9575f80fd5b50610414600480360381019061040f9190614ce5565b610eb3565b005b348015610421575f80fd5b5061043c60048036038101906104379190614d10565b610f0a565b6040516104499190614b43565b60405180910390f35b34801561045d575f80fd5b50610466610f1f565b6040516104739190614d96565b60405180910390f35b348015610487575f80fd5b50610490610f44565b60405161049d9190614b43565b60405180910390f35b3480156104b1575f80fd5b506104ba610f4d565b005b3480156104c7575f80fd5b506104e260048036038101906104dd9190614d10565b611206565b6040516104ef9190614b43565b60405180910390f35b348015610503575f80fd5b5061051e60048036038101906105199190614daf565b61124c565b60405161052b9190614ccc565b60405180910390f35b34801561053f575f80fd5b5061054861163a565b6040516105559190614eb6565b60405180910390f35b348015610569575f80fd5b506105726117a3565b60405161057f9190614b43565b60405180910390f35b348015610593575f80fd5b506105ae60048036038101906105a99190614ce5565b611a71565b6040516105bb9190614b43565b60405180910390f35b6105cc611b67565b005b3480156105d9575f80fd5b506105e26121d9565b6040516105ef9190614ef1565b60405180910390f35b348015610603575f80fd5b5061061e60048036038101906106199190614d10565b6121ee565b60405161062c929190614f0a565b60405180910390f35b348015610640575f80fd5b5061065b60048036038101906106569190614c74565b61220e565b6040516106689190614ccc565b60405180910390f35b34801561067c575f80fd5b50610685612384565b6040516106929190614b43565b60405180910390f35b3480156106a6575f80fd5b506106af612473565b6040516106bc9190614f51565b60405180910390f35b3480156106d0575f80fd5b506106eb60048036038101906106e69190614d10565b612498565b6040516106f9929190614f0a565b60405180910390f35b34801561070d575f80fd5b506107166124b8565b005b348015610723575f80fd5b5061072c61268e565b6040516107399190614b43565b60405180910390f35b34801561074d575f80fd5b50610756612694565b6040516107639190614b43565b60405180910390f35b348015610777575f80fd5b50610792600480360381019061078d9190614d10565b61269a565b60405161079f9190614b43565b60405180910390f35b3480156107b3575f80fd5b506107bc6126ed565b005b3480156107c9575f80fd5b506107e460048036038101906107df9190614ce5565b612700565b6040516107f19190614b43565b60405180910390f35b348015610805575f80fd5b5061080e612780565b60405161081b9190614b43565b60405180910390f35b34801561082f575f80fd5b50610838612786565b6040516108459190614ccc565b60405180910390f35b348015610859575f80fd5b50610874600480360381019061086f9190614ce5565b612798565b005b348015610881575f80fd5b5061089c60048036038101906108979190614f6a565b61294a565b6040516108a99190614ccc565b60405180910390f35b3480156108bd575f80fd5b506108d860048036038101906108d39190614ce5565b612d65565b005b3480156108e5575f80fd5b506108ee612d77565b6040516108fb9190614f51565b60405180910390f35b61091e60048036038101906109199190614fa8565b612d9c565b005b34801561092b575f80fd5b506109346134be565b6040516109419190614ff5565b60405180910390f35b348015610955575f80fd5b5061095e6134e6565b60405161096b9190614bcc565b60405180910390f35b34801561097f575f80fd5b5061099a60048036038101906109959190614ce5565b613576565b6040516109a79190614b43565b60405180910390f35b3480156109bb575f80fd5b506109d660048036038101906109d19190614ce5565b613596565b005b3480156109e3575f80fd5b506109fe60048036038101906109f99190614d10565b6136ae565b604051610a0b9190614ccc565b60405180910390f35b348015610a1f575f80fd5b50610a3a6004803603810190610a359190614c74565b613972565b604051610a479190614ccc565b60405180910390f35b348015610a5b575f80fd5b50610a766004803603810190610a719190614c74565b613b6e565b604051610a839190614ccc565b60405180910390f35b348015610a97575f80fd5b50610aa0613e04565b604051610aad919061502e565b60405180910390f35b348015610ac1575f80fd5b50610aca613e29565b604051610ad79190614b43565b60405180910390f35b348015610aeb575f80fd5b50610af4613e90565b604051610b019190614b43565b60405180910390f35b348015610b15575f80fd5b50610b1e613e96565b604051610b2b9190614b43565b60405180910390f35b348015610b3f575f80fd5b50610b5a6004803603810190610b559190615071565b6140cd565b005b348015610b67575f80fd5b50610b7061412d565b604051610b7d9190614b43565b60405180910390f35b348015610b91575f80fd5b50610bac6004803603810190610ba79190614d10565b614133565b005b348015610bb9575f80fd5b50610bd46004803603810190610bcf9190614ce5565b6144a5565b604051610be19190614b43565b60405180910390f35b348015610bf5575f80fd5b50610c106004803603810190610c0b9190614f6a565b6144be565b604051610c1d9190614b43565b60405180910390f35b348015610c31575f80fd5b50610c3a614540565b604051610c479190614b43565b60405180910390f35b348015610c5b575f80fd5b50610c64614546565b005b348015610c71575f80fd5b50610c8c6004803603810190610c879190614ce5565b61457a565b604051610c999190614b43565b60405180910390f35b348015610cad575f80fd5b50610cc86004803603810190610cc39190614fa8565b614593565b604051610cd59190614ccc565b60405180910390f35b348015610ce9575f80fd5b50610d046004803603810190610cff9190614d10565b6145fe565b005b348015610d11575f80fd5b50610d1a614682565b604051610d279190614ccc565b60405180910390f35b600b5481565b606060028054610d45906150dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d71906150dc565b8015610dbc5780601f10610d9357610100808354040283529160200191610dbc565b820191905f5260205f20905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ea19190614b43565b60405180910390a36001905092915050565b610ebb614695565b6103e8811115610f00576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401610ef790615156565b60405180910390fd5b80602f8190555050565b6030602052805f5260405f205f915090505481565b602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600554905090565b610f55614695565b610f5d61471c565b5f60325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103610ff7576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060200151421015611035576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055505f600654825f015161108b91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546110d991906151e2565b925050819055508060075f6110ec6134be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111339190615215565b925050819055506111426134be565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef845f01516040516111a19190614b43565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1131c2afe9ce72c59360d085f89bfdd088fcf4a3c93eec6cc5ff42f5d6b0801f835f01516040516111f29190614b43565b60405180910390a25050611204614769565b565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f61125561471c565b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611310576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161130790615292565b60405180910390fd5b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461139791906151e2565b925050819055505f600654836113ad91906151a1565b9050602760019054906101000a900460ff168015611412575060285f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561149b57602954811115611453576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a61146291906151e2565b111561149a576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561151b576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611512906152fa565b60405180910390fd5b8060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461156791906151e2565b925050819055508060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546115ba9190615215565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161161e9190614b43565b60405180910390a36001915050611633614769565b9392505050565b60605f600e8054905067ffffffffffffffff81111561165c5761165b615318565b5b60405190808252806020026020018201604052801561168a5781602001602082028036833780820191505090505b5090505f69d3c21bcecceda10000006116a1610f44565b6116a9613e96565b6116b391906151a1565b6116bd9190615372565b90505f5b600e8054905081101561179a575f600e82815481106116e3576116e26153a2565b5b905f5260205f200154600d546116f991906151a1565b90508083101580156117345750600f82600c811061171a576117196153a2565b5b0154601b83600c81106117305761172f6153a2565b5b0154105b1561176557600184838151811061174e5761174d6153a2565b5b60200260200101901515908115158152505061178c565b5f848381518110611779576117786153a2565b5b6020026020010190151590811515815250505b5080806001019150506116c1565b50819250505090565b5f80602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611814573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611838919061544b565b50915091505f826dffffffffffffffffffffffffffff16148061186a57505f816dffffffffffffffffffffffffffff16145b156118aa576040517f343401390000000000000000000000000000000000000000000000000000000081526004016118a1906154e5565b60405180910390fd5b602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611914573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119389190615517565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bb9190615517565b73ffffffffffffffffffffffffffffffffffffffff1603611a2457816dffffffffffffffffffffffffffff166c0c9f2c9cd04674edea40000000826dffffffffffffffffffffffffffff16611a1091906151a1565b611a1a9190615372565b9350505050611a6e565b806dffffffffffffffffffffffffffff166c0c9f2c9cd04674edea40000000836dffffffffffffffffffffffffffff16611a5e91906151a1565b611a689190615372565b93505050505b90565b5f600e805490508210611ab9576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401611ab09061558c565b60405180910390fd5b5f611ac2613e96565b90505f600e8481548110611ad957611ad86153a2565b5b905f5260205f200154600d54611aef91906151a1565b90505f611afa610f44565b69d3c21bcecceda100000083611b1091906151a1565b611b1a9190615372565b9050808311611b2e575f9350505050611b62565b5f8184611b3b91906151e2565b90505f8261271083611b4d91906151a1565b611b579190615372565b905080955050505050505b919050565b611b6f614695565b600c5f9054906101000a900460ff1615611bce57600c5f9054906101000a900460ff166040517f0df1a3a1000000000000000000000000000000000000000000000000000000008152600401611bc59190614ccc565b60405180910390fd5b5f3403611c10576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611c07906155f4565b60405180910390fd5b5f3490505f60055490505f6103e8601983611c2b91906151a1565b611c359190615372565b90505f6103e86102d584611c4991906151a1565b611c539190615372565b90505f818385611c6391906151e2565b611c6d91906151e2565b90505f60065484611c7e91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ccc91906151e2565b925050819055508060075f611cdf6134be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d269190615215565b92505081905550611d356134be565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d919190614b43565b60405180910390a381611da33061269a565b1015611de4576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611ddb9061565c565b60405180910390fd5b8160085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198730855f80611ecc6134be565b426040518863ffffffff1660e01b8152600401611eee969594939291906156b3565b60606040518083038185885af1158015611f0a573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611f2f9190615726565b50505081670de0b6b3a764000087611f4791906151a1565b611f519190615372565b600d819055505f6101f461271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611f949190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611fbf91906151e2565b611fc99190615372565b611fd391906151a1565b90505f60fa61271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6120119190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61203c91906151e2565b6120469190615372565b61205091906151a1565b90505f607d61271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61208e9190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6120b991906151e2565b6120c39190615372565b6120cd91906151a1565b90505f5b600e805490508110156121575760048110156121065783600f82600c81106120fc576120fb6153a2565b5b018190555061214a565b600881101561212e5782600f82600c8110612124576121236153a2565b5b0181905550612149565b81600f82600c8110612143576121426153a2565b5b01819055505b5b80806001019150506120d1565b506001600c5f6101000a81548160ff0219169083151502179055507f944842efc7ccc582eafec3351b838ed21e5aed8afabc94fb83a6b18b052697a4602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868b6040516121c6939291906157a6565b60405180910390a1505050505050505050565b5f60045f9054906101000a900460ff16905090565b6032602052805f5260405f205f91509050805f0154908060010154905082565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546122969190615215565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516123729190614b43565b60405180910390a36001905092915050565b5f80602e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156123f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612414919061584d565b5050509150505f811361245c576040517f5388fae60000000000000000000000000000000000000000000000000000000081526004016124539061590e565b60405180910390fd5b6402540be4008161246d91906151a1565b91505090565b602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6031602052805f5260405f205f91509050805f0154908060010154905082565b6124c0614695565b6124c861471c565b5f60315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103612562576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001514210156125a0576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055506125ec6134be565b73ffffffffffffffffffffffffffffffffffffffff166108fc825f015190811502906040515f60405180830381858888f19350505050158015612631573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff167f1131c2afe9ce72c59360d085f89bfdd088fcf4a3c93eec6cc5ff42f5d6b0801f825f015160405161267b9190614b43565b60405180910390a25061268c614769565b565b60095481565b602f5481565b5f60065460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546126e69190615372565b9050919050565b6126f5614695565b6126fe5f614772565b565b5f8061270a613e96565b90505f81148061271957505f83145b15612759576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161275090615976565b60405180910390fd5b670de0b6b3a7640000838261276e91906151a1565b6127789190615372565b915050919050565b602a5481565b600c5f9054906101000a900460ff1681565b6127a0614695565b5f81036127e2576040517f616f22ce0000000000000000000000000000000000000000000000000000000081526004016127d9906159de565b60405180910390fd5b5f600654826127f191906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612873576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161286a90615a46565b60405180910390fd5b604051806040016040528083815260200162015180426128939190615215565b81525060325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050503373ffffffffffffffffffffffffffffffffffffffff167f24b91f4f47caf44230a57777a9be744924e82bf666f2d5702faf97df35e60f9f8362015180426129309190615215565b60405161293e929190614f0a565b60405180910390a25050565b5f815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129bc57806040517f17858bbe0000000000000000000000000000000000000000000000000000000081526004016129b39190614ff5565b60405180910390fd5b6129c461471c565b5f6129ce8561269a565b90508060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612a8b576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401612a8290615292565b60405180910390fd5b5f60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065482612adb9190615372565b9050602760019054906101000a900460ff168015612b40575060285f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612bc957602954821115612b81576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a612b9091906151e2565b1115612bc8576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612c5091906151e2565b9250508190555060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558160075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ce39190615215565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612d479190614b43565b60405180910390a360019450505050612d5e614769565b5092915050565b612d6d614695565b80600b8190555050565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60275f9054906101000a900460ff1615612de2576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160275f6101000a81548160ff0219169083151502179055505f3403612e3e576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401612e3590615aae565b60405180910390fd5b600c5f9054906101000a900460ff16612e9c57600c5f9054906101000a900460ff166040517f0df1a3a1000000000000000000000000000000000000000000000000000000008152600401612e939190614ccc565b60405180910390fd5b600e805490508210612ee3576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401612eda9061558c565b60405180910390fd5b6064811015612f27576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401612f1e90615b16565b60405180910390fd5b5f612f30613e96565b90505f600e8481548110612f4757612f466153a2565b5b905f5260205f200154600d54612f5d91906151a1565b90505f612f68610f44565b69d3c21bcecceda100000083612f7e91906151a1565b612f889190615372565b905080831015612fc4576040517faa2908f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108482612fd391906151a1565b612fdd9190615372565b81612fe89190615215565b831115613021576040517f5d972b8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601b86600c8110613036576130356153a2565b5b0154600f87600c811061304c5761304b6153a2565b5b015461305891906151e2565b90505f8103613093576040517fdf8e376800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84670de0b6b3a7640000346130a991906151a1565b6130b39190615372565b90505f600654826130c491906151a1565b9050828111156130e257829050600654816130df9190615372565b91505b5f670de0b6b3a764000087846130f891906151a1565b6131029190615372565b90508160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015613184576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161317b90615a46565b60405180910390fd5b8160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131d091906151e2565b925050819055508160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132239190615215565b9250508190555081601b8a600c811061323f5761323e6153a2565b5b015f82825461324e9190615215565b92505081905550348110156132ad573373ffffffffffffffffffffffffffffffffffffffff166108fc823461328391906151e2565b90811502906040515f60405180830381858888f193505050501580156132ab573d5f803e3d5ffd5b505b8260085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f6064605f8561335b91906151a1565b6133659190615372565b90505f6064605f8461337791906151a1565b6133819190615372565b9050602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71984308886866133cd6134be565b426040518863ffffffff1660e01b81526004016133ef96959493929190615b34565b60606040518083038185885af115801561340b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906134309190615726565b5050503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516134909190614b43565b60405180910390a35050505050505050505f60275f6101000a81548160ff0219169083151502179055505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546134f5906150dc565b80601f0160208091040260200160405190810160405280929190818152602001828054613521906150dc565b801561356c5780601f106135435761010080835404028352916020019161356c565b820191905f5260205f20905b81548152906001019060200180831161354f57829003601f168201915b5050505050905090565b600e8181548110613585575f80fd5b905f5260205f20015f915090505481565b61359e614695565b478111156135d8576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528082815260200162015180426135f89190615215565b81525060315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050503373ffffffffffffffffffffffffffffffffffffffff167f24b91f4f47caf44230a57777a9be744924e82bf666f2d5702faf97df35e60f9f8262015180426136959190615215565b6040516136a3929190614f0a565b60405180910390a250565b5f815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361372057806040517f17858bbe0000000000000000000000000000000000000000000000000000000081526004016137179190614ff5565b60405180910390fd5b61372861471c565b5f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600654826137789190615372565b9050602760019054906101000a900460ff1680156137dd575060285f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156138665760295482111561381e576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a61382d91906151e2565b1115613865576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558160075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546138f29190615215565b925050819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516139569190614b43565b60405180910390a360019350505061396c614769565b50919050565b5f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080831015613a08578281613a0391906151e2565b613a0a565b5f5b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051613b5b9190614b43565b60405180910390a3600191505092915050565b5f825f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613be057806040517f17858bbe000000000000000000000000000000000000000000000000000000008152600401613bd79190614ff5565b60405180910390fd5b613be861471c565b5f60065484613bf791906151a1565b9050602760019054906101000a900460ff168015613c5c575060285f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613ce557602954811115613c9d576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a613cac91906151e2565b1115613ce4576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613d3191906151e2565b925050819055508060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613d849190615215565b925050819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051613de89190614b43565b60405180910390a36001925050613dfd614769565b5092915050565b602e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f69d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e609190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e8b91906151e2565b905090565b600a5481565b5f80602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613f07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2b919061544b565b50915091505f826dffffffffffffffffffffffffffff161480613f5d57505f816dffffffffffffffffffffffffffff16145b15613f9d576040517f34340139000000000000000000000000000000000000000000000000000000008152600401613f9490615bdd565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ffd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140219190615517565b73ffffffffffffffffffffffffffffffffffffffff160361408557816dffffffffffffffffffffffffffff16670de0b6b3a7640000826dffffffffffffffffffffffffffff1661407191906151a1565b61407b9190615372565b93505050506140ca565b806dffffffffffffffffffffffffffff16670de0b6b3a7640000836dffffffffffffffffffffffffffff166140ba91906151a1565b6140c49190615372565b93505050505b90565b6140d5614695565b8060285f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60295481565b61413b61471c565b61012c600a5461414b9190615215565b431015614184576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036141bb573390505b5f5a90506141c7614835565b600160305f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546142149190615215565b925050819055505f602f541115614499575f61422e613e96565b90505f8103614272576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161426990615c45565b60405180910390fd5b5f5a8361427f91906151e2565b90505f488261428e91906151a1565b90505f6064602f546359682f00846142a69190615215565b6142b091906151a1565b6142ba9190615372565b90505f84670de0b6b3a7640000836142d291906151a1565b6142dc9190615372565b90505f600654826142ed91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410614443578060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461437f91906151e2565b925050819055508060075f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546143d29190615215565b925050819055508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516144369190614b43565b60405180910390a3614492565b8773ffffffffffffffffffffffffffffffffffffffff167f19ffbfce3b9efe21d4eae606f544cbb1e680c3539b8c51804583068a042e2a05836040516144899190614b43565b60405180910390a25b5050505050505b506144a2614769565b50565b600f81600c81106144b4575f80fd5b015f915090505481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600d5481565b61454e614695565b602760019054906101000a900460ff1615602760016101000a81548160ff021916908315150217905550565b601b81600c8110614589575f80fd5b015f915090505481565b5f808284116145ad5783836145a891906151e2565b6145ba565b82846145b991906151e2565b5b90505f600284866145cb9190615215565b6145d59190615372565b6064836145e291906151a1565b6145ec9190615372565b9050600b548111159250505092915050565b614606614695565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614676575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161466d9190614ff5565b60405180910390fd5b61467f81614772565b50565b602760019054906101000a900460ff1681565b61469d614b24565b73ffffffffffffffffffffffffffffffffffffffff166146bb6134be565b73ffffffffffffffffffffffffffffffffffffffff161461471a576146de614b24565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016147119190614ff5565b60405180910390fd5b565b60025f5403614760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161475790615cad565b60405180910390fd5b60025f81905550565b60015f81905550565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61483e612384565b90505f6148496117a3565b90505f82148061485857505f81145b15614898576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161488f906155f4565b60405180910390fd5b6148a28183614593565b6148d8576040517fc7489d4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6148e282612700565b90505f8103614926576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161491d90615d15565b60405180910390fd5b5f600954670de0b6b3a76400008361493e91906151a1565b6149489190615372565b90505f670de0b6b3a76400006005548361496291906151a1565b61496c9190615372565b90506a09ed194db19b238c0000008111156149aa57600a8161498e9190615372565b9050600a60095461499f91906151a1565b6009819055506149e2565b69a968163f0a57b40000008110156149e157600a816149c991906151a1565b9050600a6009546149da9190615372565b6009819055505b5b8060058190555060055469d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614a229190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614a4d91906151e2565b614a579190615372565b60068190555043600a819055507f11c6bf55864ff83827df712625d7a80e5583eef0264921025e7cd22003a21511600554600954604051614a99929190614f0a565b60405180910390a1602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b07575f80fd5b505af1158015614b19573d5f803e3d5ffd5b505050505050505050565b5f33905090565b5f819050919050565b614b3d81614b2b565b82525050565b5f602082019050614b565f830184614b34565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f614b9e82614b5c565b614ba88185614b66565b9350614bb8818560208601614b76565b614bc181614b84565b840191505092915050565b5f6020820190508181035f830152614be48184614b94565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614c1982614bf0565b9050919050565b614c2981614c0f565b8114614c33575f80fd5b50565b5f81359050614c4481614c20565b92915050565b614c5381614b2b565b8114614c5d575f80fd5b50565b5f81359050614c6e81614c4a565b92915050565b5f8060408385031215614c8a57614c89614bec565b5b5f614c9785828601614c36565b9250506020614ca885828601614c60565b9150509250929050565b5f8115159050919050565b614cc681614cb2565b82525050565b5f602082019050614cdf5f830184614cbd565b92915050565b5f60208284031215614cfa57614cf9614bec565b5b5f614d0784828501614c60565b91505092915050565b5f60208284031215614d2557614d24614bec565b5b5f614d3284828501614c36565b91505092915050565b5f819050919050565b5f614d5e614d59614d5484614bf0565b614d3b565b614bf0565b9050919050565b5f614d6f82614d44565b9050919050565b5f614d8082614d65565b9050919050565b614d9081614d76565b82525050565b5f602082019050614da95f830184614d87565b92915050565b5f805f60608486031215614dc657614dc5614bec565b5b5f614dd386828701614c36565b9350506020614de486828701614c36565b9250506040614df586828701614c60565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614e3181614cb2565b82525050565b5f614e428383614e28565b60208301905092915050565b5f602082019050919050565b5f614e6482614dff565b614e6e8185614e09565b9350614e7983614e19565b805f5b83811015614ea9578151614e908882614e37565b9750614e9b83614e4e565b925050600181019050614e7c565b5085935050505092915050565b5f6020820190508181035f830152614ece8184614e5a565b905092915050565b5f60ff82169050919050565b614eeb81614ed6565b82525050565b5f602082019050614f045f830184614ee2565b92915050565b5f604082019050614f1d5f830185614b34565b614f2a6020830184614b34565b9392505050565b5f614f3b82614d65565b9050919050565b614f4b81614f31565b82525050565b5f602082019050614f645f830184614f42565b92915050565b5f8060408385031215614f8057614f7f614bec565b5b5f614f8d85828601614c36565b9250506020614f9e85828601614c36565b9150509250929050565b5f8060408385031215614fbe57614fbd614bec565b5b5f614fcb85828601614c60565b9250506020614fdc85828601614c60565b9150509250929050565b614fef81614c0f565b82525050565b5f6020820190506150085f830184614fe6565b92915050565b5f61501882614d65565b9050919050565b6150288161500e565b82525050565b5f6020820190506150415f83018461501f565b92915050565b61505081614cb2565b811461505a575f80fd5b50565b5f8135905061506b81615047565b92915050565b5f806040838503121561508757615086614bec565b5b5f61509485828601614c36565b92505060206150a58582860161505d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806150f357607f821691505b602082108103615106576151056150af565b5b50919050565b7f526577617264206d756c7469706c6965720000000000000000000000000000005f82015250565b5f615140601183614b66565b915061514b8261510c565b602082019050919050565b5f6020820190508181035f83015261516d81615134565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6151ab82614b2b565b91506151b683614b2b565b92508282026151c481614b2b565b915082820484148315176151db576151da615174565b5b5092915050565b5f6151ec82614b2b565b91506151f783614b2b565b925082820390508181111561520f5761520e615174565b5b92915050565b5f61521f82614b2b565b915061522a83614b2b565b925082820190508082111561524257615241615174565b5b92915050565b7f416c6c6f77616e636500000000000000000000000000000000000000000000005f82015250565b5f61527c600983614b66565b915061528782615248565b602082019050919050565b5f6020820190508181035f8301526152a981615270565b9050919050565b7f53656e64657200000000000000000000000000000000000000000000000000005f82015250565b5f6152e4600683614b66565b91506152ef826152b0565b602082019050919050565b5f6020820190508181035f830152615311816152d8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61537c82614b2b565b915061538783614b2b565b92508261539757615396615345565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6dffffffffffffffffffffffffffff82169050919050565b6153f1816153cf565b81146153fb575f80fd5b50565b5f8151905061540c816153e8565b92915050565b5f63ffffffff82169050919050565b61542a81615412565b8114615434575f80fd5b50565b5f8151905061544581615421565b92915050565b5f805f6060848603121561546257615461614bec565b5b5f61546f868287016153fe565b9350506020615480868287016153fe565b925050604061549186828701615437565b9150509250925092565b7f4554482f555344432072657365727665730000000000000000000000000000005f82015250565b5f6154cf601183614b66565b91506154da8261549b565b602082019050919050565b5f6020820190508181035f8301526154fc816154c3565b9050919050565b5f8151905061551181614c20565b92915050565b5f6020828403121561552c5761552b614bec565b5b5f61553984828501615503565b91505092915050565b7f5472616e63686520696e646578000000000000000000000000000000000000005f82015250565b5f615576600d83614b66565b915061558182615542565b602082019050919050565b5f6020820190508181035f8301526155a38161556a565b9050919050565b7f45544800000000000000000000000000000000000000000000000000000000005f82015250565b5f6155de600383614b66565b91506155e9826155aa565b602082019050919050565b5f6020820190508181035f83015261560b816155d2565b9050919050565b7f546f6b656e2062616c616e636520666f72206c697175696469747900000000005f82015250565b5f615646601b83614b66565b915061565182615612565b602082019050919050565b5f6020820190508181035f8301526156738161563a565b9050919050565b5f819050919050565b5f61569d6156986156938461567a565b614d3b565b614b2b565b9050919050565b6156ad81615683565b82525050565b5f60c0820190506156c65f830189614fe6565b6156d36020830188614b34565b6156e060408301876156a4565b6156ed60608301866156a4565b6156fa6080830185614fe6565b61570760a0830184614b34565b979650505050505050565b5f8151905061572081614c4a565b92915050565b5f805f6060848603121561573d5761573c614bec565b5b5f61574a86828701615712565b935050602061575b86828701615712565b925050604061576c86828701615712565b9150509250925092565b5f61578082614b2b565b915061578b83614b2b565b92508261579b5761579a615345565b5b828206905092915050565b5f6060820190506157b95f830186614fe6565b6157c66020830185614b34565b6157d36040830184614b34565b949350505050565b5f69ffffffffffffffffffff82169050919050565b6157f9816157db565b8114615803575f80fd5b50565b5f81519050615814816157f0565b92915050565b5f819050919050565b61582c8161581a565b8114615836575f80fd5b50565b5f8151905061584781615823565b92915050565b5f805f805f60a0868803121561586657615865614bec565b5b5f61587388828901615806565b955050602061588488828901615839565b945050604061589588828901615712565b93505060606158a688828901615712565b92505060806158b788828901615806565b9150509295509295909350565b7f4554482066726f6d20436861696e6c696e6b00000000000000000000000000005f82015250565b5f6158f8601283614b66565b9150615903826158c4565b602082019050919050565b5f6020820190508181035f830152615925816158ec565b9050919050565b7f424f4f42532f455448206f72204554482f5553440000000000000000000000005f82015250565b5f615960601483614b66565b915061596b8261592c565b602082019050919050565b5f6020820190508181035f83015261598d81615954565b9050919050565b7f576974686472617720616d6f756e7400000000000000000000000000000000005f82015250565b5f6159c8600f83614b66565b91506159d382615994565b602082019050919050565b5f6020820190508181035f8301526159f5816159bc565b9050919050565b7f546f6b656e2062616c616e6365000000000000000000000000000000000000005f82015250565b5f615a30600d83614b66565b9150615a3b826159fc565b602082019050919050565b5f6020820190508181035f830152615a5d81615a24565b9050919050565b7f4554482073656e740000000000000000000000000000000000000000000000005f82015250565b5f615a98600883614b66565b9150615aa382615a64565b602082019050919050565b5f6020820190508181035f830152615ac581615a8c565b9050919050565b7f4d617820707269636520646966666572656e63650000000000000000000000005f82015250565b5f615b00601483614b66565b9150615b0b82615acc565b602082019050919050565b5f6020820190508181035f830152615b2d81615af4565b9050919050565b5f60c082019050615b475f830189614fe6565b615b546020830188614b34565b615b616040830187614b34565b615b6e6060830186614b34565b615b7b6080830185614fe6565b615b8860a0830184614b34565b979650505050505050565b7f424f4f42532f45544820726573657276657300000000000000000000000000005f82015250565b5f615bc7601283614b66565b9150615bd282615b93565b602082019050919050565b5f6020820190508181035f830152615bf481615bbb565b9050919050565b7f424f4f42532f45544800000000000000000000000000000000000000000000005f82015250565b5f615c2f600983614b66565b9150615c3a82615bfb565b602082019050919050565b5f6020820190508181035f830152615c5c81615c23565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615c97601f83614b66565b9150615ca282615c63565b602082019050919050565b5f6020820190508181035f830152615cc481615c8b565b9050919050565b7f424f4f42532f55534400000000000000000000000000000000000000000000005f82015250565b5f615cff600983614b66565b9150615d0a82615ccb565b602082019050919050565b5f6020820190508181035f830152615d2c81615cf3565b905091905056fea264697066735822122096faa941e28b5b1473bf7633cdeb1f21a7c70d641d69a702bacc8bf1be125af364736f6c634300081a00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc

Deployed Bytecode

0x608060405260043610610353575f3560e01c80638091f3bf116101c5578063b1bf962d116100f6578063dd62ed3e11610094578063e55cf5821161006e578063e55cf58214610c66578063e6a06def14610ca2578063f2fde38b14610cde578063fc739af014610d065761035a565b8063dd62ed3e14610bea578063df65f62014610c26578063e0c318a714610c505761035a565b8063c31a6faf116100d0578063c31a6faf14610b34578063c3f70b5214610b5c578063d0df137414610b86578063d13bccfc14610bae5761035a565b8063b1bf962d14610ab6578063b33cccbd14610ae0578063c1159b8a14610b0a5761035a565b806395d89b4111610163578063a3a7e7f31161013d578063a3a7e7f3146109d8578063a457c2d714610a14578063a9059cbb14610a50578063af7665ce14610a8c5761035a565b806395d89b411461094a5780639f77bfca14610974578063a25ac82d146109b05761035a565b806385fd52d11161019f57806385fd52d1146108b25780638bab6f34146108da5780638d187d39146109045780638da5cb5b146109205761035a565b80638091f3bf1461082457806381b320d41461084e57806384d4b410146108765761035a565b80632fbcf0981161029f578063649ac0d51161023d57806370a082311161021757806370a082311461076c578063715018a6146107a85780637944f56b146107be57806380184e12146107fa5761035a565b8063649ac0d51461070257806369ac38fe146107185780636f2c590a146107425761035a565b8063395093511161027957806339509351146106355780634939c9dd1461067157806349bd5a5e1461069b5780634e9beead146106c55761035a565b80632fbcf098146105c4578063313ce567146105ce57806335d77f05146105f85761035a565b806318160ddd1161030c57806323b872dd116102e657806323b872dd146104f8578063265899c21461053457806329ea47211461055e5780632bf769a6146105885761035a565b806318160ddd1461047c5780631923b563146104a65780631da24f3e146104bc5761035a565b80630263030b1461035e57806306fdde0314610388578063095ea7b3146103b25780630bd075a1146103ee5780631365ec66146104165780631694505e146104525761035a565b3661035a57005b5f80fd5b348015610369575f80fd5b50610372610d30565b60405161037f9190614b43565b60405180910390f35b348015610393575f80fd5b5061039c610d36565b6040516103a99190614bcc565b60405180910390f35b3480156103bd575f80fd5b506103d860048036038101906103d39190614c74565b610dc6565b6040516103e59190614ccc565b60405180910390f35b3480156103f9575f80fd5b50610414600480360381019061040f9190614ce5565b610eb3565b005b348015610421575f80fd5b5061043c60048036038101906104379190614d10565b610f0a565b6040516104499190614b43565b60405180910390f35b34801561045d575f80fd5b50610466610f1f565b6040516104739190614d96565b60405180910390f35b348015610487575f80fd5b50610490610f44565b60405161049d9190614b43565b60405180910390f35b3480156104b1575f80fd5b506104ba610f4d565b005b3480156104c7575f80fd5b506104e260048036038101906104dd9190614d10565b611206565b6040516104ef9190614b43565b60405180910390f35b348015610503575f80fd5b5061051e60048036038101906105199190614daf565b61124c565b60405161052b9190614ccc565b60405180910390f35b34801561053f575f80fd5b5061054861163a565b6040516105559190614eb6565b60405180910390f35b348015610569575f80fd5b506105726117a3565b60405161057f9190614b43565b60405180910390f35b348015610593575f80fd5b506105ae60048036038101906105a99190614ce5565b611a71565b6040516105bb9190614b43565b60405180910390f35b6105cc611b67565b005b3480156105d9575f80fd5b506105e26121d9565b6040516105ef9190614ef1565b60405180910390f35b348015610603575f80fd5b5061061e60048036038101906106199190614d10565b6121ee565b60405161062c929190614f0a565b60405180910390f35b348015610640575f80fd5b5061065b60048036038101906106569190614c74565b61220e565b6040516106689190614ccc565b60405180910390f35b34801561067c575f80fd5b50610685612384565b6040516106929190614b43565b60405180910390f35b3480156106a6575f80fd5b506106af612473565b6040516106bc9190614f51565b60405180910390f35b3480156106d0575f80fd5b506106eb60048036038101906106e69190614d10565b612498565b6040516106f9929190614f0a565b60405180910390f35b34801561070d575f80fd5b506107166124b8565b005b348015610723575f80fd5b5061072c61268e565b6040516107399190614b43565b60405180910390f35b34801561074d575f80fd5b50610756612694565b6040516107639190614b43565b60405180910390f35b348015610777575f80fd5b50610792600480360381019061078d9190614d10565b61269a565b60405161079f9190614b43565b60405180910390f35b3480156107b3575f80fd5b506107bc6126ed565b005b3480156107c9575f80fd5b506107e460048036038101906107df9190614ce5565b612700565b6040516107f19190614b43565b60405180910390f35b348015610805575f80fd5b5061080e612780565b60405161081b9190614b43565b60405180910390f35b34801561082f575f80fd5b50610838612786565b6040516108459190614ccc565b60405180910390f35b348015610859575f80fd5b50610874600480360381019061086f9190614ce5565b612798565b005b348015610881575f80fd5b5061089c60048036038101906108979190614f6a565b61294a565b6040516108a99190614ccc565b60405180910390f35b3480156108bd575f80fd5b506108d860048036038101906108d39190614ce5565b612d65565b005b3480156108e5575f80fd5b506108ee612d77565b6040516108fb9190614f51565b60405180910390f35b61091e60048036038101906109199190614fa8565b612d9c565b005b34801561092b575f80fd5b506109346134be565b6040516109419190614ff5565b60405180910390f35b348015610955575f80fd5b5061095e6134e6565b60405161096b9190614bcc565b60405180910390f35b34801561097f575f80fd5b5061099a60048036038101906109959190614ce5565b613576565b6040516109a79190614b43565b60405180910390f35b3480156109bb575f80fd5b506109d660048036038101906109d19190614ce5565b613596565b005b3480156109e3575f80fd5b506109fe60048036038101906109f99190614d10565b6136ae565b604051610a0b9190614ccc565b60405180910390f35b348015610a1f575f80fd5b50610a3a6004803603810190610a359190614c74565b613972565b604051610a479190614ccc565b60405180910390f35b348015610a5b575f80fd5b50610a766004803603810190610a719190614c74565b613b6e565b604051610a839190614ccc565b60405180910390f35b348015610a97575f80fd5b50610aa0613e04565b604051610aad919061502e565b60405180910390f35b348015610ac1575f80fd5b50610aca613e29565b604051610ad79190614b43565b60405180910390f35b348015610aeb575f80fd5b50610af4613e90565b604051610b019190614b43565b60405180910390f35b348015610b15575f80fd5b50610b1e613e96565b604051610b2b9190614b43565b60405180910390f35b348015610b3f575f80fd5b50610b5a6004803603810190610b559190615071565b6140cd565b005b348015610b67575f80fd5b50610b7061412d565b604051610b7d9190614b43565b60405180910390f35b348015610b91575f80fd5b50610bac6004803603810190610ba79190614d10565b614133565b005b348015610bb9575f80fd5b50610bd46004803603810190610bcf9190614ce5565b6144a5565b604051610be19190614b43565b60405180910390f35b348015610bf5575f80fd5b50610c106004803603810190610c0b9190614f6a565b6144be565b604051610c1d9190614b43565b60405180910390f35b348015610c31575f80fd5b50610c3a614540565b604051610c479190614b43565b60405180910390f35b348015610c5b575f80fd5b50610c64614546565b005b348015610c71575f80fd5b50610c8c6004803603810190610c879190614ce5565b61457a565b604051610c999190614b43565b60405180910390f35b348015610cad575f80fd5b50610cc86004803603810190610cc39190614fa8565b614593565b604051610cd59190614ccc565b60405180910390f35b348015610ce9575f80fd5b50610d046004803603810190610cff9190614d10565b6145fe565b005b348015610d11575f80fd5b50610d1a614682565b604051610d279190614ccc565b60405180910390f35b600b5481565b606060028054610d45906150dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d71906150dc565b8015610dbc5780601f10610d9357610100808354040283529160200191610dbc565b820191905f5260205f20905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ea19190614b43565b60405180910390a36001905092915050565b610ebb614695565b6103e8811115610f00576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401610ef790615156565b60405180910390fd5b80602f8190555050565b6030602052805f5260405f205f915090505481565b602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600554905090565b610f55614695565b610f5d61471c565b5f60325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103610ff7576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060200151421015611035576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055505f600654825f015161108b91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546110d991906151e2565b925050819055508060075f6110ec6134be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111339190615215565b925050819055506111426134be565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef845f01516040516111a19190614b43565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f1131c2afe9ce72c59360d085f89bfdd088fcf4a3c93eec6cc5ff42f5d6b0801f835f01516040516111f29190614b43565b60405180910390a25050611204614769565b565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f61125561471c565b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611310576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161130790615292565b60405180910390fd5b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461139791906151e2565b925050819055505f600654836113ad91906151a1565b9050602760019054906101000a900460ff168015611412575060285f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561149b57602954811115611453576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a61146291906151e2565b111561149a576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561151b576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611512906152fa565b60405180910390fd5b8060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461156791906151e2565b925050819055508060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546115ba9190615215565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161161e9190614b43565b60405180910390a36001915050611633614769565b9392505050565b60605f600e8054905067ffffffffffffffff81111561165c5761165b615318565b5b60405190808252806020026020018201604052801561168a5781602001602082028036833780820191505090505b5090505f69d3c21bcecceda10000006116a1610f44565b6116a9613e96565b6116b391906151a1565b6116bd9190615372565b90505f5b600e8054905081101561179a575f600e82815481106116e3576116e26153a2565b5b905f5260205f200154600d546116f991906151a1565b90508083101580156117345750600f82600c811061171a576117196153a2565b5b0154601b83600c81106117305761172f6153a2565b5b0154105b1561176557600184838151811061174e5761174d6153a2565b5b60200260200101901515908115158152505061178c565b5f848381518110611779576117786153a2565b5b6020026020010190151590811515815250505b5080806001019150506116c1565b50819250505090565b5f80602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611814573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611838919061544b565b50915091505f826dffffffffffffffffffffffffffff16148061186a57505f816dffffffffffffffffffffffffffff16145b156118aa576040517f343401390000000000000000000000000000000000000000000000000000000081526004016118a1906154e5565b60405180910390fd5b602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611914573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119389190615517565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119bb9190615517565b73ffffffffffffffffffffffffffffffffffffffff1603611a2457816dffffffffffffffffffffffffffff166c0c9f2c9cd04674edea40000000826dffffffffffffffffffffffffffff16611a1091906151a1565b611a1a9190615372565b9350505050611a6e565b806dffffffffffffffffffffffffffff166c0c9f2c9cd04674edea40000000836dffffffffffffffffffffffffffff16611a5e91906151a1565b611a689190615372565b93505050505b90565b5f600e805490508210611ab9576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401611ab09061558c565b60405180910390fd5b5f611ac2613e96565b90505f600e8481548110611ad957611ad86153a2565b5b905f5260205f200154600d54611aef91906151a1565b90505f611afa610f44565b69d3c21bcecceda100000083611b1091906151a1565b611b1a9190615372565b9050808311611b2e575f9350505050611b62565b5f8184611b3b91906151e2565b90505f8261271083611b4d91906151a1565b611b579190615372565b905080955050505050505b919050565b611b6f614695565b600c5f9054906101000a900460ff1615611bce57600c5f9054906101000a900460ff166040517f0df1a3a1000000000000000000000000000000000000000000000000000000008152600401611bc59190614ccc565b60405180910390fd5b5f3403611c10576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611c07906155f4565b60405180910390fd5b5f3490505f60055490505f6103e8601983611c2b91906151a1565b611c359190615372565b90505f6103e86102d584611c4991906151a1565b611c539190615372565b90505f818385611c6391906151e2565b611c6d91906151e2565b90505f60065484611c7e91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ccc91906151e2565b925050819055508060075f611cdf6134be565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d269190615215565b92505081905550611d356134be565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d919190614b43565b60405180910390a381611da33061269a565b1015611de4576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401611ddb9061565c565b60405180910390fd5b8160085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198730855f80611ecc6134be565b426040518863ffffffff1660e01b8152600401611eee969594939291906156b3565b60606040518083038185885af1158015611f0a573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611f2f9190615726565b50505081670de0b6b3a764000087611f4791906151a1565b611f519190615372565b600d819055505f6101f461271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611f949190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611fbf91906151e2565b611fc99190615372565b611fd391906151a1565b90505f60fa61271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6120119190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61203c91906151e2565b6120469190615372565b61205091906151a1565b90505f607d61271069d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61208e9190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6120b991906151e2565b6120c39190615372565b6120cd91906151a1565b90505f5b600e805490508110156121575760048110156121065783600f82600c81106120fc576120fb6153a2565b5b018190555061214a565b600881101561212e5782600f82600c8110612124576121236153a2565b5b0181905550612149565b81600f82600c8110612143576121426153a2565b5b01819055505b5b80806001019150506120d1565b506001600c5f6101000a81548160ff0219169083151502179055507f944842efc7ccc582eafec3351b838ed21e5aed8afabc94fb83a6b18b052697a4602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868b6040516121c6939291906157a6565b60405180910390a1505050505050505050565b5f60045f9054906101000a900460ff16905090565b6032602052805f5260405f205f91509050805f0154908060010154905082565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546122969190615215565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516123729190614b43565b60405180910390a36001905092915050565b5f80602e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156123f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612414919061584d565b5050509150505f811361245c576040517f5388fae60000000000000000000000000000000000000000000000000000000081526004016124539061590e565b60405180910390fd5b6402540be4008161246d91906151a1565b91505090565b602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6031602052805f5260405f205f91509050805f0154908060010154905082565b6124c0614695565b6124c861471c565b5f60315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103612562576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80602001514210156125a0576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01819055506125ec6134be565b73ffffffffffffffffffffffffffffffffffffffff166108fc825f015190811502906040515f60405180830381858888f19350505050158015612631573d5f803e3d5ffd5b503373ffffffffffffffffffffffffffffffffffffffff167f1131c2afe9ce72c59360d085f89bfdd088fcf4a3c93eec6cc5ff42f5d6b0801f825f015160405161267b9190614b43565b60405180910390a25061268c614769565b565b60095481565b602f5481565b5f60065460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546126e69190615372565b9050919050565b6126f5614695565b6126fe5f614772565b565b5f8061270a613e96565b90505f81148061271957505f83145b15612759576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161275090615976565b60405180910390fd5b670de0b6b3a7640000838261276e91906151a1565b6127789190615372565b915050919050565b602a5481565b600c5f9054906101000a900460ff1681565b6127a0614695565b5f81036127e2576040517f616f22ce0000000000000000000000000000000000000000000000000000000081526004016127d9906159de565b60405180910390fd5b5f600654826127f191906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612873576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161286a90615a46565b60405180910390fd5b604051806040016040528083815260200162015180426128939190615215565b81525060325f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050503373ffffffffffffffffffffffffffffffffffffffff167f24b91f4f47caf44230a57777a9be744924e82bf666f2d5702faf97df35e60f9f8362015180426129309190615215565b60405161293e929190614f0a565b60405180910390a25050565b5f815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129bc57806040517f17858bbe0000000000000000000000000000000000000000000000000000000081526004016129b39190614ff5565b60405180910390fd5b6129c461471c565b5f6129ce8561269a565b90508060085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612a8b576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401612a8290615292565b60405180910390fd5b5f60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065482612adb9190615372565b9050602760019054906101000a900460ff168015612b40575060285f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612bc957602954821115612b81576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a612b9091906151e2565b1115612bc8576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060085f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612c5091906151e2565b9250508190555060075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558160075f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ce39190615215565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612d479190614b43565b60405180910390a360019450505050612d5e614769565b5092915050565b612d6d614695565b80600b8190555050565b602d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60275f9054906101000a900460ff1615612de2576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160275f6101000a81548160ff0219169083151502179055505f3403612e3e576040517f930dfea3000000000000000000000000000000000000000000000000000000008152600401612e3590615aae565b60405180910390fd5b600c5f9054906101000a900460ff16612e9c57600c5f9054906101000a900460ff166040517f0df1a3a1000000000000000000000000000000000000000000000000000000008152600401612e939190614ccc565b60405180910390fd5b600e805490508210612ee3576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401612eda9061558c565b60405180910390fd5b6064811015612f27576040517f616f22ce000000000000000000000000000000000000000000000000000000008152600401612f1e90615b16565b60405180910390fd5b5f612f30613e96565b90505f600e8481548110612f4757612f466153a2565b5b905f5260205f200154600d54612f5d91906151a1565b90505f612f68610f44565b69d3c21bcecceda100000083612f7e91906151a1565b612f889190615372565b905080831015612fc4576040517faa2908f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108482612fd391906151a1565b612fdd9190615372565b81612fe89190615215565b831115613021576040517f5d972b8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601b86600c8110613036576130356153a2565b5b0154600f87600c811061304c5761304b6153a2565b5b015461305891906151e2565b90505f8103613093576040517fdf8e376800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84670de0b6b3a7640000346130a991906151a1565b6130b39190615372565b90505f600654826130c491906151a1565b9050828111156130e257829050600654816130df9190615372565b91505b5f670de0b6b3a764000087846130f891906151a1565b6131029190615372565b90508160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015613184576040517f930dfea300000000000000000000000000000000000000000000000000000000815260040161317b90615a46565b60405180910390fd5b8160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131d091906151e2565b925050819055508160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132239190615215565b9250508190555081601b8a600c811061323f5761323e6153a2565b5b015f82825461324e9190615215565b92505081905550348110156132ad573373ffffffffffffffffffffffffffffffffffffffff166108fc823461328391906151e2565b90811502906040515f60405180830381858888f193505050501580156132ab573d5f803e3d5ffd5b505b8260085f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f6064605f8561335b91906151a1565b6133659190615372565b90505f6064605f8461337791906151a1565b6133819190615372565b9050602b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71984308886866133cd6134be565b426040518863ffffffff1660e01b81526004016133ef96959493929190615b34565b60606040518083038185885af115801561340b573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906134309190615726565b5050503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516134909190614b43565b60405180910390a35050505050505050505f60275f6101000a81548160ff0219169083151502179055505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546134f5906150dc565b80601f0160208091040260200160405190810160405280929190818152602001828054613521906150dc565b801561356c5780601f106135435761010080835404028352916020019161356c565b820191905f5260205f20905b81548152906001019060200180831161354f57829003601f168201915b5050505050905090565b600e8181548110613585575f80fd5b905f5260205f20015f915090505481565b61359e614695565b478111156135d8576040517fcff858f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528082815260200162015180426135f89190615215565b81525060315f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101559050503373ffffffffffffffffffffffffffffffffffffffff167f24b91f4f47caf44230a57777a9be744924e82bf666f2d5702faf97df35e60f9f8262015180426136959190615215565b6040516136a3929190614f0a565b60405180910390a250565b5f815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361372057806040517f17858bbe0000000000000000000000000000000000000000000000000000000081526004016137179190614ff5565b60405180910390fd5b61372861471c565b5f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600654826137789190615372565b9050602760019054906101000a900460ff1680156137dd575060285f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156138665760295482111561381e576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a61382d91906151e2565b1115613865576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90558160075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546138f29190615215565b925050819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516139569190614b43565b60405180910390a360019350505061396c614769565b50919050565b5f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905080831015613a08578281613a0391906151e2565b613a0a565b5f5b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054604051613b5b9190614b43565b60405180910390a3600191505092915050565b5f825f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613be057806040517f17858bbe000000000000000000000000000000000000000000000000000000008152600401613bd79190614ff5565b60405180910390fd5b613be861471c565b5f60065484613bf791906151a1565b9050602760019054906101000a900460ff168015613c5c575060285f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15613ce557602954811115613c9d576040517f2186f41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a54483a613cac91906151e2565b1115613ce4576040517ff441e9e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613d3191906151e2565b925050819055508060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613d849190615215565b925050819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051613de89190614b43565b60405180910390a36001925050613dfd614769565b5092915050565b602e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f69d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e609190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e8b91906151e2565b905090565b600a5481565b5f80602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613f07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2b919061544b565b50915091505f826dffffffffffffffffffffffffffff161480613f5d57505f816dffffffffffffffffffffffffffff16145b15613f9d576040517f34340139000000000000000000000000000000000000000000000000000000008152600401613f9490615bdd565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ffd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140219190615517565b73ffffffffffffffffffffffffffffffffffffffff160361408557816dffffffffffffffffffffffffffff16670de0b6b3a7640000826dffffffffffffffffffffffffffff1661407191906151a1565b61407b9190615372565b93505050506140ca565b806dffffffffffffffffffffffffffff16670de0b6b3a7640000836dffffffffffffffffffffffffffff166140ba91906151a1565b6140c49190615372565b93505050505b90565b6140d5614695565b8060285f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60295481565b61413b61471c565b61012c600a5461414b9190615215565b431015614184576040517f136f691400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036141bb573390505b5f5a90506141c7614835565b600160305f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546142149190615215565b925050819055505f602f541115614499575f61422e613e96565b90505f8103614272576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161426990615c45565b60405180910390fd5b5f5a8361427f91906151e2565b90505f488261428e91906151a1565b90505f6064602f546359682f00846142a69190615215565b6142b091906151a1565b6142ba9190615372565b90505f84670de0b6b3a7640000836142d291906151a1565b6142dc9190615372565b90505f600654826142ed91906151a1565b90508060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410614443578060075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461437f91906151e2565b925050819055508060075f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546143d29190615215565b925050819055508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516144369190614b43565b60405180910390a3614492565b8773ffffffffffffffffffffffffffffffffffffffff167f19ffbfce3b9efe21d4eae606f544cbb1e680c3539b8c51804583068a042e2a05836040516144899190614b43565b60405180910390a25b5050505050505b506144a2614769565b50565b600f81600c81106144b4575f80fd5b015f915090505481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600d5481565b61454e614695565b602760019054906101000a900460ff1615602760016101000a81548160ff021916908315150217905550565b601b81600c8110614589575f80fd5b015f915090505481565b5f808284116145ad5783836145a891906151e2565b6145ba565b82846145b991906151e2565b5b90505f600284866145cb9190615215565b6145d59190615372565b6064836145e291906151a1565b6145ec9190615372565b9050600b548111159250505092915050565b614606614695565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614676575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161466d9190614ff5565b60405180910390fd5b61467f81614772565b50565b602760019054906101000a900460ff1681565b61469d614b24565b73ffffffffffffffffffffffffffffffffffffffff166146bb6134be565b73ffffffffffffffffffffffffffffffffffffffff161461471a576146de614b24565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016147119190614ff5565b60405180910390fd5b565b60025f5403614760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161475790615cad565b60405180910390fd5b60025f81905550565b60015f81905550565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61483e612384565b90505f6148496117a3565b90505f82148061485857505f81145b15614898576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161488f906155f4565b60405180910390fd5b6148a28183614593565b6148d8576040517fc7489d4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6148e282612700565b90505f8103614926576040517f5388fae600000000000000000000000000000000000000000000000000000000815260040161491d90615d15565b60405180910390fd5b5f600954670de0b6b3a76400008361493e91906151a1565b6149489190615372565b90505f670de0b6b3a76400006005548361496291906151a1565b61496c9190615372565b90506a09ed194db19b238c0000008111156149aa57600a8161498e9190615372565b9050600a60095461499f91906151a1565b6009819055506149e2565b69a968163f0a57b40000008110156149e157600a816149c991906151a1565b9050600a6009546149da9190615372565b6009819055505b5b8060058190555060055469d3c21bcecceda10000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614a229190615776565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614a4d91906151e2565b614a579190615372565b60068190555043600a819055507f11c6bf55864ff83827df712625d7a80e5583eef0264921025e7cd22003a21511600554600954604051614a99929190614f0a565b60405180910390a1602c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b07575f80fd5b505af1158015614b19573d5f803e3d5ffd5b505050505050505050565b5f33905090565b5f819050919050565b614b3d81614b2b565b82525050565b5f602082019050614b565f830184614b34565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f614b9e82614b5c565b614ba88185614b66565b9350614bb8818560208601614b76565b614bc181614b84565b840191505092915050565b5f6020820190508181035f830152614be48184614b94565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614c1982614bf0565b9050919050565b614c2981614c0f565b8114614c33575f80fd5b50565b5f81359050614c4481614c20565b92915050565b614c5381614b2b565b8114614c5d575f80fd5b50565b5f81359050614c6e81614c4a565b92915050565b5f8060408385031215614c8a57614c89614bec565b5b5f614c9785828601614c36565b9250506020614ca885828601614c60565b9150509250929050565b5f8115159050919050565b614cc681614cb2565b82525050565b5f602082019050614cdf5f830184614cbd565b92915050565b5f60208284031215614cfa57614cf9614bec565b5b5f614d0784828501614c60565b91505092915050565b5f60208284031215614d2557614d24614bec565b5b5f614d3284828501614c36565b91505092915050565b5f819050919050565b5f614d5e614d59614d5484614bf0565b614d3b565b614bf0565b9050919050565b5f614d6f82614d44565b9050919050565b5f614d8082614d65565b9050919050565b614d9081614d76565b82525050565b5f602082019050614da95f830184614d87565b92915050565b5f805f60608486031215614dc657614dc5614bec565b5b5f614dd386828701614c36565b9350506020614de486828701614c36565b9250506040614df586828701614c60565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614e3181614cb2565b82525050565b5f614e428383614e28565b60208301905092915050565b5f602082019050919050565b5f614e6482614dff565b614e6e8185614e09565b9350614e7983614e19565b805f5b83811015614ea9578151614e908882614e37565b9750614e9b83614e4e565b925050600181019050614e7c565b5085935050505092915050565b5f6020820190508181035f830152614ece8184614e5a565b905092915050565b5f60ff82169050919050565b614eeb81614ed6565b82525050565b5f602082019050614f045f830184614ee2565b92915050565b5f604082019050614f1d5f830185614b34565b614f2a6020830184614b34565b9392505050565b5f614f3b82614d65565b9050919050565b614f4b81614f31565b82525050565b5f602082019050614f645f830184614f42565b92915050565b5f8060408385031215614f8057614f7f614bec565b5b5f614f8d85828601614c36565b9250506020614f9e85828601614c36565b9150509250929050565b5f8060408385031215614fbe57614fbd614bec565b5b5f614fcb85828601614c60565b9250506020614fdc85828601614c60565b9150509250929050565b614fef81614c0f565b82525050565b5f6020820190506150085f830184614fe6565b92915050565b5f61501882614d65565b9050919050565b6150288161500e565b82525050565b5f6020820190506150415f83018461501f565b92915050565b61505081614cb2565b811461505a575f80fd5b50565b5f8135905061506b81615047565b92915050565b5f806040838503121561508757615086614bec565b5b5f61509485828601614c36565b92505060206150a58582860161505d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806150f357607f821691505b602082108103615106576151056150af565b5b50919050565b7f526577617264206d756c7469706c6965720000000000000000000000000000005f82015250565b5f615140601183614b66565b915061514b8261510c565b602082019050919050565b5f6020820190508181035f83015261516d81615134565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6151ab82614b2b565b91506151b683614b2b565b92508282026151c481614b2b565b915082820484148315176151db576151da615174565b5b5092915050565b5f6151ec82614b2b565b91506151f783614b2b565b925082820390508181111561520f5761520e615174565b5b92915050565b5f61521f82614b2b565b915061522a83614b2b565b925082820190508082111561524257615241615174565b5b92915050565b7f416c6c6f77616e636500000000000000000000000000000000000000000000005f82015250565b5f61527c600983614b66565b915061528782615248565b602082019050919050565b5f6020820190508181035f8301526152a981615270565b9050919050565b7f53656e64657200000000000000000000000000000000000000000000000000005f82015250565b5f6152e4600683614b66565b91506152ef826152b0565b602082019050919050565b5f6020820190508181035f830152615311816152d8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61537c82614b2b565b915061538783614b2b565b92508261539757615396615345565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6dffffffffffffffffffffffffffff82169050919050565b6153f1816153cf565b81146153fb575f80fd5b50565b5f8151905061540c816153e8565b92915050565b5f63ffffffff82169050919050565b61542a81615412565b8114615434575f80fd5b50565b5f8151905061544581615421565b92915050565b5f805f6060848603121561546257615461614bec565b5b5f61546f868287016153fe565b9350506020615480868287016153fe565b925050604061549186828701615437565b9150509250925092565b7f4554482f555344432072657365727665730000000000000000000000000000005f82015250565b5f6154cf601183614b66565b91506154da8261549b565b602082019050919050565b5f6020820190508181035f8301526154fc816154c3565b9050919050565b5f8151905061551181614c20565b92915050565b5f6020828403121561552c5761552b614bec565b5b5f61553984828501615503565b91505092915050565b7f5472616e63686520696e646578000000000000000000000000000000000000005f82015250565b5f615576600d83614b66565b915061558182615542565b602082019050919050565b5f6020820190508181035f8301526155a38161556a565b9050919050565b7f45544800000000000000000000000000000000000000000000000000000000005f82015250565b5f6155de600383614b66565b91506155e9826155aa565b602082019050919050565b5f6020820190508181035f83015261560b816155d2565b9050919050565b7f546f6b656e2062616c616e636520666f72206c697175696469747900000000005f82015250565b5f615646601b83614b66565b915061565182615612565b602082019050919050565b5f6020820190508181035f8301526156738161563a565b9050919050565b5f819050919050565b5f61569d6156986156938461567a565b614d3b565b614b2b565b9050919050565b6156ad81615683565b82525050565b5f60c0820190506156c65f830189614fe6565b6156d36020830188614b34565b6156e060408301876156a4565b6156ed60608301866156a4565b6156fa6080830185614fe6565b61570760a0830184614b34565b979650505050505050565b5f8151905061572081614c4a565b92915050565b5f805f6060848603121561573d5761573c614bec565b5b5f61574a86828701615712565b935050602061575b86828701615712565b925050604061576c86828701615712565b9150509250925092565b5f61578082614b2b565b915061578b83614b2b565b92508261579b5761579a615345565b5b828206905092915050565b5f6060820190506157b95f830186614fe6565b6157c66020830185614b34565b6157d36040830184614b34565b949350505050565b5f69ffffffffffffffffffff82169050919050565b6157f9816157db565b8114615803575f80fd5b50565b5f81519050615814816157f0565b92915050565b5f819050919050565b61582c8161581a565b8114615836575f80fd5b50565b5f8151905061584781615823565b92915050565b5f805f805f60a0868803121561586657615865614bec565b5b5f61587388828901615806565b955050602061588488828901615839565b945050604061589588828901615712565b93505060606158a688828901615712565b92505060806158b788828901615806565b9150509295509295909350565b7f4554482066726f6d20436861696e6c696e6b00000000000000000000000000005f82015250565b5f6158f8601283614b66565b9150615903826158c4565b602082019050919050565b5f6020820190508181035f830152615925816158ec565b9050919050565b7f424f4f42532f455448206f72204554482f5553440000000000000000000000005f82015250565b5f615960601483614b66565b915061596b8261592c565b602082019050919050565b5f6020820190508181035f83015261598d81615954565b9050919050565b7f576974686472617720616d6f756e7400000000000000000000000000000000005f82015250565b5f6159c8600f83614b66565b91506159d382615994565b602082019050919050565b5f6020820190508181035f8301526159f5816159bc565b9050919050565b7f546f6b656e2062616c616e6365000000000000000000000000000000000000005f82015250565b5f615a30600d83614b66565b9150615a3b826159fc565b602082019050919050565b5f6020820190508181035f830152615a5d81615a24565b9050919050565b7f4554482073656e740000000000000000000000000000000000000000000000005f82015250565b5f615a98600883614b66565b9150615aa382615a64565b602082019050919050565b5f6020820190508181035f830152615ac581615a8c565b9050919050565b7f4d617820707269636520646966666572656e63650000000000000000000000005f82015250565b5f615b00601483614b66565b9150615b0b82615acc565b602082019050919050565b5f6020820190508181035f830152615b2d81615af4565b9050919050565b5f60c082019050615b475f830189614fe6565b615b546020830188614b34565b615b616040830187614b34565b615b6e6060830186614b34565b615b7b6080830185614fe6565b615b8860a0830184614b34565b979650505050505050565b7f424f4f42532f45544820726573657276657300000000000000000000000000005f82015250565b5f615bc7601283614b66565b9150615bd282615b93565b602082019050919050565b5f6020820190508181035f830152615bf481615bbb565b9050919050565b7f424f4f42532f45544800000000000000000000000000000000000000000000005f82015250565b5f615c2f600983614b66565b9150615c3a82615bfb565b602082019050919050565b5f6020820190508181035f830152615c5c81615c23565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615c97601f83614b66565b9150615ca282615c63565b602082019050919050565b5f6020820190508181035f830152615cc481615c8b565b9050919050565b7f424f4f42532f55534400000000000000000000000000000000000000000000005f82015250565b5f615cff600983614b66565b9150615d0a82615ccb565b602082019050919050565b5f6020820190508181035f830152615d2c81615cf3565b905091905056fea264697066735822122096faa941e28b5b1473bf7633cdeb1f21a7c70d641d69a702bacc8bf1be125af364736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc

-----Decoded View---------------
Arg [0] : _uniswapV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _ethPriceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [2] : _ethUsdcPair (address): 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [2] : 000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc


Deployed Bytecode Sourcemap

21484:36655:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22504:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27739:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56364:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28765:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23551:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23241:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48366:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31896:681;;;;;;;;;;;;;:::i;:::-;;49313:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53386:877;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46152:773;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38636:515;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47301:760;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40650:2065;;;:::i;:::-;;28088:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24252:61;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;57011:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39331:248;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23289:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24186:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;30451:468;;;;;;;;;;;;;:::i;:::-;;22398:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23444:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48808:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18532:103;;;;;;;;;;;;;:::i;:::-;;37458:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23162:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22603:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31152:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54769:884;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28406:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23331:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43333:2441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17857:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27894;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22713:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29896:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51394:659;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57714:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50291:634;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23371:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49682:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22463:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37961:514;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29491:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23074:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33715:1303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22811:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52679:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22663:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29116:108;;;;;;;;;;;;;:::i;:::-;;22859:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39919:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18790:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22960:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22504:37;;;;:::o;27739:83::-;27776:13;27809:5;27802:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27739:83;:::o;56364:223::-;56438:4;56498:5;56455:19;:31;56475:10;56455:31;;;;;;;;;;;;;;;:40;56487:7;56455:40;;;;;;;;;;;;;;;:48;;;;56542:7;56521:36;;56530:10;56521:36;;;56551:5;56521:36;;;;;;:::i;:::-;;;;;;;;56575:4;56568:11;;56364:223;;;;:::o;28765:222::-;17743:13;:11;:13::i;:::-;28879:4:::1;28857:19;:26;28853:77;;;28892:38;;;;;;;;;;:::i;:::-;;;;;;;;28853:77;28960:19;28941:16;:38;;;;28765:222:::0;:::o;23551:56::-;;;;;;;;;;;;;;;;;:::o;23241:41::-;;;;;;;;;;;;;:::o;48366:100::-;48419:7;48446:12;;48439:19;;48366:100;:::o;31896:681::-;17743:13;:11;:13::i;:::-;14276:21:::1;:19;:21::i;:::-;31972:28:::2;32003:23;:35;32027:10;32003:35;;;;;;;;;;;;;;;31972:66;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;32074:1;32053:10;:17;;;:22:::0;32049:52:::2;;32084:17;;;;;;;;;;;;;;32049:52;32134:10;:23;;;32116:15;:41;32112:70;;;32166:16;;;;;;;;;;;;;;32112:70;32240:1;32195:23;:35;32219:10;32195:35;;;;;;;;;;;;;;;:42;;:46;;;;32254:21;32298:23;;32278:10;:17;;;:43;;;;:::i;:::-;32254:67;;32368:13;32332:17;:32;32358:4;32332:32;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;32422:13;32392:17;:26;32410:7;:5;:7::i;:::-;32392:26;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;32477:7;:5;:7::i;:::-;32453:51;;32470:4;32453:51;;;32486:10;:17;;;32453:51;;;;;;:::i;:::-;;;;;;;;32539:10;32520:49;;;32551:10;:17;;;32520:49;;;;;;:::i;:::-;;;;;;;;31961:616;;14320:20:::1;:18;:20::i;:::-;31896:681::o:0;49313:116::-;49372:7;49399:17;:22;49417:3;49399:22;;;;;;;;;;;;;;;;49392:29;;49313:116;;;:::o;53386:877::-;53487:4;14276:21;:19;:21::i;:::-;53548:5:::1;53508:19;:25;53528:4;53508:25;;;;;;;;;;;;;;;:37;53534:10;53508:37;;;;;;;;;;;;;;;;:45;53504:95;;;53562:37;;;;;;;;;;:::i;:::-;;;;;;;;53504:95;53651:5;53610:19;:25;53630:4;53610:25;;;;;;;;;;;;;;;:37;53636:10;53610:37;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;53669:21;53701:23;;53693:5;:31;;;;:::i;:::-;53669:55;;53741:16;;;;;;;;;;;:56;;;;;53762:31;:35;53794:2;53762:35;;;;;;;;;;;;;;;;;;;;;;;;;53761:36;53741:56;53737:253;;;53833:14;;53817:13;:30;53813:67;;;53856:24;;;;;;;;;;;;;;53813:67;53931:14;;53914:13;53900:11;:27;;;;:::i;:::-;53899:46;53895:83;;;53954:24;;;;;;;;;;;;;;53895:83;53737:253;54032:13;54006:17;:23;54024:4;54006:23;;;;;;;;;;;;;;;;:39;54002:86;;;54054:34;;;;;;;;;;:::i;:::-;;;;;;;;54002:86;54128:13;54101:17;:23;54119:4;54101:23;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;54177:13;54152:17;:21;54170:2;54152:21;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;54223:2;54208:25;;54217:4;54208:25;;;54227:5;54208:25;;;;;;:::i;:::-;;;;;;;;54251:4;54244:11;;;14320:20:::0;:18;:20::i;:::-;53386:877;;;;;:::o;46152:773::-;46205:13;46231:31;46276:14;:21;;;;46265:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46231:67;;46309:36;21781:16;46372:13;:11;:13::i;:::-;46349:20;:18;:20::i;:::-;:36;;;;:::i;:::-;46348:55;;;;:::i;:::-;46309:94;;46429:9;46424:449;46448:14;:21;;;;46444:1;:25;46424:449;;;46491:36;46561:14;46576:1;46561:17;;;;;;;;:::i;:::-;;;;;;;;;;46530:28;;:48;;;;:::i;:::-;46491:87;;46629:28;46597;:60;;:132;;;;;46704:22;46727:1;46704:25;;;;;;;:::i;:::-;;;;46678:20;46699:1;46678:23;;;;;;;:::i;:::-;;;;:51;46597:132;46593:269;;;46773:4;46750:17;46768:1;46750:20;;;;;;;;:::i;:::-;;;;;;;:27;;;;;;;;;;;46593:269;;;46841:5;46818:17;46836:1;46818:20;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;;;46593:269;46476:397;46471:3;;;;;;;46424:449;;;;46900:17;46893:24;;;;46152:773;:::o;38636:515::-;38691:7;38711:19;38748:11;;;;;;;;;;;38711:49;;38772:16;38790;38812:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38771:59;;;;;38857:1;38845:8;:13;;;:30;;;;38874:1;38862:8;:13;;;38845:30;38841:83;;;38884:40;;;;;;;;;;:::i;:::-;;;;;;;;38841:83;38958:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38941:39;;:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;38937:207;;39039:8;39031:17;;39024:4;39012:8;39004:17;;:24;;;;:::i;:::-;:44;;;;:::i;:::-;38997:51;;;;;;;38937:207;39123:8;39115:17;;39108:4;39096:8;39088:17;;:24;;;;:::i;:::-;:44;;;;:::i;:::-;39081:51;;;;;38636:515;;:::o;47301:760::-;47386:7;47426:14;:21;;;;47410:12;:37;47406:84;;47456:34;;;;;;;;;;:::i;:::-;;;;;;;;47406:84;47511:20;47534;:18;:20::i;:::-;47511:43;;47565:36;47635:14;47650:12;47635:28;;;;;;;;:::i;:::-;;;;;;;;;;47604;;:59;;;;:::i;:::-;47565:98;;47674:20;47747:13;:11;:13::i;:::-;21781:16;47698:28;:45;;;;:::i;:::-;47697:63;;;;:::i;:::-;47674:86;;47801:12;47785;:28;47781:69;;47837:1;47830:8;;;;;;;47781:69;47870:23;47911:12;47896;:27;;;;:::i;:::-;47870:53;;47934:28;47993:12;47984:5;47966:15;:23;;;;:::i;:::-;47965:40;;;;:::i;:::-;47934:71;;48033:20;48026:27;;;;;;;47301:760;;;;:::o;40650:2065::-;17743:13;:11;:13::i;:::-;40726:8:::1;;;;;;;;;;;40722:43;;;40756:8;;;;;;;;;;;40743:22;;;;;;;;;;;:::i;:::-;;;;;;;;40722:43;40793:1;40780:9;:14:::0;40776:58:::1;;40803:31;;;;;;;;;;:::i;:::-;;;;;;;;40776:58;40857:17;40877:9;40857:29;;40897:19;40919:12;;40897:34;;40944:22;40990:4;40984:2;40970:11;:16;;;;:::i;:::-;40969:25;;;;:::i;:::-;40944:50;;41013:24;41062:4;41055:3;41041:11;:17;;;;:::i;:::-;41040:26;;;;:::i;:::-;41013:53;;41086:18;41138:16;41121:14;41107:11;:28;;;;:::i;:::-;:47;;;;:::i;:::-;41086:68;;41174:24;41218:23;;41201:14;:40;;;;:::i;:::-;41174:67;;41288:16;41252:17;:32;41278:4;41252:32;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;41345:16;41315:17;:26;41333:7;:5;:7::i;:::-;41315:26;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;41401:7;:5;:7::i;:::-;41377:48;;41394:4;41377:48;;;41410:14;41377:48;;;;;;:::i;:::-;;;;;;;;41469:10;41442:24;41460:4;41442:9;:24::i;:::-;:37;41438:105;;;41488:55;;;;;;;;;;:::i;:::-;;;;;;;;41438:105;41619:10;41556:19;:34;41584:4;41556:34;;;;;;;;;;;;;;;:60;41599:15;;;;;;;;;;;41556:60;;;;;;;;;;;;;;;:73;;;;41642:15;;;;;;;;;;;:31;;;41681:9;41714:4;41734:10;41759:1;41775::::0;41791:7:::1;:5;:7::i;:::-;41813:15;41642:197;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;41956:10;41948:4;41936:9;:16;;;;:::i;:::-;41935:31;;;;:::i;:::-;41904:28;:62;;;;42069:18;42119:3;42110:5;21781:16;21715:17;21863:28;;;;:::i;:::-;21715:17;21848:44;;;;:::i;:::-;42091:24;;;;:::i;:::-;42090:32;;;;:::i;:::-;42069:53;;42133:18;42183:3;42174:5;21781:16;21715:17;21863:28;;;;:::i;:::-;21715:17;21848:44;;;;:::i;:::-;42155:24;;;;:::i;:::-;42154:32;;;;:::i;:::-;42133:53;;42197:20;42249:3;42240:5;21781:16;21715:17;21863:28;;;;:::i;:::-;21715:17;21848:44;;;;:::i;:::-;42221:24;;;;:::i;:::-;42220:32;;;;:::i;:::-;42197:55;;42270:9;42265:333;42289:14;:21;;;;42285:1;:25;42265:333;;;42340:1;42336;:5;42332:255;;;42390:10;42362:22;42385:1;42362:25;;;;;;;:::i;:::-;;;:38;;;;42332:255;;;42430:1;42426;:5;42422:165;;;42480:10;42452:22;42475:1;42452:25;;;;;;;:::i;:::-;;;:38;;;;42422:165;;;42559:12;42531:22;42554:1;42531:25;;;;;;;:::i;:::-;;;:40;;;;42422:165;42332:255;42312:3;;;;;;;42265:333;;;;42621:4;42610:8;;:15;;;;;;;;;;;;;;;;;;42643:64;42669:13;;;;;;;;;;;42685:10;42697:9;42643:64;;;;;;;;:::i;:::-;;;;;;;;40711:2004;;;;;;;;;40650:2065::o:0;28088:83::-;28129:5;28154:9;;;;;;;;;;;28147:16;;28088:83;:::o;24252:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57011:270::-;57091:4;57152:10;57108:19;:31;57128:10;57108:31;;;;;;;;;;;;;;;:40;57140:7;57108:40;;;;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;;;;;;;;57201:7;57180:71;;57189:10;57180:71;;;57210:19;:31;57230:10;57210:31;;;;;;;;;;;;;;;:40;57242:7;57210:40;;;;;;;;;;;;;;;;57180:71;;;;;;:::i;:::-;;;;;;;;57269:4;57262:11;;57011:270;;;;:::o;39331:248::-;39388:7;39410:12;39429;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39408:51;;;;;;39483:1;39474:5;:10;39470:62;;39493:39;;;;;;;;;;:::i;:::-;;;;;;;;39470:62;39567:4;39558:5;39550:21;;;;:::i;:::-;39543:28;;;39331:248;:::o;23289:35::-;;;;;;;;;;;;;:::o;24186:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30451:468::-;17743:13;:11;:13::i;:::-;14276:21:::1;:19;:21::i;:::-;30524:28:::2;30555:21;:33;30577:10;30555:33;;;;;;;;;;;;;;;30524:64;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;30624:1;30603:10;:17;;;:22:::0;30599:52:::2;;30634:17;;;;;;;;;;;;;;30599:52;30684:10;:23;;;30666:15;:41;30662:70;;;30716:16;;;;;;;;;;;;;;30662:70;30788:1;30745:21;:33;30767:10;30745:33;;;;;;;;;;;;;;;:40;;:44;;;;30810:7;:5;:7::i;:::-;30802:25;;:44;30828:10;:17;;;30802:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;30881:10;30862:49;;;30893:10;:17;;;30862:49;;;;;;:::i;:::-;;;;;;;;30513:406;14320:20:::1;:18;:20::i;:::-;30451:468::o:0;22398:44::-;;;;:::o;23444:37::-;;;;:::o;48808:145::-;48870:7;48922:23;;48897:17;:22;48915:3;48897:22;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;48890:55;;48808:145;;;:::o;18532:103::-;17743:13;:11;:13::i;:::-;18597:30:::1;18624:1;18597:18;:30::i;:::-;18532:103::o:0;37458:331::-;37536:7;37556:23;37582:20;:18;:20::i;:::-;37556:46;;37636:1;37617:15;:20;:48;;;;37664:1;37641:19;:24;37617:48;37613:102;;;37674:41;;;;;;;;;;:::i;:::-;;;;;;;;37613:102;37777:4;37754:19;37736:15;:37;;;;:::i;:::-;37735:46;;;;:::i;:::-;37728:53;;;37458:331;;;:::o;23162:40::-;;;;:::o;22603:28::-;;;;;;;;;;;;;:::o;31152:566::-;17743:13;:11;:13::i;:::-;31243:1:::1;31233:6;:11:::0;31229:60:::1;;31253:36;;;;;;;;;;:::i;:::-;;;;;;;;31229:60;31300:21;31333:23;;31324:6;:32;;;;:::i;:::-;31300:56;;31406:13;31371:17;:32;31397:4;31371:32;;;;;;;;;;;;;;;;:48;31367:102;;;31428:41;;;;;;;;;;:::i;:::-;;;;;;;;31367:102;31520:107;;;;;;;;31554:6;31520:107;;;;31607:8;31589:15;:26;;;;:::i;:::-;31520:107;;::::0;31482:23:::1;:35;31506:10;31482:35;;;;;;;;;;;;;;;:145;;;;;;;;;;;;;;;;;;;31663:10;31643:67;;;31675:6;31701:8;31683:15;:26;;;;:::i;:::-;31643:67;;;;;;;:::i;:::-;;;;;;;;31218:500;31152:566:::0;:::o;54769:884::-;54868:4;54842:2;25281:1;25267:16;;:2;:16;;;25263:49;;25309:2;25292:20;;;;;;;;;;;:::i;:::-;;;;;;;;25263:49;14276:21:::1;:19;:21::i;:::-;54885::::2;54909:15;54919:4;54909:9;:15::i;:::-;54885:39;;54979:13;54939:19;:25;54959:4;54939:25;;;;;;;;;;;;;;;:37;54965:10;54939:37;;;;;;;;;;;;;;;;:53;54935:103;;;55001:37;;;;;;;;;;:::i;:::-;;;;;;;;54935:103;55051:21;55075:17;:23;55093:4;55075:23;;;;;;;;;;;;;;;;55051:47;;55109:13;55141:23;;55125:13;:39;;;;:::i;:::-;55109:55;;55181:16;;;;;;;;;;;:56;;;;;55202:31;:35;55234:2;55202:35;;;;;;;;;;;;;;;;;;;;;;;;;55201:36;55181:56;55177:253;;;55273:14;;55257:13;:30;55253:67;;;55296:24;;;;;;;;;;;;;;55253:67;55371:14;;55354:13;55340:11;:27;;;;:::i;:::-;55339:46;55335:83;;;55394:24;;;;;;;;;;;;;;55335:83;55177:253;55483:5;55442:19;:25;55462:4;55442:25;;;;;;;;;;;;;;;:37;55468:10;55442:37;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;55508:17;:23;55526:4;55508:23;;;;;;;;;;;;;;;55501:30;;;55567:13;55542:17;:21;55560:2;55542:21;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;55613:2;55598:25;;55607:4;55598:25;;;55617:5;55598:25;;;;;;:::i;:::-;;;;;;;;55641:4;55634:11;;;;;14320:20:::1;:18;:20::i;:::-;54769:884:::0;;;;;:::o;28406:138::-;17743:13;:11;:13::i;:::-;28517:19:::1;28496:18;:40;;;;28406:138:::0;:::o;23331:33::-;;;;;;;;;;;;;:::o;43333:2441::-;25383:7;;;;;;;;;;;25379:35;;;25399:15;;;;;;;;;;;;;;25379:35;25435:4;25425:7;;:14;;;;;;;;;;;;;;;;;;43472:1:::1;43459:9;:14:::0;43455:63:::1;;43482:36;;;;;;;;;;:::i;:::-;;;;;;;;43455:63;43534:8;;;;;;;;;;;43529:44;;43564:8;;;;;;;;;;;43551:22;;;;;;;;;;;:::i;:::-;;;;;;;;43529:44;43604:14;:21;;;;43588:12;:37;43584:84;;43634:34;;;;;;;;;;:::i;:::-;;;;;;;;43584:84;43711:3;43683:25;:31;43679:85;;;43723:41;;;;;;;;;;:::i;:::-;;;;;;;;43679:85;43777:20;43800;:18;:20::i;:::-;43777:43;;43831:36;43901:14;43916:12;43901:28;;;;;;;;:::i;:::-;;;;;;;;;;43870;;:59;;;;:::i;:::-;43831:98;;43940:20;44013:13;:11;:13::i;:::-;21781:16;43964:28;:45;;;;:::i;:::-;43963:63;;;;:::i;:::-;43940:86;;44058:12;44043;:27;44039:73;;;44079:33;;;;;;;;;;;;;;44039:73;44202:5;44174:25;44159:12;:40;;;;:::i;:::-;:48;;;;:::i;:::-;44143:12;:65;;;;:::i;:::-;44127:12;:82;44123:124;;;44218:29;;;;;;;;;;;;;;44123:124;44260:26;44328:20;44349:12;44328:34;;;;;;;:::i;:::-;;;;44289:22;44312:12;44289:36;;;;;;;:::i;:::-;;;;:73;;;;:::i;:::-;44260:102;;44399:1;44377:18;:23:::0;44373:52:::1;;44409:16;;;;;;;;;;;;;;44373:52;44438:19;44481:12;44473:4;44461:9;:16;;;;:::i;:::-;44460:33;;;;:::i;:::-;44438:55;;44506:22;44545:23;;44531:11;:37;;;;:::i;:::-;44506:62;;44600:18;44583:14;:35;44579:172;;;44652:18;44635:35;;44716:23;;44699:14;:40;;;;:::i;:::-;44685:54;;44579:172;44763:16;44813:4;44797:12;44783:11;:26;;;;:::i;:::-;44782:35;;;;:::i;:::-;44763:54;;44869:14;44834:17;:32;44860:4;44834:32;;;;;;;;;;;;;;;;:49;44830:103;;;44892:41;;;;;;;;;;:::i;:::-;;;;;;;;44830:103;44982:14;44946:17;:32;44972:4;44946:32;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;45040:14;45007:17;:29;45025:10;45007:29;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;45105:14;45067:20;45088:12;45067:34;;;;;;;:::i;:::-;;;;:52;;;;;;;:::i;:::-;;;;;;;;45147:9;45136:8;:20;45132:103;;;45181:10;45173:28;;:50;45214:8;45202:9;:20;;;;:::i;:::-;45173:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45132:103;45310:11;45247:19;:34;45275:4;45247:34;;;;;;;;;;;;;;;:60;45290:15;;;;;;;;;;;45247:60;;;;;;;;;;;;;;;:74;;;;45334:17;45375:3;45369:2;45355:11;:16;;;;:::i;:::-;45354:24;;;;:::i;:::-;45334:44;;45414:14;45449:3;45443:2;45432:8;:13;;;;:::i;:::-;45431:21;;;;:::i;:::-;45414:38;;45490:15;;;;;;;;;;;:31;;;45529:8;45561:4;45581:11;45607:9;45631:6;45652:7;:5;:7::i;:::-;45674:15;45490:210;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45742:10;45718:48;;45735:4;45718:48;;;45754:11;45718:48;;;;;;:::i;:::-;;;;;;;;43444:2330;;;;;;;;;25472:5:::0;25462:7;;:15;;;;;;;;;;;;;;;;;;43333:2441;;:::o;17857:87::-;17903:7;17930:6;;;;;;;;;;;17923:13;;17857:87;:::o;27894:::-;27933:13;27966:7;27959:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27894:87;:::o;22713:91::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29896:379::-;17743:13;:11;:13::i;:::-;29983:21:::1;29974:6;:30;29970:60;;;30013:17;;;;;;;;;;;;;;29970:60;30077:107;;;;;;;;30111:6;30077:107;;;;30164:8;30146:15;:26;;;;:::i;:::-;30077:107;;::::0;30041:21:::1;:33;30063:10;30041:33;;;;;;;;;;;;;;;:143;;;;;;;;;;;;;;;;;;;30220:10;30200:67;;;30232:6;30258:8;30240:15;:26;;;;:::i;:::-;30200:67;;;;;;;:::i;:::-;;;;;;;;29896:379:::0;:::o;51394:659::-;51475:4;51449:2;25281:1;25267:16;;:2;:16;;;25263:49;;25309:2;25292:20;;;;;;;;;;;:::i;:::-;;;;;;;;25263:49;14276:21:::1;:19;:21::i;:::-;51492::::2;51516:17;:29;51534:10;51516:29;;;;;;;;;;;;;;;;51492:53;;51556:13;51588:23;;51572:13;:39;;;;:::i;:::-;51556:55;;51628:16;;;;;;;;;;;:56;;;;;51649:31;:35;51681:2;51649:35;;;;;;;;;;;;;;;;;;;;;;;;;51648:36;51628:56;51624:253;;;51720:14;;51704:13;:30;51700:67;;;51743:24;;;;;;;;;;;;;;51700:67;51818:14;;51801:13;51787:11;:27;;;;:::i;:::-;51786:46;51782:83;;;51841:24;;;;;;;;;;;;;;51782:83;51624:253;51896:17;:29;51914:10;51896:29;;;;;;;;;;;;;;;51889:36;;;51961:13;51936:17;:21;51954:2;51936:21;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;52013:2;51992:31;;52001:10;51992:31;;;52017:5;51992:31;;;;;;:::i;:::-;;;;;;;;52041:4;52034:11;;;;14320:20:::1;:18;:20::i;:::-;51394:659:::0;;;;:::o;57714:422::-;57799:4;57816:16;57835:19;:31;57855:10;57835:31;;;;;;;;;;;;;;;:40;57867:7;57835:40;;;;;;;;;;;;;;;;57816:59;;57949:8;57930:15;:27;;57929:88;;58002:15;57991:8;:26;;;;:::i;:::-;57929:88;;;57974:1;57929:88;57886:19;:31;57906:10;57886:31;;;;;;;;;;;;;;;:40;57918:7;57886:40;;;;;;;;;;;;;;;:131;;;;58056:7;58035:71;;58044:10;58035:71;;;58065:19;:31;58085:10;58065:31;;;;;;;;;;;;;;;:40;58097:7;58065:40;;;;;;;;;;;;;;;;58035:71;;;;;;:::i;:::-;;;;;;;;58124:4;58117:11;;;57714:422;;;;:::o;50291:634::-;50393:4;50367:2;25281:1;25267:16;;:2;:16;;;25263:49;;25309:2;25292:20;;;;;;;;;;;:::i;:::-;;;;;;;;25263:49;14276:21:::1;:19;:21::i;:::-;50410::::2;50442:23;;50434:5;:31;;;;:::i;:::-;50410:55;;50490:16;;;;;;;;;;;:56;;;;;50511:31;:35;50543:2;50511:35;;;;;;;;;;;;;;;;;;;;;;;;;50510:36;50490:56;50486:253;;;50582:14;;50566:13;:30;50562:67;;;50605:24;;;;;;;;;;;;;;50562:67;50680:14;;50663:13;50649:11;:27;;;;:::i;:::-;50648:46;50644:83;;;50703:24;;;;;;;;;;;;;;50644:83;50486:253;50784:13;50751:17;:29;50769:10;50751:29;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;50833:13;50808:17;:21;50826:2;50808:21;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;50885:2;50864:31;;50873:10;50864:31;;;50889:5;50864:31;;;;;;:::i;:::-;;;;;;;;50913:4;50906:11;;;14320:20:::1;:18;:20::i;:::-;50291:634:::0;;;;;:::o;23371:41::-;;;;;;;;;;;;;:::o;49682:101::-;49732:7;21781:16;21715:17;21863:28;;;;:::i;:::-;21715:17;21848:44;;;;:::i;:::-;49752:23;;49682:101;:::o;22463:34::-;;;;:::o;37961:514::-;38012:7;38032:19;38077:13;;;;;;;;;;;38032:60;;38104:16;38122;38144:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38103:59;;;;;38189:1;38177:8;:13;;;:30;;;;38206:1;38194:8;:13;;;38177:30;38173:84;;;38216:41;;;;;;;;;;:::i;:::-;;;;;;;;38173:84;38299:4;38274:30;;:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;;;38270:198;;38363:8;38355:17;;38348:4;38336:8;38328:17;;:24;;;;:::i;:::-;:44;;;;:::i;:::-;38321:51;;;;;;;38270:198;38447:8;38439:17;;38432:4;38420:8;38412:17;;:24;;;;:::i;:::-;:44;;;;:::i;:::-;38405:51;;;;;37961:514;;:::o;29491:160::-;17743:13;:11;:13::i;:::-;29635:8:::1;29592:31;:40;29624:7;29592:40;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;29491:160:::0;;:::o;23074:54::-;;;;:::o;33715:1303::-;14276:21;:19;:21::i;:::-;33828:3:::1;33810:15;;:21;;;;:::i;:::-;33794:12;:38;33790:67;;;33841:16;;;;;;;;;;;;;;33790:67;33902:1;33874:30;;:16;:30;;::::0;33870:92:::1;;33940:10;33921:29;;33870:92;33974:16;33993:9;33974:28;;34015:9;:7;:9::i;:::-;34074:1;34037:21;:33;34059:10;34037:33;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;34111:1;34092:16;;:20;34088:923;;;34129:23;34155:20;:18;:20::i;:::-;34129:46;;34213:1;34194:15;:20:::0;34190:63:::1;;34223:30;;;;;;;;;;:::i;:::-;;;;;;;;34190:63;34270:15;34299:9;34288:8;:20;;;;:::i;:::-;34270:38;;34323:15;34351:13;34341:7;:23;;;;:::i;:::-;34323:41;;34379:19;34448:3;34428:16;;34414:9;34403:7;:21;;;;:::i;:::-;34402:42;;;;:::i;:::-;34401:50;;;;:::i;:::-;34379:72;;34468:19;34513:15;34505:4;34491:11;:18;;;;:::i;:::-;34490:38;;;;:::i;:::-;34468:60;;34543:21;34581:23;;34567:11;:37;;;;:::i;:::-;34543:61;;34661:13;34625:17;:32;34651:4;34625:32;;;;;;;;;;;;;;;;:49;34621:379;;34731:13;34695:17;:32;34721:4;34695:32;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;34802:13;34763:17;:35;34781:16;34763:35;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;34865:16;34841:54;;34858:4;34841:54;;;34883:11;34841:54;;;;;;:::i;:::-;;;;;;;;34621:379;;;34954:16;34941:43;;;34972:11;34941:43;;;;;;:::i;:::-;;;;;;;;34621:379;34114:897;;;;;;34088:923;33779:1239;14320:20:::0;:18;:20::i;:::-;33715:1303;:::o;22811:41::-;;;;;;;;;;;;;;;;;;;;:::o;52679:153::-;52761:7;52788:19;:27;52808:6;52788:27;;;;;;;;;;;;;;;:36;52816:7;52788:36;;;;;;;;;;;;;;;;52781:43;;52679:153;;;;:::o;22663:43::-;;;;:::o;29116:108::-;17743:13;:11;:13::i;:::-;29200:16:::1;;;;;;;;;;;29199:17;29180:16;;:36;;;;;;;;;;;;;;;;;;29116:108::o:0;22859:39::-;;;;;;;;;;;;;;;;;;;;:::o;39919:403::-;40023:4;40040:18;40076:14;40061:12;:29;:93;;40142:12;40125:14;:29;;;;:::i;:::-;40061:93;;;40108:14;40093:12;:29;;;;:::i;:::-;40061:93;40040:114;;40165:28;40252:1;40234:14;40219:12;:29;;;;:::i;:::-;40218:35;;;;:::i;:::-;40210:3;40197:10;:16;;;;:::i;:::-;40196:58;;;;:::i;:::-;40165:89;;40296:18;;40272:20;:42;;40265:49;;;;39919:403;;;;:::o;18790:220::-;17743:13;:11;:13::i;:::-;18895:1:::1;18875:22;;:8;:22;;::::0;18871:93:::1;;18949:1;18921:31;;;;;;;;;;;:::i;:::-;;;;;;;;18871:93;18974:28;18993:8;18974:18;:28::i;:::-;18790:220:::0;:::o;22960:36::-;;;;;;;;;;;;;:::o;18022:166::-;18093:12;:10;:12::i;:::-;18082:23;;:7;:5;:7::i;:::-;:23;;;18078:103;;18156:12;:10;:12::i;:::-;18129:40;;;;;;;;;;;:::i;:::-;;;;;;;;18078:103;18022:166::o;14356:293::-;13758:1;14490:7;;:19;14482:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13758:1;14623:7;:18;;;;14356:293::o;14657:213::-;13714:1;14840:7;:22;;;;14657:213::o;19170:191::-;19244:16;19263:6;;;;;;;;;;;19244:25;;19289:8;19280:6;;:17;;;;;;;;;;;;;;;;;;19344:8;19313:40;;19334:8;19313:40;;;;;;;;;;;;19233:128;19170:191;:::o;35964:1268::-;36003:29;36035:26;:24;:26::i;:::-;36003:58;;36072:27;36102:24;:22;:24::i;:::-;36072:54;;36168:1;36143:21;:26;:54;;;;36196:1;36173:19;:24;36143:54;36139:91;;;36206:24;;;;;;;;;;:::i;:::-;;;;;;;;36139:91;36246:71;36274:19;36295:21;36246:27;:71::i;:::-;36241:112;;36326:27;;;;;;;;;;;;;;36241:112;36366:23;36392:39;36411:19;36392:18;:39::i;:::-;36366:65;;36465:1;36446:15;:20;36442:63;;36475:30;;;;;;;;;;:::i;:::-;;;;;;;;36442:63;36518:20;36568:8;;36560:4;36542:15;:22;;;;:::i;:::-;36541:35;;;;:::i;:::-;36518:58;;36587:24;36646:4;36630:12;;36615;:27;;;;:::i;:::-;36614:36;;;;:::i;:::-;36587:63;;36687:17;36667:16;:38;36663:303;;;36760:2;36741:16;:21;;;;:::i;:::-;36722:40;;36799:2;36788:8;;:13;;;;:::i;:::-;36777:8;:24;;;;36663:303;;;36843:14;36823:16;:35;36819:147;;;36913:2;36894:16;:21;;;;:::i;:::-;36875:40;;36952:2;36941:8;;:13;;;;:::i;:::-;36930:8;:24;;;;36819:147;36663:303;36993:16;36978:12;:31;;;;37065:12;;21781:16;21715:17;21863:28;;;;:::i;:::-;21715:17;21848:44;;;;:::i;:::-;37046:31;;;;:::i;:::-;37020:23;:57;;;;37106:12;37088:15;:30;;;;37136;37143:12;;37157:8;;37136:30;;;;;;;:::i;:::-;;;;;;;;37202:13;;;;;;;;;;;37179:43;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35992:1240;;;;;35964:1268::o;15866:98::-;15919:7;15946:10;15939:17;;15866:98;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:139::-;811:6;806:3;801;795:23;852:1;843:6;838:3;834:16;827:27;722:139;;;:::o;867:102::-;908:6;959:2;955:7;950:2;943:5;939:14;935:28;925:38;;867:102;;;:::o;975:377::-;1063:3;1091:39;1124:5;1091:39;:::i;:::-;1146:71;1210:6;1205:3;1146:71;:::i;:::-;1139:78;;1226:65;1284:6;1279:3;1272:4;1265:5;1261:16;1226:65;:::i;:::-;1316:29;1338:6;1316:29;:::i;:::-;1311:3;1307:39;1300:46;;1067:285;975:377;;;;:::o;1358:313::-;1471:4;1509:2;1498:9;1494:18;1486:26;;1558:9;1552:4;1548:20;1544:1;1533:9;1529:17;1522:47;1586:78;1659:4;1650:6;1586:78;:::i;:::-;1578:86;;1358:313;;;;:::o;1758:117::-;1867:1;1864;1857:12;2004:126;2041:7;2081:42;2074:5;2070:54;2059:65;;2004:126;;;:::o;2136:96::-;2173:7;2202:24;2220:5;2202:24;:::i;:::-;2191:35;;2136:96;;;:::o;2238:122::-;2311:24;2329:5;2311:24;:::i;:::-;2304:5;2301:35;2291:63;;2350:1;2347;2340:12;2291:63;2238:122;:::o;2366:139::-;2412:5;2450:6;2437:20;2428:29;;2466:33;2493:5;2466:33;:::i;:::-;2366:139;;;;:::o;2511:122::-;2584:24;2602:5;2584:24;:::i;:::-;2577:5;2574:35;2564:63;;2623:1;2620;2613:12;2564:63;2511:122;:::o;2639:139::-;2685:5;2723:6;2710:20;2701:29;;2739:33;2766:5;2739:33;:::i;:::-;2639:139;;;;:::o;2784:474::-;2852:6;2860;2909:2;2897:9;2888:7;2884:23;2880:32;2877:119;;;2915:79;;:::i;:::-;2877:119;3035:1;3060:53;3105:7;3096:6;3085:9;3081:22;3060:53;:::i;:::-;3050:63;;3006:117;3162:2;3188:53;3233:7;3224:6;3213:9;3209:22;3188:53;:::i;:::-;3178:63;;3133:118;2784:474;;;;;:::o;3264:90::-;3298:7;3341:5;3334:13;3327:21;3316:32;;3264:90;;;:::o;3360:109::-;3441:21;3456:5;3441:21;:::i;:::-;3436:3;3429:34;3360:109;;:::o;3475:210::-;3562:4;3600:2;3589:9;3585:18;3577:26;;3613:65;3675:1;3664:9;3660:17;3651:6;3613:65;:::i;:::-;3475:210;;;;:::o;3691:329::-;3750:6;3799:2;3787:9;3778:7;3774:23;3770:32;3767:119;;;3805:79;;:::i;:::-;3767:119;3925:1;3950:53;3995:7;3986:6;3975:9;3971:22;3950:53;:::i;:::-;3940:63;;3896:117;3691:329;;;;:::o;4026:::-;4085:6;4134:2;4122:9;4113:7;4109:23;4105:32;4102:119;;;4140:79;;:::i;:::-;4102:119;4260:1;4285:53;4330:7;4321:6;4310:9;4306:22;4285:53;:::i;:::-;4275:63;;4231:117;4026:329;;;;:::o;4361:60::-;4389:3;4410:5;4403:12;;4361:60;;;:::o;4427:142::-;4477:9;4510:53;4528:34;4537:24;4555:5;4537:24;:::i;:::-;4528:34;:::i;:::-;4510:53;:::i;:::-;4497:66;;4427:142;;;:::o;4575:126::-;4625:9;4658:37;4689:5;4658:37;:::i;:::-;4645:50;;4575:126;;;:::o;4707:152::-;4783:9;4816:37;4847:5;4816:37;:::i;:::-;4803:50;;4707:152;;;:::o;4865:183::-;4978:63;5035:5;4978:63;:::i;:::-;4973:3;4966:76;4865:183;;:::o;5054:274::-;5173:4;5211:2;5200:9;5196:18;5188:26;;5224:97;5318:1;5307:9;5303:17;5294:6;5224:97;:::i;:::-;5054:274;;;;:::o;5334:619::-;5411:6;5419;5427;5476:2;5464:9;5455:7;5451:23;5447:32;5444:119;;;5482:79;;:::i;:::-;5444:119;5602:1;5627:53;5672:7;5663:6;5652:9;5648:22;5627:53;:::i;:::-;5617:63;;5573:117;5729:2;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5700:118;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;5334:619;;;;;:::o;5959:111::-;6023:6;6057:5;6051:12;6041:22;;5959:111;;;:::o;6076:181::-;6172:11;6206:6;6201:3;6194:19;6246:4;6241:3;6237:14;6222:29;;6076:181;;;;:::o;6263:129::-;6327:4;6350:3;6342:11;;6380:4;6375:3;6371:14;6363:22;;6263:129;;;:::o;6398:99::-;6469:21;6484:5;6469:21;:::i;:::-;6464:3;6457:34;6398:99;;:::o;6503:167::-;6566:10;6587:40;6623:3;6615:6;6587:40;:::i;:::-;6659:4;6654:3;6650:14;6636:28;;6503:167;;;;:::o;6676:110::-;6743:4;6775;6770:3;6766:14;6758:22;;6676:110;;;:::o;6816:708::-;6929:3;6958:51;7003:5;6958:51;:::i;:::-;7025:83;7101:6;7096:3;7025:83;:::i;:::-;7018:90;;7132:53;7179:5;7132:53;:::i;:::-;7208:7;7239:1;7224:275;7249:6;7246:1;7243:13;7224:275;;;7325:6;7319:13;7352:57;7405:3;7390:13;7352:57;:::i;:::-;7345:64;;7432:57;7482:6;7432:57;:::i;:::-;7422:67;;7284:215;7271:1;7268;7264:9;7259:14;;7224:275;;;7228:14;7515:3;7508:10;;6934:590;;;6816:708;;;;:::o;7530:361::-;7667:4;7705:2;7694:9;7690:18;7682:26;;7754:9;7748:4;7744:20;7740:1;7729:9;7725:17;7718:47;7782:102;7879:4;7870:6;7782:102;:::i;:::-;7774:110;;7530:361;;;;:::o;7897:86::-;7932:7;7972:4;7965:5;7961:16;7950:27;;7897:86;;;:::o;7989:112::-;8072:22;8088:5;8072:22;:::i;:::-;8067:3;8060:35;7989:112;;:::o;8107:214::-;8196:4;8234:2;8223:9;8219:18;8211:26;;8247:67;8311:1;8300:9;8296:17;8287:6;8247:67;:::i;:::-;8107:214;;;;:::o;8327:332::-;8448:4;8486:2;8475:9;8471:18;8463:26;;8499:71;8567:1;8556:9;8552:17;8543:6;8499:71;:::i;:::-;8580:72;8648:2;8637:9;8633:18;8624:6;8580:72;:::i;:::-;8327:332;;;;;:::o;8665:148::-;8737:9;8770:37;8801:5;8770:37;:::i;:::-;8757:50;;8665:148;;;:::o;8819:175::-;8928:59;8981:5;8928:59;:::i;:::-;8923:3;8916:72;8819:175;;:::o;9000:266::-;9115:4;9153:2;9142:9;9138:18;9130:26;;9166:93;9256:1;9245:9;9241:17;9232:6;9166:93;:::i;:::-;9000:266;;;;:::o;9272:474::-;9340:6;9348;9397:2;9385:9;9376:7;9372:23;9368:32;9365:119;;;9403:79;;:::i;:::-;9365:119;9523:1;9548:53;9593:7;9584:6;9573:9;9569:22;9548:53;:::i;:::-;9538:63;;9494:117;9650:2;9676:53;9721:7;9712:6;9701:9;9697:22;9676:53;:::i;:::-;9666:63;;9621:118;9272:474;;;;;:::o;9752:::-;9820:6;9828;9877:2;9865:9;9856:7;9852:23;9848:32;9845:119;;;9883:79;;:::i;:::-;9845:119;10003:1;10028:53;10073:7;10064:6;10053:9;10049:22;10028:53;:::i;:::-;10018:63;;9974:117;10130:2;10156:53;10201:7;10192:6;10181:9;10177:22;10156:53;:::i;:::-;10146:63;;10101:118;9752:474;;;;;:::o;10232:118::-;10319:24;10337:5;10319:24;:::i;:::-;10314:3;10307:37;10232:118;;:::o;10356:222::-;10449:4;10487:2;10476:9;10472:18;10464:26;;10500:71;10568:1;10557:9;10553:17;10544:6;10500:71;:::i;:::-;10356:222;;;;:::o;10584:155::-;10663:9;10696:37;10727:5;10696:37;:::i;:::-;10683:50;;10584:155;;;:::o;10745:189::-;10861:66;10921:5;10861:66;:::i;:::-;10856:3;10849:79;10745:189;;:::o;10940:280::-;11062:4;11100:2;11089:9;11085:18;11077:26;;11113:100;11210:1;11199:9;11195:17;11186:6;11113:100;:::i;:::-;10940:280;;;;:::o;11226:116::-;11296:21;11311:5;11296:21;:::i;:::-;11289:5;11286:32;11276:60;;11332:1;11329;11322:12;11276:60;11226:116;:::o;11348:133::-;11391:5;11429:6;11416:20;11407:29;;11445:30;11469:5;11445:30;:::i;:::-;11348:133;;;;:::o;11487:468::-;11552:6;11560;11609:2;11597:9;11588:7;11584:23;11580:32;11577:119;;;11615:79;;:::i;:::-;11577:119;11735:1;11760:53;11805:7;11796:6;11785:9;11781:22;11760:53;:::i;:::-;11750:63;;11706:117;11862:2;11888:50;11930:7;11921:6;11910:9;11906:22;11888:50;:::i;:::-;11878:60;;11833:115;11487:468;;;;;:::o;11961:180::-;12009:77;12006:1;11999:88;12106:4;12103:1;12096:15;12130:4;12127:1;12120:15;12147:320;12191:6;12228:1;12222:4;12218:12;12208:22;;12275:1;12269:4;12265:12;12296:18;12286:81;;12352:4;12344:6;12340:17;12330:27;;12286:81;12414:2;12406:6;12403:14;12383:18;12380:38;12377:84;;12433:18;;:::i;:::-;12377:84;12198:269;12147:320;;;:::o;12473:167::-;12613:19;12609:1;12601:6;12597:14;12590:43;12473:167;:::o;12646:366::-;12788:3;12809:67;12873:2;12868:3;12809:67;:::i;:::-;12802:74;;12885:93;12974:3;12885:93;:::i;:::-;13003:2;12998:3;12994:12;12987:19;;12646:366;;;:::o;13018:419::-;13184:4;13222:2;13211:9;13207:18;13199:26;;13271:9;13265:4;13261:20;13257:1;13246:9;13242:17;13235:47;13299:131;13425:4;13299:131;:::i;:::-;13291:139;;13018:419;;;:::o;13443:180::-;13491:77;13488:1;13481:88;13588:4;13585:1;13578:15;13612:4;13609:1;13602:15;13629:410;13669:7;13692:20;13710:1;13692:20;:::i;:::-;13687:25;;13726:20;13744:1;13726:20;:::i;:::-;13721:25;;13781:1;13778;13774:9;13803:30;13821:11;13803:30;:::i;:::-;13792:41;;13982:1;13973:7;13969:15;13966:1;13963:22;13943:1;13936:9;13916:83;13893:139;;14012:18;;:::i;:::-;13893:139;13677:362;13629:410;;;;:::o;14045:194::-;14085:4;14105:20;14123:1;14105:20;:::i;:::-;14100:25;;14139:20;14157:1;14139:20;:::i;:::-;14134:25;;14183:1;14180;14176:9;14168:17;;14207:1;14201:4;14198:11;14195:37;;;14212:18;;:::i;:::-;14195:37;14045:194;;;;:::o;14245:191::-;14285:3;14304:20;14322:1;14304:20;:::i;:::-;14299:25;;14338:20;14356:1;14338:20;:::i;:::-;14333:25;;14381:1;14378;14374:9;14367:16;;14402:3;14399:1;14396:10;14393:36;;;14409:18;;:::i;:::-;14393:36;14245:191;;;;:::o;14442:159::-;14582:11;14578:1;14570:6;14566:14;14559:35;14442:159;:::o;14607:365::-;14749:3;14770:66;14834:1;14829:3;14770:66;:::i;:::-;14763:73;;14845:93;14934:3;14845:93;:::i;:::-;14963:2;14958:3;14954:12;14947:19;;14607:365;;;:::o;14978:419::-;15144:4;15182:2;15171:9;15167:18;15159:26;;15231:9;15225:4;15221:20;15217:1;15206:9;15202:17;15195:47;15259:131;15385:4;15259:131;:::i;:::-;15251:139;;14978:419;;;:::o;15403:156::-;15543:8;15539:1;15531:6;15527:14;15520:32;15403:156;:::o;15565:365::-;15707:3;15728:66;15792:1;15787:3;15728:66;:::i;:::-;15721:73;;15803:93;15892:3;15803:93;:::i;:::-;15921:2;15916:3;15912:12;15905:19;;15565:365;;;:::o;15936:419::-;16102:4;16140:2;16129:9;16125:18;16117:26;;16189:9;16183:4;16179:20;16175:1;16164:9;16160:17;16153:47;16217:131;16343:4;16217:131;:::i;:::-;16209:139;;15936:419;;;:::o;16361:180::-;16409:77;16406:1;16399:88;16506:4;16503:1;16496:15;16530:4;16527:1;16520:15;16547:180;16595:77;16592:1;16585:88;16692:4;16689:1;16682:15;16716:4;16713:1;16706:15;16733:185;16773:1;16790:20;16808:1;16790:20;:::i;:::-;16785:25;;16824:20;16842:1;16824:20;:::i;:::-;16819:25;;16863:1;16853:35;;16868:18;;:::i;:::-;16853:35;16910:1;16907;16903:9;16898:14;;16733:185;;;;:::o;16924:180::-;16972:77;16969:1;16962:88;17069:4;17066:1;17059:15;17093:4;17090:1;17083:15;17110:114;17147:7;17187:30;17180:5;17176:42;17165:53;;17110:114;;;:::o;17230:122::-;17303:24;17321:5;17303:24;:::i;:::-;17296:5;17293:35;17283:63;;17342:1;17339;17332:12;17283:63;17230:122;:::o;17358:143::-;17415:5;17446:6;17440:13;17431:22;;17462:33;17489:5;17462:33;:::i;:::-;17358:143;;;;:::o;17507:93::-;17543:7;17583:10;17576:5;17572:22;17561:33;;17507:93;;;:::o;17606:120::-;17678:23;17695:5;17678:23;:::i;:::-;17671:5;17668:34;17658:62;;17716:1;17713;17706:12;17658:62;17606:120;:::o;17732:141::-;17788:5;17819:6;17813:13;17804:22;;17835:32;17861:5;17835:32;:::i;:::-;17732:141;;;;:::o;17879:661::-;17966:6;17974;17982;18031:2;18019:9;18010:7;18006:23;18002:32;17999:119;;;18037:79;;:::i;:::-;17999:119;18157:1;18182:64;18238:7;18229:6;18218:9;18214:22;18182:64;:::i;:::-;18172:74;;18128:128;18295:2;18321:64;18377:7;18368:6;18357:9;18353:22;18321:64;:::i;:::-;18311:74;;18266:129;18434:2;18460:63;18515:7;18506:6;18495:9;18491:22;18460:63;:::i;:::-;18450:73;;18405:128;17879:661;;;;;:::o;18546:167::-;18686:19;18682:1;18674:6;18670:14;18663:43;18546:167;:::o;18719:366::-;18861:3;18882:67;18946:2;18941:3;18882:67;:::i;:::-;18875:74;;18958:93;19047:3;18958:93;:::i;:::-;19076:2;19071:3;19067:12;19060:19;;18719:366;;;:::o;19091:419::-;19257:4;19295:2;19284:9;19280:18;19272:26;;19344:9;19338:4;19334:20;19330:1;19319:9;19315:17;19308:47;19372:131;19498:4;19372:131;:::i;:::-;19364:139;;19091:419;;;:::o;19516:143::-;19573:5;19604:6;19598:13;19589:22;;19620:33;19647:5;19620:33;:::i;:::-;19516:143;;;;:::o;19665:351::-;19735:6;19784:2;19772:9;19763:7;19759:23;19755:32;19752:119;;;19790:79;;:::i;:::-;19752:119;19910:1;19935:64;19991:7;19982:6;19971:9;19967:22;19935:64;:::i;:::-;19925:74;;19881:128;19665:351;;;;:::o;20022:163::-;20162:15;20158:1;20150:6;20146:14;20139:39;20022:163;:::o;20191:366::-;20333:3;20354:67;20418:2;20413:3;20354:67;:::i;:::-;20347:74;;20430:93;20519:3;20430:93;:::i;:::-;20548:2;20543:3;20539:12;20532:19;;20191:366;;;:::o;20563:419::-;20729:4;20767:2;20756:9;20752:18;20744:26;;20816:9;20810:4;20806:20;20802:1;20791:9;20787:17;20780:47;20844:131;20970:4;20844:131;:::i;:::-;20836:139;;20563:419;;;:::o;20988:153::-;21128:5;21124:1;21116:6;21112:14;21105:29;20988:153;:::o;21147:365::-;21289:3;21310:66;21374:1;21369:3;21310:66;:::i;:::-;21303:73;;21385:93;21474:3;21385:93;:::i;:::-;21503:2;21498:3;21494:12;21487:19;;21147:365;;;:::o;21518:419::-;21684:4;21722:2;21711:9;21707:18;21699:26;;21771:9;21765:4;21761:20;21757:1;21746:9;21742:17;21735:47;21799:131;21925:4;21799:131;:::i;:::-;21791:139;;21518:419;;;:::o;21943:177::-;22083:29;22079:1;22071:6;22067:14;22060:53;21943:177;:::o;22126:366::-;22268:3;22289:67;22353:2;22348:3;22289:67;:::i;:::-;22282:74;;22365:93;22454:3;22365:93;:::i;:::-;22483:2;22478:3;22474:12;22467:19;;22126:366;;;:::o;22498:419::-;22664:4;22702:2;22691:9;22687:18;22679:26;;22751:9;22745:4;22741:20;22737:1;22726:9;22722:17;22715:47;22779:131;22905:4;22779:131;:::i;:::-;22771:139;;22498:419;;;:::o;22923:85::-;22968:7;22997:5;22986:16;;22923:85;;;:::o;23014:158::-;23072:9;23105:61;23123:42;23132:32;23158:5;23132:32;:::i;:::-;23123:42;:::i;:::-;23105:61;:::i;:::-;23092:74;;23014:158;;;:::o;23178:147::-;23273:45;23312:5;23273:45;:::i;:::-;23268:3;23261:58;23178:147;;:::o;23331:807::-;23580:4;23618:3;23607:9;23603:19;23595:27;;23632:71;23700:1;23689:9;23685:17;23676:6;23632:71;:::i;:::-;23713:72;23781:2;23770:9;23766:18;23757:6;23713:72;:::i;:::-;23795:80;23871:2;23860:9;23856:18;23847:6;23795:80;:::i;:::-;23885;23961:2;23950:9;23946:18;23937:6;23885:80;:::i;:::-;23975:73;24043:3;24032:9;24028:19;24019:6;23975:73;:::i;:::-;24058;24126:3;24115:9;24111:19;24102:6;24058:73;:::i;:::-;23331:807;;;;;;;;;:::o;24144:143::-;24201:5;24232:6;24226:13;24217:22;;24248:33;24275:5;24248:33;:::i;:::-;24144:143;;;;:::o;24293:663::-;24381:6;24389;24397;24446:2;24434:9;24425:7;24421:23;24417:32;24414:119;;;24452:79;;:::i;:::-;24414:119;24572:1;24597:64;24653:7;24644:6;24633:9;24629:22;24597:64;:::i;:::-;24587:74;;24543:128;24710:2;24736:64;24792:7;24783:6;24772:9;24768:22;24736:64;:::i;:::-;24726:74;;24681:129;24849:2;24875:64;24931:7;24922:6;24911:9;24907:22;24875:64;:::i;:::-;24865:74;;24820:129;24293:663;;;;;:::o;24962:176::-;24994:1;25011:20;25029:1;25011:20;:::i;:::-;25006:25;;25045:20;25063:1;25045:20;:::i;:::-;25040:25;;25084:1;25074:35;;25089:18;;:::i;:::-;25074:35;25130:1;25127;25123:9;25118:14;;24962:176;;;;:::o;25144:442::-;25293:4;25331:2;25320:9;25316:18;25308:26;;25344:71;25412:1;25401:9;25397:17;25388:6;25344:71;:::i;:::-;25425:72;25493:2;25482:9;25478:18;25469:6;25425:72;:::i;:::-;25507;25575:2;25564:9;25560:18;25551:6;25507:72;:::i;:::-;25144:442;;;;;;:::o;25592:105::-;25628:7;25668:22;25661:5;25657:34;25646:45;;25592:105;;;:::o;25703:120::-;25775:23;25792:5;25775:23;:::i;:::-;25768:5;25765:34;25755:62;;25813:1;25810;25803:12;25755:62;25703:120;:::o;25829:141::-;25885:5;25916:6;25910:13;25901:22;;25932:32;25958:5;25932:32;:::i;:::-;25829:141;;;;:::o;25976:76::-;26012:7;26041:5;26030:16;;25976:76;;;:::o;26058:120::-;26130:23;26147:5;26130:23;:::i;:::-;26123:5;26120:34;26110:62;;26168:1;26165;26158:12;26110:62;26058:120;:::o;26184:141::-;26240:5;26271:6;26265:13;26256:22;;26287:32;26313:5;26287:32;:::i;:::-;26184:141;;;;:::o;26331:971::-;26434:6;26442;26450;26458;26466;26515:3;26503:9;26494:7;26490:23;26486:33;26483:120;;;26522:79;;:::i;:::-;26483:120;26642:1;26667:63;26722:7;26713:6;26702:9;26698:22;26667:63;:::i;:::-;26657:73;;26613:127;26779:2;26805:63;26860:7;26851:6;26840:9;26836:22;26805:63;:::i;:::-;26795:73;;26750:128;26917:2;26943:64;26999:7;26990:6;26979:9;26975:22;26943:64;:::i;:::-;26933:74;;26888:129;27056:2;27082:64;27138:7;27129:6;27118:9;27114:22;27082:64;:::i;:::-;27072:74;;27027:129;27195:3;27222:63;27277:7;27268:6;27257:9;27253:22;27222:63;:::i;:::-;27212:73;;27166:129;26331:971;;;;;;;;:::o;27308:168::-;27448:20;27444:1;27436:6;27432:14;27425:44;27308:168;:::o;27482:366::-;27624:3;27645:67;27709:2;27704:3;27645:67;:::i;:::-;27638:74;;27721:93;27810:3;27721:93;:::i;:::-;27839:2;27834:3;27830:12;27823:19;;27482:366;;;:::o;27854:419::-;28020:4;28058:2;28047:9;28043:18;28035:26;;28107:9;28101:4;28097:20;28093:1;28082:9;28078:17;28071:47;28135:131;28261:4;28135:131;:::i;:::-;28127:139;;27854:419;;;:::o;28279:170::-;28419:22;28415:1;28407:6;28403:14;28396:46;28279:170;:::o;28455:366::-;28597:3;28618:67;28682:2;28677:3;28618:67;:::i;:::-;28611:74;;28694:93;28783:3;28694:93;:::i;:::-;28812:2;28807:3;28803:12;28796:19;;28455:366;;;:::o;28827:419::-;28993:4;29031:2;29020:9;29016:18;29008:26;;29080:9;29074:4;29070:20;29066:1;29055:9;29051:17;29044:47;29108:131;29234:4;29108:131;:::i;:::-;29100:139;;28827:419;;;:::o;29252:165::-;29392:17;29388:1;29380:6;29376:14;29369:41;29252:165;:::o;29423:366::-;29565:3;29586:67;29650:2;29645:3;29586:67;:::i;:::-;29579:74;;29662:93;29751:3;29662:93;:::i;:::-;29780:2;29775:3;29771:12;29764:19;;29423:366;;;:::o;29795:419::-;29961:4;29999:2;29988:9;29984:18;29976:26;;30048:9;30042:4;30038:20;30034:1;30023:9;30019:17;30012:47;30076:131;30202:4;30076:131;:::i;:::-;30068:139;;29795:419;;;:::o;30220:163::-;30360:15;30356:1;30348:6;30344:14;30337:39;30220:163;:::o;30389:366::-;30531:3;30552:67;30616:2;30611:3;30552:67;:::i;:::-;30545:74;;30628:93;30717:3;30628:93;:::i;:::-;30746:2;30741:3;30737:12;30730:19;;30389:366;;;:::o;30761:419::-;30927:4;30965:2;30954:9;30950:18;30942:26;;31014:9;31008:4;31004:20;31000:1;30989:9;30985:17;30978:47;31042:131;31168:4;31042:131;:::i;:::-;31034:139;;30761:419;;;:::o;31186:158::-;31326:10;31322:1;31314:6;31310:14;31303:34;31186:158;:::o;31350:365::-;31492:3;31513:66;31577:1;31572:3;31513:66;:::i;:::-;31506:73;;31588:93;31677:3;31588:93;:::i;:::-;31706:2;31701:3;31697:12;31690:19;;31350:365;;;:::o;31721:419::-;31887:4;31925:2;31914:9;31910:18;31902:26;;31974:9;31968:4;31964:20;31960:1;31949:9;31945:17;31938:47;32002:131;32128:4;32002:131;:::i;:::-;31994:139;;31721:419;;;:::o;32146:170::-;32286:22;32282:1;32274:6;32270:14;32263:46;32146:170;:::o;32322:366::-;32464:3;32485:67;32549:2;32544:3;32485:67;:::i;:::-;32478:74;;32561:93;32650:3;32561:93;:::i;:::-;32679:2;32674:3;32670:12;32663:19;;32322:366;;;:::o;32694:419::-;32860:4;32898:2;32887:9;32883:18;32875:26;;32947:9;32941:4;32937:20;32933:1;32922:9;32918:17;32911:47;32975:131;33101:4;32975:131;:::i;:::-;32967:139;;32694:419;;;:::o;33119:775::-;33352:4;33390:3;33379:9;33375:19;33367:27;;33404:71;33472:1;33461:9;33457:17;33448:6;33404:71;:::i;:::-;33485:72;33553:2;33542:9;33538:18;33529:6;33485:72;:::i;:::-;33567;33635:2;33624:9;33620:18;33611:6;33567:72;:::i;:::-;33649;33717:2;33706:9;33702:18;33693:6;33649:72;:::i;:::-;33731:73;33799:3;33788:9;33784:19;33775:6;33731:73;:::i;:::-;33814;33882:3;33871:9;33867:19;33858:6;33814:73;:::i;:::-;33119:775;;;;;;;;;:::o;33900:168::-;34040:20;34036:1;34028:6;34024:14;34017:44;33900:168;:::o;34074:366::-;34216:3;34237:67;34301:2;34296:3;34237:67;:::i;:::-;34230:74;;34313:93;34402:3;34313:93;:::i;:::-;34431:2;34426:3;34422:12;34415:19;;34074:366;;;:::o;34446:419::-;34612:4;34650:2;34639:9;34635:18;34627:26;;34699:9;34693:4;34689:20;34685:1;34674:9;34670:17;34663:47;34727:131;34853:4;34727:131;:::i;:::-;34719:139;;34446:419;;;:::o;34871:159::-;35011:11;35007:1;34999:6;34995:14;34988:35;34871:159;:::o;35036:365::-;35178:3;35199:66;35263:1;35258:3;35199:66;:::i;:::-;35192:73;;35274:93;35363:3;35274:93;:::i;:::-;35392:2;35387:3;35383:12;35376:19;;35036:365;;;:::o;35407:419::-;35573:4;35611:2;35600:9;35596:18;35588:26;;35660:9;35654:4;35650:20;35646:1;35635:9;35631:17;35624:47;35688:131;35814:4;35688:131;:::i;:::-;35680:139;;35407:419;;;:::o;35832:181::-;35972:33;35968:1;35960:6;35956:14;35949:57;35832:181;:::o;36019:366::-;36161:3;36182:67;36246:2;36241:3;36182:67;:::i;:::-;36175:74;;36258:93;36347:3;36258:93;:::i;:::-;36376:2;36371:3;36367:12;36360:19;;36019:366;;;:::o;36391:419::-;36557:4;36595:2;36584:9;36580:18;36572:26;;36644:9;36638:4;36634:20;36630:1;36619:9;36615:17;36608:47;36672:131;36798:4;36672:131;:::i;:::-;36664:139;;36391:419;;;:::o;36816:159::-;36956:11;36952:1;36944:6;36940:14;36933:35;36816:159;:::o;36981:365::-;37123:3;37144:66;37208:1;37203:3;37144:66;:::i;:::-;37137:73;;37219:93;37308:3;37219:93;:::i;:::-;37337:2;37332:3;37328:12;37321:19;;36981:365;;;:::o;37352:419::-;37518:4;37556:2;37545:9;37541:18;37533:26;;37605:9;37599:4;37595:20;37591:1;37580:9;37576:17;37569:47;37633:131;37759:4;37633:131;:::i;:::-;37625:139;;37352:419;;;:::o

Swarm Source

ipfs://96faa941e28b5b1473bf7633cdeb1f21a7c70d641d69a702bacc8bf1be125af3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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