ETH Price: $2,222.96 (-7.73%)

Token

BrownFi V2 (BF-V2)

Overview

Max Total Supply

3,190.830353854900650484 BF-V2

Holders

6

Transfers

-
0

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BrownFiV2Pair

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 999999 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;

import './interfaces/IBrownFiV2Pair.sol';
import './BrownFiV2ERC20.sol';
import './libraries/Math.sol';
import '@uniswap/v3-core/contracts/libraries/FullMath.sol';
import './libraries/UQ112x112.sol';
import './interfaces/IERC20.sol';
import './interfaces/IBrownFiV2Factory.sol';
import './interfaces/IBrownFiV2Callee.sol';

contract BrownFiV2Pair is IBrownFiV2Pair, BrownFiV2ERC20 {
    using SafeMath  for uint;
    using UQ112x112 for uint224;

    uint public constant override MINIMUM_LIQUIDITY = 10**3;
    uint32 public constant PRECISION = 10**8;
    uint public constant Q64 = 1 << 64;

    address public immutable override factory;
    address public override token0;
    uint8 public token0Decimals;
    address public override token1;
    uint8 public token1Decimals;

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves
    uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

    bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
    uint public override k = uint(Q64) / 1000;   // default 0.001
    uint64 public override lambda = 0;           // default 0
    uint32 public override fee = 300_000;        // default 0.3%
    uint64 public protocolFee = 10_000_000;      // default 10%

    uint private unlocked = 1;
    modifier lock() {
        require(unlocked == 1, 'BrownFiV2: LOCKED');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    modifier whenNotPaused() {
        require(!IBrownFiV2Factory(factory).isPaused(), "BrownFiV2: PAUSED");
        _;
    }

    modifier onlyFactory() {
        require(msg.sender == factory, 'BrownFiV2: ONLY_FACTORY');
        _;
    }

    function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(address token, address to, uint value) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'BrownFiV2: TRANSFER_FAILED');
    }

    constructor() {
        factory = msg.sender;
    }

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external {
        require(msg.sender == factory, 'BrownFiV2: FORBIDDEN'); // sufficient check
        require(_token0 != address(0) && _token1 != address(0), 'BrownFiV2: ZERO_ADDRESS');
        token0 = _token0;
        token1 = _token1;
        token0Decimals = IERC20(_token0).decimals();
        token1Decimals = IERC20(_token1).decimals();
    }

    function _getPrices() internal view returns (uint price0, uint price1) {
        uint minPriceAge = IBrownFiV2Factory(factory).minPriceAge();
        price0 = IBrownFiV2Factory(factory).priceOf(token0, minPriceAge);
        price1 = IBrownFiV2Factory(factory).priceOf(token1, minPriceAge);
    }

    /**
    * @dev convert raw amount to default decimals amount
     */
    function _parseAmountToDefaultDecimals(uint8 tokenDecimals, uint amount) internal pure returns (uint formattedAmount) {
        formattedAmount = tokenDecimals > decimals ? 
            amount / 10**uint(tokenDecimals - decimals) : amount * 10**uint(decimals - tokenDecimals);
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(uint balance0, uint balance1) private {
        require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'BrownFiV2: OVERFLOW');
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external lock whenNotPaused returns (uint liquidity) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        uint balance0 = IERC20(token0).balanceOf(address(this));
        uint balance1 = IERC20(token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);
        (uint price0, uint price1) = _getPrices();

        uint parsedAmount0 = _parseAmountToDefaultDecimals(token0Decimals, amount0);
        uint parsedAmount1 = _parseAmountToDefaultDecimals(token1Decimals, amount1);

        uint minValue = Math.min(parsedAmount0.mul(price0), parsedAmount1.mul(price1));

        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = minValue.mul(2) / Q64 - MINIMUM_LIQUIDITY;
           _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            uint parsedReserve0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
            uint parsedReserve1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
            liquidity = FullMath.mulDiv(
                _totalSupply,
                minValue.mul(2),
                price0.mul(parsedReserve0).add(
                    price1.mul(parsedReserve1)
                )
            );
        }
        require(liquidity > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_MINTED');
        _mint(to, liquidity);

        _update(balance0, balance1);
        emit Mint(msg.sender, amount0, amount1, price0, price1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address to) external lock whenNotPaused returns (uint amount0, uint amount1) {
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];

        // bool feeOn = _mintFee(_reserve0, _reserve1);
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(amount0 > 0 && amount1 > 0, 'BrownFiV2: INSUFFICIENT_LIQUIDITY_BURNED');
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1);
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock whenNotPaused {
        require(amount0Out > 0 || amount1Out > 0, 'BrownFiV2: INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        require(amount0Out.mul(10) <= uint(_reserve0).mul(8) && amount1Out.mul(10) <= uint(_reserve1).mul(8), 'BrownFiV2: INSUFFICIENT_LIQUIDITY');

        uint balance0;
        uint balance1;
        { // scope for _token{0,1}, avoids stack too deep errors
        address _token0 = token0;
        address _token1 = token1;
        require(to != _token0 && to != _token1, 'BrownFiV2: INVALID_TO');
        if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
        if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
        if (data.length > 0) IBrownFiV2Callee(to).brownFiV2Call(msg.sender, amount0Out, amount1Out, data);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
        uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
        require(amount0In > 0 || amount1In > 0, 'BrownFiV2: INSUFFICIENT_INPUT_AMOUNT');
        { // scope for reserve{0,1}Adjusted, avoids stack too deep errors
        (uint price0, uint price1) = _getPrices();
        (uint sPrice0, uint sPrice1) = (price0, price1);
        if (lambda > 0) {
            (sPrice0, sPrice1) = computeSkewnessPrice(_reserve0, _reserve1, price0, price1);
        }
        uint amount0OutWithoutFee = FullMath.mulDiv(amount0Out, PRECISION, PRECISION + fee);
        uint amount1OutWithoutFee = FullMath.mulDiv(amount1Out, PRECISION, PRECISION + fee);
        // check inventory
        if (amount0Out > 0) {
            checkInventory(balance0, balance1, sPrice0, sPrice1, amount0OutWithoutFee, false);
        }
        if (amount1Out > 0) {
            checkInventory(balance0, balance1, sPrice0, sPrice1, amount1OutWithoutFee, true);
        }

        _update(balance0, balance1);
        // calculate protocol fee
        if(protocolFee > 0) {
            uint lpForProtocol;
            uint _totalSupply = totalSupply;
            uint inventoryRight = computeInventoryRight(price0, price1);
            if (amount0In > 0) {
                uint _amount0In = _parseAmountToDefaultDecimals(token0Decimals, amount0In);
                uint tradingFee = FullMath.mulDiv(_amount0In, fee, PRECISION + fee);
                uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price0, PRECISION);
                lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
            }
            if (amount1In > 0) {
                uint _amount1In = _parseAmountToDefaultDecimals(token1Decimals, amount1In);
                uint tradingFee = FullMath.mulDiv(_amount1In, fee, PRECISION + fee);
                uint protocolFeeInDollarValue = FullMath.mulDiv(tradingFee, protocolFee * price1, PRECISION);
                lpForProtocol = FullMath.mulDiv(protocolFeeInDollarValue, _totalSupply, inventoryRight);
            }
            if (lpForProtocol > 0) {
                _mint(IBrownFiV2Factory(factory).feeTo(), lpForProtocol);
            }
        }
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, sPrice0, sPrice1, to);
        }
    }
    
    function computeSkewnessPrice(uint _reserve0, uint _reserve1, uint _price0, uint _price1) internal view returns (uint, uint) {
        uint _r0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
        uint _r1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
        // s = lambda * |x * px - y * py| / (x * px + y * py)
        uint reserve0Price = _r0 * _price0;
        uint reserve1Price = _r1 * _price1;
        
        uint reservePriceDiff = reserve0Price >= reserve1Price ?
            reserve0Price - reserve1Price :
            reserve1Price - reserve0Price;
        
        uint reservePriceSum = reserve0Price + reserve1Price;
        uint s = FullMath.mulDiv(reservePriceDiff, lambda, reservePriceSum);

        uint q64PlusS = Q64 + s;
        uint q64MinusS = Q64 - s;
        
        // if x * px >= y * py, px = px * (1 - s), py = py * (1 + s)
        // if x * px <= y * py, px = px * (1 + s), py = py * (1 - s)
        if (reserve0Price >= reserve1Price) {
            return (
                FullMath.mulDiv(_price0, q64MinusS, Q64),
                FullMath.mulDiv(_price1, q64PlusS, Q64)
            );
        } else {
            return (
                FullMath.mulDiv(_price0, q64PlusS, Q64),
                FullMath.mulDiv(_price1, q64MinusS, Q64)
            );
        }
    }

    function checkInventory(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view {
        uint _balance0 = _parseAmountToDefaultDecimals(token0Decimals, balance0);
        uint _balance1 = _parseAmountToDefaultDecimals(token1Decimals, balance1);
        uint _amountOut = _parseAmountToDefaultDecimals(zeroToOne ? token1Decimals : token0Decimals, amountOut);
        uint left = computeInventoryLeft(_balance0, _balance1, price0, price1, _amountOut, zeroToOne);
        uint right = computeInventoryRight(price0, price1);
        require(left >= right, 'BrownFiV2: INVALID_INVENTORY');
    }

    function computeInventoryLeft(uint balance0, uint balance1, uint price0, uint price1, uint amountOut, bool zeroToOne) internal view returns (uint) {
        uint _k = k;
        uint balance = zeroToOne ? balance1 : balance0;
        uint price = zeroToOne ? price1 : price0;
        
        // Pre-calculate the denominator with one multiplication
        uint denominator = balance.mul(Q64).mul(2);
        
        return price0.mul(balance0).add(price1.mul(balance1)).sub(
            FullMath.mulDiv(
                price.mul(_k),
                amountOut.mul(amountOut),
                denominator
            )
        );
    }

    function computeInventoryRight(
        uint price0,
        uint price1
    ) internal view returns (uint) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        uint _r0 = _parseAmountToDefaultDecimals(token0Decimals, _reserve0);
        uint _r1 = _parseAmountToDefaultDecimals(token1Decimals, _reserve1);
        return price0.mul(_r0).add(price1.mul(_r1));
    }

    // force balances to match reserves
    function skim(address to) external lock {
    }

    // force reserves to match balances
    function sync() external lock {
        _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)));
    }

    function setK(uint _k) external onlyFactory {
        require(_k <= 2 * Q64, 'BrownFiV2: MAXIMUM_K');
        k = _k;
    }

    function setLambda(uint64 _lambda) external onlyFactory {
        require(_lambda <= Q64, 'BrownFiV2: MAXIMUM_LAMBDA'); // max 1
        lambda = _lambda;
    }

    function setFee(uint32 _fee) external onlyFactory {
        fee = _fee;
    }

    function setProtocolFee(uint32 _protocolFee) external onlyFactory {
        protocolFee = _protocolFee;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
    /// @param a The multiplicand
    /// @param b The multiplier
    /// @param denominator The divisor
    /// @return result The 256-bit result
    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
    function mulDiv(
        uint256 a,
        uint256 b,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = a * b
            // Compute the product mod 2**256 and mod 2**256 - 1
            // then use the Chinese Remainder Theorem to reconstruct
            // the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2**256 + prod0
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(a, b, not(0))
                prod0 := mul(a, b)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division
            if (prod1 == 0) {
                require(denominator > 0);
                assembly {
                    result := div(prod0, denominator)
                }
                return result;
            }

            // Make sure the result is less than 2**256.
            // Also prevents denominator == 0
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0]
            // Compute remainder using mulmod
            uint256 remainder;
            assembly {
                remainder := mulmod(a, b, denominator)
            }
            // Subtract 256 bit number from 512 bit number
            assembly {
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator
            // Compute largest power of two divisor of denominator.
            // Always >= 1.
            uint256 twos = (0 - denominator) & denominator;
            // Divide denominator by power of two
            assembly {
                denominator := div(denominator, twos)
            }

            // Divide [prod1 prod0] by the factors of two
            assembly {
                prod0 := div(prod0, twos)
            }
            // Shift in bits from prod1 into prod0. For this we need
            // to flip `twos` such that it is 2**256 / twos.
            // If twos is zero, then it becomes one
            assembly {
                twos := add(div(sub(0, twos), twos), 1)
            }
            prod0 |= prod1 * twos;

            // Invert denominator mod 2**256
            // Now that denominator is an odd number, it has an inverse
            // modulo 2**256 such that denominator * inv = 1 mod 2**256.
            // Compute the inverse by starting with a seed that is correct
            // correct for four bits. That is, denominator * inv = 1 mod 2**4
            uint256 inv = (3 * denominator) ^ 2;
            // Now use Newton-Raphson iteration to improve the precision.
            // Thanks to Hensel's lifting lemma, this also works in modular
            // arithmetic, doubling the correct bits in each step.
            inv *= 2 - denominator * inv; // inverse mod 2**8
            inv *= 2 - denominator * inv; // inverse mod 2**16
            inv *= 2 - denominator * inv; // inverse mod 2**32
            inv *= 2 - denominator * inv; // inverse mod 2**64
            inv *= 2 - denominator * inv; // inverse mod 2**128
            inv *= 2 - denominator * inv; // inverse mod 2**256

            // Because the division is now exact we can divide by multiplying
            // with the modular inverse of denominator. This will give us the
            // correct result modulo 2**256. Since the precoditions guarantee
            // that the outcome is less than 2**256, this is the final result.
            // We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inv;
            return result;
        }
    }

    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
    /// @param a The multiplicand
    /// @param b The multiplier
    /// @param denominator The divisor
    /// @return result The 256-bit result
    function mulDivRoundingUp(
        uint256 a,
        uint256 b,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            result = mulDiv(a, b, denominator);
            if (mulmod(a, b, denominator) > 0) {
                require(result < type(uint256).max);
                result++;
            }
        }
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;

import './interfaces/IBrownFiV2ERC20.sol';
import './libraries/SafeMath.sol';

contract BrownFiV2ERC20 is IBrownFiV2ERC20 {
    using SafeMath for uint;

    string public constant override name = 'BrownFi V2';
    string public constant override symbol = 'BF-V2';
    uint8 public constant override decimals = 18;
    uint  public override totalSupply;
    mapping(address => uint) public override balanceOf;
    mapping(address => mapping(address => uint)) public override allowance;

    bytes32 public override DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public override nonces;

    constructor() {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name)),
                keccak256(bytes('1')),
                block.chainid,
                address(this)
            )
        );
    }

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external override returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(deadline >= block.timestamp, 'BrownFiV2: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'BrownFiV2: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;

interface IBrownFiV2Callee {
    function brownFiV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;

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

// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;

interface IBrownFiV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint totalPair);
    event PauseStateChanged(bool paused);
    event PriceOracleUpdated(address indexed newOracle);
    event FeeToUpdated(address indexed newFeeTo);
    event OracleOfUpdated(address indexed token, bytes32 priceFeedId);
    event MinPriceAgeUpdated(uint newMinPriceAge);
    event KOfPairUpdated(address indexed tokenA, address indexed tokenB, uint k);
    event FeeOfPairUpdated(address indexed tokenA, address indexed tokenB, uint32 fee);
    event LambdaOfPairUpdated(address indexed tokenA, address indexed tokenB, uint64 lambda);
    event ProtocolFeeOfPairUpdated(address indexed tokenA, address indexed tokenB, uint32 protocolFee);

    function priceOracle() external view returns (address);
    function feeTo() external view returns (address);
    function priceOf(address token, uint256 priceAge) external view returns(uint256);
    function minPriceAge() external view returns (uint);
    function priceFeedIds(address token) external view returns (bytes32);

    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, bytes32 priceFeedA, bytes32 priceFeedB) external returns (address pair);

    function setPriceOracle(address newOracle) external;
    function setFeeTo(address) external;
    function setOracleOf(address token, bytes32 priceFeedId) external;
    function setMinPriceAge(uint age) external;
    function setKOfPair(address tokenA, address tokenB, uint k) external;
    function setFeeOfPair(address tokenA, address tokenB, uint32 fee) external;
    function setLambdaOfPair(address tokenA, address tokenB, uint64 lambda) external;
    function setProtocolFeeOfPair(address tokenA, address tokenB, uint32 protocolFee) external;

    function setPaused(bool paused) external;
    function isPaused() external view returns (bool);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;

interface IBrownFiV2Pair {
    event Mint(address indexed sender, uint amount0, uint amount1, uint price0, uint price1, address indexed to);
    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,
        uint price0,
        uint price1,
        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 k() external view returns (uint);
    function lambda() external view returns (uint64);
    function fee() external view returns (uint32);

    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 setK(uint _k) external;
    function setFee(uint32 _fee) external;
    function setLambda(uint64 _lambda) external;
    function setProtocolFee(uint32 _protocolFee) external;

    function initialize(address, address) external;
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view 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);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;

// a library for performing various math operations

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.28;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Q64","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lambda","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_fee","type":"uint32"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_k","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_lambda","type":"uint64"}],"name":"setLambda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_protocolFee","type":"uint32"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"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"}]

60a0604052346101555760405161001760408261015a565b600a815269213937bbb72334902b1960b11b602090910152604080517f6734371cf3152a7df61c4623a003b33fdd6df5cdf7648e19ad4b1d9eababb5159161005f908261015a565b600181526020810190603160f81b82525190206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526100c360c08261015a565b519020600355664189374bc6a7ef600855600980546001600160a01b0319166e989680000493e000000000000000001790556001600a5533608052604051613ae2908161019482396080518181816107c6015281816108d601528181610ada01528181610c9c0152818161122e015281816116e4015281816117d701528181611d61015281816120a401526130e30152f35b600080fd5b601f909101601f19168101906001600160401b0382119082101761017d57604052565b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611fe357806306fdde0314611f6c5780630902f1ac14611edb578063095ea7b314611e965780630b77884d14611e545780630dfe168114611e0257806318160ddd14611dc75780631ab971ab14611d0757806323b872dd14611bdd57806330adf81f14611b84578063313ce56714611b4a57806333fca18714611b085780633644e51514611acc578063485cc9551461177f57806367de8be9146116975780636a627842146111a057806370a082311461113d5780637ecebe00146110da57806389afcb4414610c0f57806395d89b4114610b94578063a9059cbb14610b44578063aa9f762814610a80578063aaf5eb6814610a43578063b0e21e8a146109fa578063b31ac6e2146109b8578063b4f40c611461097c578063ba9a7a5614610941578063bc25cf77146108fa578063c45a01551461088b578063cde5bf5314610767578063d21220a714610715578063d505accf14610443578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e56001600a5414612bd3565b80600a556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae92506135fd565b6001600a5580f35b90506020823d6020116102e9575b816102d160209383612afb565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612afb565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60095460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612ab5565b92826103db612ad8565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095416604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761047b612ab5565b610483612ad8565b6044359060643560843560ff8116809103610711574282106106b35760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610686579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056c60e082612afb565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b3606282612afb565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561067b5773ffffffffffffffffffffffffffffffffffffffff855116908115159182610671575b50501561061357610610926138d2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b1490503880610600565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043567ffffffffffffffff8116809103610887576107ed73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b680100000000000000008111610829577fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600954161760095580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b5080fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610932612ab5565b506102ae6001600a5414612bd3565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600854604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516305f5e1008152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757610b0173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b7fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006009549260601b1691161760095580f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89610b7f612ab5565b60243590336139a8565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051610bd5604082612afb565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612b6b565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610c47612ab5565b610c556001600a5414612bd3565b81600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102f157610cd69184916110ab575b5015612c50565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa92831561109e57819361106a575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295611036575b503082526001602052610dc5610db9610db9610dbe60408620549786549384918a612ef4565b612d9c565b9787612ef4565b938515158061102d575b15610fa9576024968360209230825260018452610df0816040842054613935565b308352600185526040832055610e07818354613935565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610e3f878683612f2b565b610e4a868685612f2b565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610f74575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610f685791610f35575b50610edc906040956135fd565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a36001600a5582519182526020820152f35b90506020813d602011610f60575b81610f5060209383612afb565b810103126102e457516040610ecf565b3d9150610f43565b604051903d90823e3d90fd5b9095506020813d602011610fa1575b81610f9060209383612afb565b810103126102e45751946020610e8a565b3d9150610f83565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610dcf565b9094506020813d602011611062575b8161105260209383612afb565b810103126102e457519338610d93565b3d9150611045565b9092506020813d602011611096575b8161108660209383612afb565b810103126102e457519138610d4e565b3d9150611079565b50604051903d90823e3d90fd5b6110cd915060203d6020116110d3575b6110c58183612afb565b810190612c38565b38610ccf565b503d6110bb565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61112c612ab5565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61118f612ab5565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111d8612ab5565b906111e76001600a5414612bd3565b80600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561032f57906112699183916110ab575015612c50565b61129c6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa95861561168c578596611658575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa93841561164d578794611609575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611389828b613935565b97166113958188613935565b9261139e6130cc565b96909560a01c169160ff6113b28b856137bd565b9260a01c16916113d6886113d0896113ca8a886137bd565b94612ef4565b92612ef4565b808210156116015750935b8b5493846115b25750505050506113f790612ea6565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158557966114326103e88254613a39565b8155808052600160205261144c6103e86040832054613a39565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611501576114b873ffffffffffffffffffffffffffffffffffffffff956020996114b38a8861385e565b6135fd565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600a55604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6115fb969c506115e16115db6115f5959697946115d56115ef956115e8956137bd565b976137bd565b93612ea6565b9488612ef4565b9188612ef4565b90613a39565b91613557565b95611487565b9050936113e1565b9293506020833d602011611645575b8161162560209383612afb565b810103126102e457915192916dffffffffffffffffffffffffffff61135a565b3d9150611618565b6040513d89823e3d90fd5b9095506020813d602011611684575b8161167460209383612afb565b810103126102e4575194386112fb565b3d9150611667565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043561170b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b6802000000000000000081116117215760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117b7612ab5565b6117bf612ad8565b9073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303611a6e5773ffffffffffffffffffffffffffffffffffffffff169081151580611a4f575b156119f15773ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156119e6577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119c7575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa90811561067b577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff0000000000000000000000000000000000000000918691611998575b5060a01b169216171760065580f35b6119ba915060203d6020116119c0575b6119b28183612afb565b810190612d83565b38611989565b503d6119a8565b6119e0915060203d6020116119c0576119b28183612afb565b38611907565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a205a45524f5f414444524553530000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff8116151561181d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b8990611c19612ab5565b611c21612ad8565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c9b575b50506139a8565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611cd4868360002054613935565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c94565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757611d8873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612d1e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006009549260401b1691161760095580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89611ed1612ab5565b60243590336138d2565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f536007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051611fad604082612afb565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612b6b565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612ab1576064359067ffffffffffffffff8211612aad5736602383011215612aad5781600401359567ffffffffffffffff8711610711573660248885010111610711576120896001600a5414612bd3565b85600a5573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612aa2579061210c9189916110ab575015612c50565b81159081158092612a99575b15612a15576121506007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690956dffffffffffffffffffffffffffff61216c86612dd5565b97169661217888612e83565b1015806129eb575b156129675773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b14158061295d575b156128ff578c8782886128ee575b50505087806128dd575b50508061281d575b5050602060249798999a604051988980927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa96871561249b578a976127e8575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561249b578a916127b6575b5061227e8487612cb5565b8711156127a0576dffffffffffffffffffffffffffff6122a76122a18689612cb5565b89612cb5565b985b16966122b58689612cb5565b821115612799576122cf6122c9878a612cb5565b83612cb5565b935b89159182158093612790575b1561270d578c936122ec6130cc565b929093849b849d6009549167ffffffffffffffff83166126ee575b50508d918b61233c8f938f9061232f61233663ffffffff809360401c16958361232f88612cf1565b1690613397565b94612cf1565b9161264d575b508c61254e575b50505090612356916135fd565b6009549067ffffffffffffffff8260601c1691826123c3575b50505050505050604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a36001600a5580f35b8554938d6123d18483613727565b96612503575b5050876124a6575b5050505050806123f5575b808080808d9461236f565b6020600492604051938480927f017e7e580000000000000000000000000000000000000000000000000000000082525afa801561249b578a90612444575b61243d925061385e565b38806123ea565b50906020813d602011612493575b8161245f60209383612afb565b8101031261248f57519073ffffffffffffffffffffffffffffffffffffffff8216820361248f5761243d91612433565b8980fd5b3d9150612452565b6040513d8c823e3d90fd5b6124f995506124f492916124e86124ee9263ffffffff6124ce8c60ff60065460a01c166137bd565b9160401c1663ffffffff6124e182612cf1565b1691613557565b92612d0b565b90613448565b613557565b38808080806123df565b6125469297506124f487926124ee61253f6125278a9560ff60055460a01c166137bd565b63ffffffff8d60401c1663ffffffff6124e182612cf1565b9188612d0b565b94388d6123d7565b906125cf916125c96125c2879b6125bc88996115ef6125b561259861257e6125d59d60ff60055460a01c166137bd565b9861259260ff60065460a01c1695866137bd565b946137bd565b9760085495506125af6125aa85612ec9565b612ea6565b99612ef4565b918a612ef4565b96612ef4565b9180612ef4565b90613557565b90613935565b6125df8c8c613727565b116125ef57938d948b8b38612349565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b91846125c96125c2886125bc6126c0986125cf979f986126956115ef9161268f61268060ff60055460a01c169a8b6137bd565b9660ff60065460a01c166137bd565b986137bd565b966113d0600854958c6000146126e757829c5b156126da576126ba6125aa869e612ec9565b9a612ef4565b6126ca8d8d613727565b116125ef578b8f968c9038612342565b6126ba6125aa8c9e612ec9565b809c6126a8565b8c9f508d929e50876127019288926132c8565b9e909d91508290612307565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b508515156122dd565b8a936122d1565b6dffffffffffffffffffffffffffff8a986122a9565b90506020813d6020116127e0575b816127d160209383612afb565b810103126102e4575138612273565b3d91506127c4565b9096506020813d602011612815575b8161280460209383612afb565b810103126102e4575195602061222d565b3d91506127f7565b893b156128d9578660a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561249b576128bf575b806121e3565b896128d06024999a9b602093612afb565b999897506128b9565b8a80fd5b6128e79185612f2b565b38876121db565b6128f792612f2b565b8c87826121d1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b14156121c3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b506129f586612dd5565b612a0e6dffffffffffffffffffffffffffff8a16612e83565b1015612180565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b50831515612118565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612bbd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612b7e565b15612bda57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612c5757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612cc257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff166305f5e100019063ffffffff8211612cc257565b81810292918115918404141715612cc257565b15612d2557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612da6570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612e56579250600a830403612df857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612e565780935060031c03612df857565b906000916002810281810460021482151715612e565780935060011c03612df857565b9060009168010000000000000000808202908282041482151715612e565780935060401c03612df857565b600092918015918215612f0b575b505015612df857565b91509250612f23612f1c8483612d0b565b9384612d9c565b143880612f02565b60009190829182604095612fd07fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612f698c82612afb565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612afb565b51925af13d156130c5573d67ffffffffffffffff8111612b3c5782519061301f601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612afb565b81523d6000602083013e5b81613096575b50156130395750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130ab575b505038613030565b6130be9250602080918301019101612c38565b38806130a3565b606061302a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561324957600091613289575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561324957600091613255575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa9081156132495760009161321a575090565b90506020813d602011613241575b8161323560209383612afb565b810103126102e4575190565b3d9150613228565b6040513d6000823e3d90fd5b90506020813d602011613281575b8161327060209383612afb565b810103126102e457516132046131a8565b3d9150613263565b906020823d6020116132b3575b816132a360209383612afb565b8101031261033a57505138613142565b3d9150613296565b91908201809211612cc257565b6132f7846132f1856132eb61268061332a969a999a60ff60055460a01c166137bd565b95612d0b565b93612d0b565b808310801593916133169161338d576133108184612cb5565b926132bb565b9067ffffffffffffffff6009541690613557565b9182680100000000000000000192836801000000000000000011612cc257680100000000000000000391680100000000000000008311612cc257156133805761337d9291613377916134e0565b936134e0565b90565b61337d92613377916134e0565b6133108382612cb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6305f5e1008209916305f5e10082029182808510940393808503941461343b57838211156102e4576305f5e100829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134d157826305f5e100111561033a57507facbe0e98f503f8881186e60dbb7f727bf36b7213ee9f5a78c767074b22e90e2193946305f5e100910990828211900360f81b910360081c170290565b5050506305f5e1009192500490565b6000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309918181029384808510940393808503941461354d578368010000000000000000111561033a57509068010000000000000000910990828211900360c01b910360401c1790565b5050505060401c90565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840992828102928380861095039480860395146135ef57848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b6dffffffffffffffffffffffffffff8111158061370f575b156136b1577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613615565b906115ef61337d926113d061378e6113d061376b6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5092906dffffffffffffffffffffffffffff60ff60055460a01c169116906137bd565b916dffffffffffffffffffffffffffff60ff60065460a01c169116906137bd565b604d8111612cc257600a0a90565b60009060ff16601281111561380e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612cc25761380860ff61337d93166137af565b90612d9c565b6012039060ff821161383157509061382b60ff61337d93166137af565b90612d0b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936138a4868654613a39565b85551693848452600182526138bd816040862054613a39565b858552600183526040852055604051908152a3565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906139419083612cb5565b91821161394a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93169384600052600183526139fb86604060002054613935565b856000526001845260406000205516938460005260018252613a2281604060002054613a39565b8560005260018352604060002055604051908152a3565b9190613a4590836132bb565b918210613a4e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212201634120ea8a3571b194d610828716ad7c6c5e7329387eff50ccf0bdb13b8557b64736f6c634300081c0033

Deployed Bytecode

0x6080604052600436101561001257600080fd5b6000803560e01c8063022c0d9f14611fe357806306fdde0314611f6c5780630902f1ac14611edb578063095ea7b314611e965780630b77884d14611e545780630dfe168114611e0257806318160ddd14611dc75780631ab971ab14611d0757806323b872dd14611bdd57806330adf81f14611b84578063313ce56714611b4a57806333fca18714611b085780633644e51514611acc578063485cc9551461177f57806367de8be9146116975780636a627842146111a057806370a082311461113d5780637ecebe00146110da57806389afcb4414610c0f57806395d89b4114610b94578063a9059cbb14610b44578063aa9f762814610a80578063aaf5eb6814610a43578063b0e21e8a146109fa578063b31ac6e2146109b8578063b4f40c611461097c578063ba9a7a5614610941578063bc25cf77146108fa578063c45a01551461088b578063cde5bf5314610767578063d21220a714610715578063d505accf14610443578063dad0be61146103fd578063dd62ed3e14610382578063ddca3f431461033d5763fff6cae9146101a957600080fd5b3461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576101e56001600a5414612bd3565b80600a556024602073ffffffffffffffffffffffffffffffffffffffff60055416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561032f5782906102fc575b60249150602073ffffffffffffffffffffffffffffffffffffffff60065416604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa9081156102f15783916102b6575b6102ae92506135fd565b6001600a5580f35b90506020823d6020116102e9575b816102d160209383612afb565b810103126102e4576102ae9151906102a4565b600080fd5b3d91506102c4565b6040513d85823e3d90fd5b506020813d602011610327575b8161031660209383612afb565b810103126102e45760249051610245565b3d9150610309565b6040513d84823e3d90fd5b80fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602063ffffffff60095460401c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5773ffffffffffffffffffffffffffffffffffffffff60406103d1612ab5565b92826103db612ad8565b9416815260026020522091166000526020526020604060002054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095416604051908152f35b503461033a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5761047b612ab5565b610483612ad8565b6044359060643560843560ff8116809103610711574282106106b35760035473ffffffffffffffffffffffffffffffffffffffff861692838852600460205260408820908154917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314610686579282602095928b95600160809601905560405190878201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845289604084015273ffffffffffffffffffffffffffffffffffffffff8b1660608401528b8784015260a083015260c082015260c0815261056c60e082612afb565b51902060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526105b3606282612afb565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561067b5773ffffffffffffffffffffffffffffffffffffffff855116908115159182610671575b50501561061357610610926138d2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f5349474e4154555245000000006044820152fd5b1490503880610600565b6040513d86823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956323a204558504952454400000000000000000000000000006044820152fd5b8580fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043567ffffffffffffffff8116809103610887576107ed73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e163314612d1e565b680100000000000000008111610829577fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600954161760095580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42726f776e466956323a204d4158494d554d5f4c414d424441000000000000006044820152fd5b5080fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e168152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610932612ab5565b506102ae6001600a5414612bd3565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516103e88152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600854604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60055460a01c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602067ffffffffffffffff60095460601c16604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040516305f5e1008152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757610b0173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e163314612d1e565b7fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff6fffffffff0000000000000000000000006009549260601b1691161760095580f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89610b7f612ab5565b60243590336139a8565b602060405160018152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051610bd5604082612afb565b600581527f42462d5632000000000000000000000000000000000000000000000000000000602082015260405191829182612b6b565b0390f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610c47612ab5565b610c556001600a5414612bd3565b81600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e165afa80156102f157610cd69184916110ab575b5015612c50565b73ffffffffffffffffffffffffffffffffffffffff600554169173ffffffffffffffffffffffffffffffffffffffff6006541691604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481885afa92831561109e57819361106a575b50604051937f70a08231000000000000000000000000000000000000000000000000000000008552306004860152602085602481845afa94851561032f578295611036575b503082526001602052610dc5610db9610db9610dbe60408620549786549384918a612ef4565b612d9c565b9787612ef4565b938515158061102d575b15610fa9576024968360209230825260018452610df0816040842054613935565b308352600185526040832055610e07818354613935565b82556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843092a3610e3f878683612f2b565b610e4a868685612f2b565b604051978880927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa95861561032f578296610f74575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa918215610f685791610f35575b50610edc906040956135fd565b73ffffffffffffffffffffffffffffffffffffffff84519184835283602084015216907fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496853392a36001600a5582519182526020820152f35b90506020813d602011610f60575b81610f5060209383612afb565b810103126102e457516040610ecf565b3d9150610f43565b604051903d90823e3d90fd5b9095506020813d602011610fa1575b81610f9060209383612afb565b810103126102e45751946020610e8a565b3d9150610f83565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152fd5b50841515610dcf565b9094506020813d602011611062575b8161105260209383612afb565b810103126102e457519338610d93565b3d9150611045565b9092506020813d602011611096575b8161108660209383612afb565b810103126102e457519138610d4e565b3d9150611079565b50604051903d90823e3d90fd5b6110cd915060203d6020116110d3575b6110c58183612afb565b810190612c38565b38610ccf565b503d6110bb565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61112c612ab5565b168152600483522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57604060209173ffffffffffffffffffffffffffffffffffffffff61118f612ab5565b168152600183522054604051908152f35b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576111d8612ab5565b906111e76001600a5414612bd3565b80600a556040517fb187bd2600000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e165afa90811561032f57906112699183916110ab575015612c50565b61129c6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5090600554604051947f70a0823100000000000000000000000000000000000000000000000000000000865230600487015260208660248173ffffffffffffffffffffffffffffffffffffffff86165afa95861561168c578596611658575b5060065491604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff85165afa93841561164d578794611609575b506dffffffffffffffffffffffffffff60ff939495166dffffffffffffffffffffffffffff611389828b613935565b97166113958188613935565b9261139e6130cc565b96909560a01c169160ff6113b28b856137bd565b9260a01c16916113d6886113d0896113ca8a886137bd565b94612ef4565b92612ef4565b808210156116015750935b8b5493846115b25750505050506113f790612ea6565b60401c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18810190811161158557966114326103e88254613a39565b8155808052600160205261144c6103e86040832054613a39565b81805260016020526040822055807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040516103e88152a35b8615611501576114b873ffffffffffffffffffffffffffffffffffffffff956020996114b38a8861385e565b6135fd565b604051958652878601526040850152606084015216907f265ee4cff6cdf714e68c02e61a7864cf66bc04e372a41b6cc425acbb737cd39560803392a36001600a55604051908152f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6115fb969c506115e16115db6115f5959697946115d56115ef956115e8956137bd565b976137bd565b93612ea6565b9488612ef4565b9188612ef4565b90613a39565b91613557565b95611487565b9050936113e1565b9293506020833d602011611645575b8161162560209383612afb565b810103126102e457915192916dffffffffffffffffffffffffffff61135a565b3d9150611618565b6040513d89823e3d90fd5b9095506020813d602011611684575b8161167460209383612afb565b810103126102e4575194386112fb565b3d9150611667565b6040513d87823e3d90fd5b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043561170b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e163314612d1e565b6802000000000000000081116117215760085580f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a204d4158494d554d5f4b0000000000000000000000006044820152fd5b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576117b7612ab5565b6117bf612ad8565b9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e163303611a6e5773ffffffffffffffffffffffffffffffffffffffff169081151580611a4f575b156119f15773ffffffffffffffffffffffffffffffffffffffff60055491837fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600555169060065492827fffffffffffffffffffffffff00000000000000000000000000000000000000008516176006556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa9081156119e6577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff00000000000000000000000000000000000000009188916119c7575b5060a01b16921617176005556040517f313ce567000000000000000000000000000000000000000000000000000000008152602081600481855afa90811561067b577fffffffffffffffffffffff0000000000000000000000000000000000000000009174ff0000000000000000000000000000000000000000918691611998575b5060a01b169216171760065580f35b6119ba915060203d6020116119c0575b6119b28183612afb565b810190612d83565b38611989565b503d6119a8565b6119e0915060203d6020116119c0576119b28183612afb565b38611907565b6040513d88823e3d90fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a205a45524f5f414444524553530000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff8116151561181d565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956323a20464f5242494444454e0000000000000000000000006044820152fd5b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020600354604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576020604051680100000000000000008152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060405160128152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760206040517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98152f35b503461033a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b8990611c19612ab5565b611c21612ad8565b906044359273ffffffffffffffffffffffffffffffffffffffff82169081815260026020526040812073ffffffffffffffffffffffffffffffffffffffff33166000526020527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205403611c9b575b50506139a8565b808260409252600260205281812073ffffffffffffffffffffffffffffffffffffffff3316600052602052611cd4868360002054613935565b92815260026020522073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020553880611c94565b503461033a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760043563ffffffff8116810361088757611d8873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e163314612d1e565b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff00000000000000006009549260401b1691161760095580f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760209054604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57602060ff60065460a01c16604051908152f35b503461033a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a57610b89611ed1612ab5565b60243590336138d2565b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5760606dffffffffffffffffffffffffffff63ffffffff611f536007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b9193908160405195168552166020840152166040820152f35b503461033a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a5750610c0b604051611fad604082612afb565b600a81527f42726f776e466920563200000000000000000000000000000000000000000000602082015260405191829182612b6b565b503461033a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033a576004359060243560443573ffffffffffffffffffffffffffffffffffffffff811691828203612ab1576064359067ffffffffffffffff8211612aad5736602383011215612aad5781600401359567ffffffffffffffff8711610711573660248885010111610711576120896001600a5414612bd3565b85600a5573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e166040517fb187bd26000000000000000000000000000000000000000000000000000000008152602081600481855afa908115612aa2579061210c9189916110ab575015612c50565b81159081158092612a99575b15612a15576121506007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b509690956dffffffffffffffffffffffffffff61216c86612dd5565b97169661217888612e83565b1015806129eb575b156129675773ffffffffffffffffffffffffffffffffffffffff600554169a73ffffffffffffffffffffffffffffffffffffffff60065416928c8b14158061295d575b156128ff578c8782886128ee575b50505087806128dd575b50508061281d575b5050602060249798999a604051988980927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa96871561249b578a976127e8575b506020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa90811561249b578a916127b6575b5061227e8487612cb5565b8711156127a0576dffffffffffffffffffffffffffff6122a76122a18689612cb5565b89612cb5565b985b16966122b58689612cb5565b821115612799576122cf6122c9878a612cb5565b83612cb5565b935b89159182158093612790575b1561270d578c936122ec6130cc565b929093849b849d6009549167ffffffffffffffff83166126ee575b50508d918b61233c8f938f9061232f61233663ffffffff809360401c16958361232f88612cf1565b1690613397565b94612cf1565b9161264d575b508c61254e575b50505090612356916135fd565b6009549067ffffffffffffffff8260601c1691826123c3575b50505050505050604051958652602086015260408501526060840152608083015260a08201527f72362f8601a26e309bef1da8d6795550a593bd38f121bedcaf24be6e4b7c6bee60c03392a36001600a5580f35b8554938d6123d18483613727565b96612503575b5050876124a6575b5050505050806123f5575b808080808d9461236f565b6020600492604051938480927f017e7e580000000000000000000000000000000000000000000000000000000082525afa801561249b578a90612444575b61243d925061385e565b38806123ea565b50906020813d602011612493575b8161245f60209383612afb565b8101031261248f57519073ffffffffffffffffffffffffffffffffffffffff8216820361248f5761243d91612433565b8980fd5b3d9150612452565b6040513d8c823e3d90fd5b6124f995506124f492916124e86124ee9263ffffffff6124ce8c60ff60065460a01c166137bd565b9160401c1663ffffffff6124e182612cf1565b1691613557565b92612d0b565b90613448565b613557565b38808080806123df565b6125469297506124f487926124ee61253f6125278a9560ff60055460a01c166137bd565b63ffffffff8d60401c1663ffffffff6124e182612cf1565b9188612d0b565b94388d6123d7565b906125cf916125c96125c2879b6125bc88996115ef6125b561259861257e6125d59d60ff60055460a01c166137bd565b9861259260ff60065460a01c1695866137bd565b946137bd565b9760085495506125af6125aa85612ec9565b612ea6565b99612ef4565b918a612ef4565b96612ef4565b9180612ef4565b90613557565b90613935565b6125df8c8c613727565b116125ef57938d948b8b38612349565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956323a20494e56414c49445f494e56454e544f5259000000006044820152fd5b91846125c96125c2886125bc6126c0986125cf979f986126956115ef9161268f61268060ff60055460a01c169a8b6137bd565b9660ff60065460a01c166137bd565b986137bd565b966113d0600854958c6000146126e757829c5b156126da576126ba6125aa869e612ec9565b9a612ef4565b6126ca8d8d613727565b116125ef578b8f968c9038612342565b6126ba6125aa8c9e612ec9565b809c6126a8565b8c9f508d929e50876127019288926132c8565b9e909d91508290612307565b60846040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42726f776e466956323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152fd5b508515156122dd565b8a936122d1565b6dffffffffffffffffffffffffffff8a986122a9565b90506020813d6020116127e0575b816127d160209383612afb565b810103126102e4575138612273565b3d91506127c4565b9096506020813d602011612815575b8161280460209383612afb565b810103126102e4575195602061222d565b3d91506127f7565b893b156128d9578660a4877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8f95806024604051998a9889977f6f9d78fc0000000000000000000000000000000000000000000000000000000089523360048a01528389015260448801526080606488015282608488015201868601378685828601015201168101030181838d5af1801561249b576128bf575b806121e3565b896128d06024999a9b602093612afb565b999897506128b9565b8a80fd5b6128e79185612f2b565b38876121db565b6128f792612f2b565b8c87826121d1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956323a20494e56414c49445f544f00000000000000000000006044820152fd5b50838b14156121c3565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42726f776e466956323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152fd5b506129f586612dd5565b612a0e6dffffffffffffffffffffffffffff8a16612e83565b1015612180565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42726f776e466956323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152fd5b50831515612118565b6040513d8a823e3d90fd5b8480fd5b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102e457565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b848110612bbd5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201612b7e565b15612bda57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a204c4f434b45440000000000000000000000000000006044820152fd5b908160209103126102e4575180151581036102e45790565b15612c5757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956323a205041555345440000000000000000000000000000006044820152fd5b91908203918211612cc257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff166305f5e100019063ffffffff8211612cc257565b81810292918115918404141715612cc257565b15612d2557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f42726f776e466956323a204f4e4c595f464143544f52590000000000000000006044820152fd5b908160209103126102e4575160ff811681036102e45790565b8115612da6570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90600091600a8102818104600a1482151715612e56579250600a830403612df857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b906000916008810281810460081482151715612e565780935060031c03612df857565b906000916002810281810460021482151715612e565780935060011c03612df857565b9060009168010000000000000000808202908282041482151715612e565780935060401c03612df857565b600092918015918215612f0b575b505015612df857565b91509250612f23612f1c8483612d0b565b9384612d9c565b143880612f02565b60009190829182604095612fd07fffffffff00000000000000000000000000000000000000000000000000000000601960208a51612f698c82612afb565b8281527f7472616e7366657228616464726573732c75696e743235362900000000000000910190815220895191166020820190815273ffffffffffffffffffffffffffffffffffffffff959095166024820152604480820193909352918252606482612afb565b51925af13d156130c5573d67ffffffffffffffff8111612b3c5782519061301f601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200183612afb565b81523d6000602083013e5b81613096575b50156130395750565b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956323a205452414e534645525f4641494c45440000000000006044820152fd5b80518015925082156130ab575b505038613030565b6130be9250602080918301019101612c38565b38806130a3565b606061302a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d05395a6b6542020fbd38d31fe1377130b35592e16906040517f67cc3403000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561324957600091613289575b506005546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101829052602081604481875afa90811561324957600091613255575b506006546040517ffc3d545d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101929092529260209082908180604481015b03915afa9081156132495760009161321a575090565b90506020813d602011613241575b8161323560209383612afb565b810103126102e4575190565b3d9150613228565b6040513d6000823e3d90fd5b90506020813d602011613281575b8161327060209383612afb565b810103126102e457516132046131a8565b3d9150613263565b906020823d6020116132b3575b816132a360209383612afb565b8101031261033a57505138613142565b3d9150613296565b91908201809211612cc257565b6132f7846132f1856132eb61268061332a969a999a60ff60055460a01c166137bd565b95612d0b565b93612d0b565b808310801593916133169161338d576133108184612cb5565b926132bb565b9067ffffffffffffffff6009541690613557565b9182680100000000000000000192836801000000000000000011612cc257680100000000000000000391680100000000000000008311612cc257156133805761337d9291613377916134e0565b936134e0565b90565b61337d92613377916134e0565b6133108382612cb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6305f5e1008209916305f5e10082029182808510940393808503941461343b57838211156102e4576305f5e100829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50809250156102e4570490565b9190916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84820990848102928380841093039280840393146134d157826305f5e100111561033a57507facbe0e98f503f8881186e60dbb7f727bf36b7213ee9f5a78c767074b22e90e2193946305f5e100910990828211900360f81b910360081c170290565b5050506305f5e1009192500490565b6000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818309918181029384808510940393808503941461354d578368010000000000000000111561033a57509068010000000000000000910990828211900360c01b910360401c1790565b5050505060401c90565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82840992828102928380861095039480860395146135ef57848311156102e457829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156102e4570490565b6dffffffffffffffffffffffffffff8111158061370f575b156136b1577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1916dffffffffffffffffffffffffffff806040931691827bffffffffffffffffffffffffffff00000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000004260e01b169260701b16171780600755835192835260701c166020820152a1565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956323a204f564552464c4f57000000000000000000000000006044820152fd5b506dffffffffffffffffffffffffffff821115613615565b906115ef61337d926113d061378e6113d061376b6007546dffffffffffffffffffffffffffff8116916dffffffffffffffffffffffffffff8260701c169160e01c90565b5092906dffffffffffffffffffffffffffff60ff60055460a01c169116906137bd565b916dffffffffffffffffffffffffffff60ff60065460a01c169116906137bd565b604d8111612cc257600a0a90565b60009060ff16601281111561380e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9150019060ff8211612cc25761380860ff61337d93166137af565b90612d9c565b6012039060ff821161383157509061382b60ff61337d93166137af565b90612d0b565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000936138a4868654613a39565b85551693848452600182526138bd816040862054613a39565b858552600183526040852055604051908152a3565b602073ffffffffffffffffffffffffffffffffffffffff807f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925931693846000526002835260406000208282166000528352856040600020556040519586521693a3565b91906139419083612cb5565b91821161394a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152fd5b602073ffffffffffffffffffffffffffffffffffffffff807fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93169384600052600183526139fb86604060002054613935565b856000526001845260406000205516938460005260018252613a2281604060002054613a39565b8560005260018352604060002055604051908152a3565b9190613a4590836132bb565b918210613a4e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152fdfea26469706673582212201634120ea8a3571b194d610828716ad7c6c5e7329387eff50ccf0bdb13b8557b64736f6c634300081c0033

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.