ERC-20
Overview
Max Total Supply
0.000000000000001 X7-AMM-V1
Holders
0
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x47faf6A2...2D7CB090E The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
XchangePair
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-04 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity =0.8.15; /* /$$ /$$ /$$$$$$$$ /$$$$$$$$ /$$ | $$ / $$|_____ $$/ | $$_____/|__/ | $$/ $$/ /$$/ | $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$$ /$$$$$$ \ $$$$/ /$$/ | $$$$$ | $$| $$__ $$ |____ $$| $$__ $$ /$$_____/ /$$__ $$ >$$ $$ /$$/ | $$__/ | $$| $$ \ $$ /$$$$$$$| $$ \ $$| $$ | $$$$$$$$ /$$/\ $$ /$$/ | $$ | $$| $$ | $$ /$$__ $$| $$ | $$| $$ | $$_____/ | $$ \ $$ /$$/ | $$ | $$| $$ | $$| $$$$$$$| $$ | $$| $$$$$$$| $$$$$$$ |__/ |__/|__/ |__/ |__/|__/ |__/ \_______/|__/ |__/ \_______/ \_______/ Contract: UniswapV2 Fork - XchangeFactory and XchangePair The factory contract maintains a number of "trusted" addresses and the pair contract has a number of additional features: * failsafe reserve minimums * failsafe pair token burning (liquidity withdrawal) * trustless and guarenteed fee collection * tokens may swap themselves This contract will NOT be renounced. The following are the only functions that can be called on the factory contract that affect the contract: function setFeeTo(address _feeTo) external onlyOwner { require(_feeTo != feeTo); address oldFeeToo = feeTo; feeTo = _feeTo; emit FeeToSet(oldFeeToo, _feeTo); } function setDiscountAuthority(address _discountAuthority) external onlyOwner { require(_discountAuthority != discountAuthority); address oldDiscountAuthority = discountAuthority; discountAuthority = _discountAuthority; emit DiscountAuthoritySet(oldDiscountAuthority, _discountAuthority); } function setTrusted(address trustAddress, bool shouldTrustAddress) external onlyOwner { require(_isTrusted[trustAddress] != shouldTrustAddress); _isTrusted[trustAddress] = shouldTrustAddress; emit TrustedSet(trustAddress, shouldTrustAddress); } function setFailsafeLiquidator(address trustAddress, bool shouldTrustAddress) external onlyOwner { require(_isFailSafeLiquidator[trustAddress] != shouldTrustAddress); _isFailSafeLiquidator[trustAddress] = shouldTrustAddress; emit FailsafeLiquidatorSet(trustAddress, shouldTrustAddress); } These functions will be passed to DAO governance once the ecosystem stabilizes. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor(address owner_) { _transferOwnership(owner_); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { require(owner() == msg.sender, "Ownable: caller is not the owner"); } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IXchangeFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); event TrustedSet(address indexed trustedPrincipal, bool isTrusted); event FailsafeLiquidatorSet(address indexed trustedPrincipal, bool isTrusted); event DiscountAuthoritySet(address indexed oldAddress, address indexed newAddress); event FeeToSet(address indexed oldAddress, address indexed newAddress); function feeTo() external view returns (address); function discountAuthority() external view returns (address); function isTrusted(address) external view returns (bool); function isFailsafeLiquidator(address) external view returns (bool); function getPair(address tokenA, address tokenB) external view returns (address pair); function isPair(address pairAddress) external view returns (bool); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function pairTokens(address pairAddress, address tokenAddress) external view returns (bool); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setTrusted(address, bool) external; function setDiscountAuthority(address) external; function setFailsafeLiquidator(address, bool) external; } interface IXchangePair { event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function mintFee() external; function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; function mustBurn(address to, uint256 gasAmount) external returns (uint256 amount0, uint256 amount1); function swapWithDiscount(uint amount0Out, uint amount1Out, address to, uint feeAmountOverride, bytes calldata data) external; function syncSafe(uint256 gasAmountToken0, uint256 gasAmountToken1) external; function withdrawTokensAgainstMinimumBalance(address tokenAddress, address to, uint112 amount) external returns (uint112); function setMinimumBalance(address tokenAddress, uint112 minimumAmount) external; } interface IXchangeERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } interface 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); } interface IXchangeDiscountAuthority { function fee(address) external view returns (uint8); } interface IUniswapV2Callee { function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external; } contract XchangeERC20 is IXchangeERC20 { string public constant name = 'Xchange AMM V1'; string public constant symbol = 'X7-AMM-V1'; uint8 public constant decimals = 18; uint public totalSupply; mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; constructor() { uint chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes('1')), chainId, address(this) ) ); } function approve(address spender, uint value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint value) external returns (bool) { if (allowance[from][msg.sender] != type(uint).max) { allowance[from][msg.sender] = allowance[from][msg.sender] - value; } _transfer(from, to, value); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'Xchange: 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, 'Xchange: INVALID_SIGNATURE'); _approve(owner, spender, value); } function _mint(address to, uint value) internal { totalSupply = totalSupply + value; balanceOf[to] = balanceOf[to] + value; emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { balanceOf[from] = balanceOf[from] - value; totalSupply = totalSupply - 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] - value; balanceOf[to] = balanceOf[to] + value; emit Transfer(from, to, value); } } contract XchangePair is IXchangePair, XchangeERC20 { using UQ112x112 for uint224; uint public constant MINIMUM_LIQUIDITY = 10**3; bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)'))); IXchangeFactory _factory; address public token0; address public token1; 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 uint public price0CumulativeLast; uint public price1CumulativeLast; uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event bool public hasMinimums; mapping(address => uint112) public tokenMinimumBalance; uint private unlocked = 1; modifier lock() { require(unlocked == 1, 'Xchange: LOCKED'); unlocked = 0; _; unlocked = 1; } function factory() public view returns (address) { return address(_factory); } function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } constructor() { _factory = IXchangeFactory(msg.sender); } // called once by the factory at time of deployment function initialize(address _token0, address _token1) external { require(msg.sender == address(_factory), 'Xchange: FORBIDDEN'); // sufficient check token0 = _token0; token1 = _token1; } function mintFee() external { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings _mintFee(_reserve0, _reserve1); } function setMinimumBalance(address tokenAddress, uint112 minimumAmount) external { require(_factory.isTrusted(msg.sender),'Xchange: FORBIDDEN'); tokenMinimumBalance[tokenAddress] = minimumAmount; if (tokenMinimumBalance[token0] == 0 && tokenMinimumBalance[token1] == 0) { hasMinimums = false; } else { hasMinimums = true; } } // this low-level function should be called from a contract which performs important safety checks // The caller should try to call `sync` or `syncSafe` function withdrawTokensAgainstMinimumBalance(address tokenAddress, address to, uint112 amount) external returns (uint112) { require(_factory.isTrusted(msg.sender),'Xchange: FORBIDDEN'); if (amount > tokenMinimumBalance[tokenAddress]) { amount = tokenMinimumBalance[tokenAddress]; } tokenMinimumBalance[tokenAddress] -= amount; _safeTransfer(tokenAddress, to, amount); if (tokenMinimumBalance[token0] == 0 && tokenMinimumBalance[token1] == 0) { hasMinimums = false; } return amount; } // this low-level function should be called from a contract which performs important safety checks function mint(address to) external lock 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 - _reserve0; uint amount1 = balance1 - _reserve1; bool feeOn = _mintFee(_reserve0, _reserve1); uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(amount0 * amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(amount0 * _totalSupply / _reserve0, amount1 * _totalSupply / _reserve1); } require(liquidity > 0, 'Xchange: INSUFFICIENT_LIQUIDITY_MINTED'); _mint(to, liquidity); _update(balance0, balance1, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date emit Mint(msg.sender, amount0, amount1); } // this low-level function should be called from a contract which performs important safety checks function burn(address to) external lock returns (uint amount0, uint amount1) { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings 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 * balance0 / _totalSupply; // using balances ensures pro-rata distribution amount1 = liquidity * balance1 / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, 'Xchange: 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, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date if (hasMinimums) { require(balance0 >= tokenMinimumBalance[_token0], 'Xchange: INSUFFICIENT_TOKEN0_BALANCE'); require(balance1 >= tokenMinimumBalance[_token1], 'Xchange: INSUFFICIENT_TOKEN1_BALANCE'); } emit Burn(msg.sender, amount0, amount1, to); } function mustBurn(address to, uint256 gasAmount) external lock returns (uint amount0, uint amount1) { require(_factory.isFailsafeLiquidator(msg.sender)); (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings address _token0 = token0; // gas savings address _token1 = token1; // gas savings uint balance0 = _reserve0; uint balance1 = _reserve1; 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 * balance0 / _totalSupply; // using balances ensures pro-rata distribution amount1 = liquidity * balance1 / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, 'Xchange: INSUFFICIENT_LIQUIDITY_BURNED'); _burn(address(this), liquidity); amount0 = _trySafeTransfer(_token0, to, amount0, gasAmount); amount1 = _trySafeTransfer(_token1, to, amount1, gasAmount); if (gasAmount > 0) { try IERC20(_token0).balanceOf{gas: gasAmount}(address(this)) returns (uint256 balance0_) { balance0 = balance0_; } catch {} try IERC20(_token1).balanceOf{gas: gasAmount}(address(this)) returns (uint256 balance1_) { balance1 = balance1_; } catch {} } else { balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); } _update(balance0, balance1, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date if (hasMinimums) { require(balance0 >= tokenMinimumBalance[_token0], 'Xchange: INSUFFICIENT_TOKEN0_BALANCE'); require(balance1 >= tokenMinimumBalance[_token1], 'Xchange: INSUFFICIENT_TOKEN1_BALANCE'); } 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 { _swap(amount0Out, amount1Out, to, 200, data); } // this low-level function should be called from a contract which performs important safety checks function swapWithDiscount(uint amount0Out, uint amount1Out, address to, uint feeAmountOverride, bytes calldata data) external lock { _swap(amount0Out, amount1Out, to, feeAmountOverride, data); } // force balances to match reserves function skim(address to) external lock { address _token0 = token0; // gas savings address _token1 = token1; // gas savings _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)) - reserve0); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)) - reserve1); if (hasMinimums) { require(IERC20(_token0).balanceOf(address(this)) >= tokenMinimumBalance[_token0], 'Xchange: INSUFFICIENT_TOKEN0_BALANCE'); require(IERC20(_token1).balanceOf(address(this)) >= tokenMinimumBalance[_token1], 'Xchange: INSUFFICIENT_TOKEN1_BALANCE'); } } // force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } // attempt to force reserves to match balances function syncSafe(uint256 gasAmountToken0, uint256 gasAmountToken1) external lock { require(_factory.isTrusted(msg.sender), 'Xchange: FORBIDDEN'); _update(IERC20(token0).balanceOf{gas: gasAmountToken0}(address(this)), IERC20(token1).balanceOf{gas: gasAmountToken1}(address(this)), reserve0, reserve1); } // if fee is on, mint liquidity equivalent to 1/2th of the growth in sqrt(k) function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) { address feeTo = _factory.feeTo(); feeOn = feeTo != address(0); uint _kLast = kLast; // gas savings if (feeOn) { if (_kLast != 0) { uint rootK = Math.sqrt(uint(_reserve0) * _reserve1); uint rootKLast = Math.sqrt(_kLast); if (rootK > rootKLast) { uint numerator = totalSupply * (rootK - rootKLast); uint denominator = rootK + rootKLast; uint liquidity = numerator / denominator; if (liquidity > 0) _mint(feeTo, liquidity); } } } else if (_kLast != 0) { kLast = 0; } } function _swap(uint amount0Out, uint amount1Out, address to, uint feeAmountOverride, bytes calldata data) internal { require(amount0Out > 0 || amount1Out > 0, 'Xchange: INSUFFICIENT_OUTPUT_AMOUNT'); (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings require(amount0Out < _reserve0 && amount1Out < _reserve1, 'Xchange: INSUFFICIENT_LIQUIDITY'); uint[2] memory balances; { // scope for _token{0,1}, avoids stack too deep errors address _token0 = token0; address _token1 = token1; if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data); balances[0] = IERC20(_token0).balanceOf(address(this)); balances[1] = IERC20(_token1).balanceOf(address(this)); if (hasMinimums) { require(balances[0] >= tokenMinimumBalance[_token0], 'Xchange: INSUFFICIENT_TOKEN0_BALANCE'); require(balances[1] >= tokenMinimumBalance[_token1], 'Xchange: INSUFFICIENT_TOKEN1_BALANCE'); } } uint amount0In = balances[0] > _reserve0 - amount0Out ? balances[0] - (_reserve0 - amount0Out) : 0; uint amount1In = balances[1] > _reserve1 - amount1Out ? balances[1] - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, 'Xchange: INSUFFICIENT_INPUT_AMOUNT'); { // scope for reserve{0,1}Adjusted, avoids stack too deep errors uint feeAmount = 200; if (feeAmountOverride != 200) { if (_factory.isTrusted(msg.sender)) { feeAmount = feeAmountOverride; } else { feeAmount = IXchangeDiscountAuthority(_factory.discountAuthority()).fee(msg.sender); } feeAmount = feeAmount <= 200 ? feeAmount : 200; } uint balance0Adjusted = (balances[0] * 100000) - (amount0In * feeAmount); uint balance1Adjusted = (balances[1] * 100000) - (amount1In * feeAmount); require(balance0Adjusted * balance1Adjusted >= uint(_reserve0) * _reserve1 * 100000**2, 'Xchange: K'); } _update(balances[0], balances[1], _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private { require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'Xchange: OVERFLOW'); unchecked { uint32 timeElapsed = uint32(block.timestamp) - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { // * never overflows, and + overflow is desired price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed; price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed; } } reserve0 = uint112(balance0); reserve1 = uint112(balance1); blockTimestampLast = uint32(block.timestamp); emit Sync(reserve0, reserve1); } 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))), 'Xchange: TRANSFER_FAILED'); } function _trySafeTransfer(address token, address to, uint value, uint gasAmount) private returns (uint) { (bool ok,) = token.call{gas: gasAmount}(abi.encodeWithSelector(SELECTOR, to, value)); if (ok) { return value; } else { return 0; } } } contract XchangeFactory is IXchangeFactory, Ownable { address public feeTo; address public discountAuthority; mapping(address => bool) _isTrusted; mapping(address => bool) _isFailSafeLiquidator; mapping(address => mapping(address => address)) public getPair; mapping(address => bool) public isPair; address[] public allPairs; // Pair Address => token address => Is in the pair mapping(address => mapping(address => bool)) public pairTokens; constructor() Ownable(msg.sender) { _isTrusted[address(this)] = true; } function allPairsLength() external view returns (uint) { return allPairs.length; } function isTrusted(address checkAddress) external view returns (bool) { return _isTrusted[checkAddress]; } function isFailsafeLiquidator(address checkAddress) external view returns (bool) { return _isFailSafeLiquidator[checkAddress]; } function setFeeTo(address _feeTo) external onlyOwner { require(_feeTo != feeTo); address oldFeeToo = feeTo; feeTo = _feeTo; emit FeeToSet(oldFeeToo, _feeTo); } function setDiscountAuthority(address _discountAuthority) external onlyOwner { require(_discountAuthority != discountAuthority); address oldDiscountAuthority = discountAuthority; discountAuthority = _discountAuthority; emit DiscountAuthoritySet(oldDiscountAuthority, _discountAuthority); } function setTrusted(address trustAddress, bool shouldTrustAddress) external onlyOwner { require(_isTrusted[trustAddress] != shouldTrustAddress); _isTrusted[trustAddress] = shouldTrustAddress; emit TrustedSet(trustAddress, shouldTrustAddress); } function setFailsafeLiquidator(address trustAddress, bool shouldTrustAddress) external onlyOwner { require(_isFailSafeLiquidator[trustAddress] != shouldTrustAddress); _isFailSafeLiquidator[trustAddress] = shouldTrustAddress; emit FailsafeLiquidatorSet(trustAddress, shouldTrustAddress); } function createPair(address tokenA, address tokenB) external returns (address pair) { require(tokenA != tokenB, 'Xchange: IDENTICAL_ADDRESSES'); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'Xchange: ZERO_ADDRESS'); require(getPair[token0][token1] == address(0), 'Xchange: PAIR_EXISTS'); // single check is sufficient bytes memory bytecode = type(XchangePair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) } IXchangePair(pair).initialize(token0, token1); getPair[token0][token1] = pair; getPair[token1][token0] = pair; // populate mapping in the reverse direction pairTokens[pair][token0] = true; pairTokens[pair][token1] = true; isPair[pair] = true; allPairs.push(pair); emit PairCreated(token0, token1, pair, allPairs.length); } } // 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; } } } // 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}],"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":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":[{"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":"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":[],"name":"hasMinimums","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"mintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"mustBurn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","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":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint112","name":"minimumAmount","type":"uint112"}],"name":"setMinimumBalance","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":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"feeAmountOverride","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swapWithDiscount","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":[{"internalType":"uint256","name":"gasAmountToken0","type":"uint256"},{"internalType":"uint256","name":"gasAmountToken1","type":"uint256"}],"name":"syncSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenMinimumBalance","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"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"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint112","name":"amount","type":"uint112"}],"name":"withdrawTokensAgainstMinimumBalance","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600e5534801561001557600080fd5b50604080518082018252600e81526d586368616e676520414d4d20563160901b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f74972fe396d9537d3a5efe1ef0ac7dd89248cbd05a7fbdb5a940874aa7336a45818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600355600580546001600160a01b0319163317905561469b8061010c6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80636a62784211610145578063ba9a7a56116100bd578063d505accf1161008c578063e2507dab11610071578063e2507dab14610622578063ed6e76e11461062f578063fff6cae91461064257600080fd5b8063d505accf146105e4578063dd62ed3e146105f757600080fd5b8063ba9a7a561461058a578063bc25cf7714610593578063c45a0155146105a6578063d21220a7146105c457600080fd5b806389afcb4411610114578063a9059cbb116100f9578063a9059cbb14610534578063a90a3a9514610547578063ac637caa1461057757600080fd5b806389afcb44146104e557806395d89b41146104f857600080fd5b80636a6278421461048957806370a082311461049c5780637464fc3d146104bc5780637ecebe00146104c557600080fd5b806318160ddd116101d85780633644e515116101a7578063485cc9551161018c578063485cc955146104645780635909c0d5146104775780635a3d54931461048057600080fd5b80633644e51514610429578063468d9c671461043257600080fd5b806318160ddd146103be57806323b872dd146103d557806330adf81f146103e8578063313ce5671461040f57600080fd5b80630902f1ac116102145780630902f1ac146102e8578063095ea7b31461034e5780630dfe16811461037157806313966db5146103b657600080fd5b8063022c0d9f14610246578063030cbb2c1461025b57806306fdde031461026e57806308f61154146102c0575b600080fd5b61025961025436600461403b565b61064a565b005b6102596102693660046140a5565b6106db565b6102aa6040518060400160405280600e81526020017f586368616e676520414d4d20563100000000000000000000000000000000000081525081565b6040516102b791906140f7565b60405180910390f35b6102d36102ce366004614148565b6109a7565b604080519283526020830191909152016102b7565b600854604080516dffffffffffffffffffffffffffff80841682526e01000000000000000000000000000084041660208201527c010000000000000000000000000000000000000000000000000000000090920463ffffffff16908201526060016102b7565b61036161035c366004614148565b611131565b60405190151581526020016102b7565b6006546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b7565b610259611147565b6103c760005481565b6040519081526020016102b7565b6103616103e3366004614174565b6111b7565b6103c77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610417601281565b60405160ff90911681526020016102b7565b6103c760035481565b6104456104403660046141d3565b611291565b6040516dffffffffffffffffffffffffffff90911681526020016102b7565b61025961047236600461421a565b611545565b6103c760095481565b6103c7600a5481565b6103c7610497366004614253565b611619565b6103c76104aa366004614253565b60016020526000908152604090205481565b6103c7600b5481565b6103c76104d3366004614253565b60046020526000908152604090205481565b6102d36104f3366004614253565b6119f8565b6102aa6040518060400160405280600981526020017f58372d414d4d2d5631000000000000000000000000000000000000000000000081525081565b610361610542366004614148565b612042565b610445610555366004614253565b600d602052600090815260409020546dffffffffffffffffffffffffffff1681565b610259610585366004614270565b61204f565b6103c76103e881565b6102596105a1366004614253565b612259565b60055473ffffffffffffffffffffffffffffffffffffffff16610391565b6007546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6102596105f23660046142b4565b6126a2565b6103c761060536600461421a565b600260209081526000928352604080842090915290825290205481565b600c546103619060ff1681565b61025961063d366004614325565b61298d565b610259612a19565b600e546001146106bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064015b60405180910390fd5b6000600e556106cf85858560c88686612bb7565b50506001600e55505050565b600e54600114610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190614398565b610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b6006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261099e9173ffffffffffffffffffffffffffffffffffffffff16906370a082319085906024016020604051808303818786fa1580156108b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108db91906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319085906024016020604051808303818786fa15801561094b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061097091906143ba565b6008546dffffffffffffffffffffffffffff808216916e010000000000000000000000000000900416613582565b50506001600e55565b600080600e54600114610a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556005546040517fbae064f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bae064f490602401602060405180830381865afa158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad9190614398565b610ab657600080fd5b600080610b126008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b506006546007543060009081526001602052604081205494965092945073ffffffffffffffffffffffffffffffffffffffff918216939116916dffffffffffffffffffffffffffff8087169290861691610b6c8888613815565b60005490915080610b7d8685614402565b610b87919061446e565b9a5080610b948585614402565b610b9e919061446e565b995060008b118015610bb0575060008a115b610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4255524e4544000000000000000000000000000000000000000000000000000060648201526084016106b2565b610c463084613976565b610c52878e8d8f613a31565b9a50610c60868e8c8f613a31565b99508b15610dca576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a08231908e906024016020604051808303818786fa93505050508015610d0f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610d0c918101906143ba565b60015b15610d175794505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8716906370a08231908e906024016020604051808303818786fa93505050508015610dbe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610dbb918101906143ba565b60015b15610eec579350610eec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5891906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290955073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa158015610ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee991906143ba565b93505b610ef885858b8b613582565b8115610f3357600854610f2f906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b600c5460ff16156110c65773ffffffffffffffffffffffffffffffffffffffff87166000908152600d60205260409020546dffffffffffffffffffffffffffff16851015611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600d60205260409020546dffffffffffffffffffffffffffff168410156110c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8f169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600e819055509250929050565b600061113e338484613b5d565b50600192915050565b6000806111a36008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50915091506111b28282613815565b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461127c5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915290205461124a908390614482565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b611287848484613bcc565b5060019392505050565b6005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906396d6487990602401602060405180830381865afa158015611300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113249190614398565b61138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d60205260409020546dffffffffffffffffffffffffffff90811690831611156114045773ffffffffffffffffffffffffffffffffffffffff84166000908152600d60205260409020546dffffffffffffffffffffffffffff1691505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812080548492906114499084906dffffffffffffffffffffffffffff16614499565b92506101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506114968484846dffffffffffffffffffffffffffff16613c9b565b60065473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16158015611510575060075473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16155b1561153e57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5092915050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b6000600e54600114611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e819055600854600654604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516dffffffffffffffffffffffffffff808516956e01000000000000000000000000000090950416939273ffffffffffffffffffffffffffffffffffffffff16916370a082319160248083019260209291908290030181865afa15801561172d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175191906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156117c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e991906143ba565b905060006118076dffffffffffffffffffffffffffff861684614482565b905060006118256dffffffffffffffffffffffffffff861684614482565b905060006118338787613815565b60008054919250819003611874576103e86118566118518587614402565b613e3b565b6118609190614482565b985061186f60006103e8613eab565b6118c9565b6118c66dffffffffffffffffffffffffffff89166118928387614402565b61189c919061446e565b6dffffffffffffffffffffffffffff89166118b78487614402565b6118c1919061446e565b613f4a565b98505b60008911611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4d494e544544000000000000000000000000000000000000000000000000000060648201526084016106b2565b6119638a8a613eab565b61196f86868a8a613582565b81156119aa576008546119a6906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600e5550949695505050505050565b600080600e54600114611a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e819055600854600654600754604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516dffffffffffffffffffffffffffff808616966e010000000000000000000000000000909604169473ffffffffffffffffffffffffffffffffffffffff94851694909316929184916370a08231916024808201926020929091908290030181865afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd191906143ba565b30600090815260016020526040812054919250611bee8888613815565b60005490915080611bff8685614402565b611c09919061446e565b9a5080611c168585614402565b611c20919061446e565b995060008b118015611c32575060008a115b611cbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4255524e4544000000000000000000000000000000000000000000000000000060648201526084016106b2565b611cc83084613976565b611cd3878d8d613c9b565b611cde868d8c613c9b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290955073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd91906143ba565b9350611e0b85858b8b613582565b8115611e4657600854611e42906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b600c5460ff1615611fd95773ffffffffffffffffffffffffffffffffffffffff87166000908152600d60205260409020546dffffffffffffffffffffffffffff16851015611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600d60205260409020546dffffffffffffffffffffffffffff16841015611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600e81905550915091565b600061113e338484613bcc565b6005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156120bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e19190614398565b612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600d602052604080822080547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff868116919091179091556006549093168252902054161580156121f9575060075473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16155b1561222a57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b600e546001146122c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556006546007546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff938416939092169161239191849186916dffffffffffffffffffffffffffff169083906370a08231906024015b602060405180830381865afa15801561235e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238291906143ba565b61238c9190614482565b613c9b565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261241191839186916e01000000000000000000000000000090046dffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401612341565b600c5460ff16156126985773ffffffffffffffffffffffffffffffffffffffff82166000818152600d6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff90911691906370a0823190602401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906143ba565b101561255a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600d6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff90911691906370a0823190602401602060405180830381865afa1580156125e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260b91906143ba565b1015612698576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b50506001600e5550565b4284101561270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f586368616e67653a20455850495245440000000000000000000000000000000060448201526064016106b2565b60035473ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761276c836144c8565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161280d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612896573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061291157508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586368616e67653a20494e56414c49445f5349474e415455524500000000000060448201526064016106b2565b612982898989613b5d565b505050505050505050565b600e546001146129f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e55612a0c868686868686612bb7565b50506001600e5550505050565b600e54600114612a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556006546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612bb09173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1e91906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612b8c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097091906143ba565b6001600e55565b6000861180612bc65750600085115b612c52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106b2565b600080612cae6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b5091509150816dffffffffffffffffffffffffffff1688108015612ce15750806dffffffffffffffffffffffffffff1687105b612d47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954590060448201526064016106b2565b612d4f613faf565b60065460075473ffffffffffffffffffffffffffffffffffffffff91821691168a15612d8057612d80828a8d613c9b565b8915612d9157612d91818a8c613c9b565b8515612e24576040517f10d1e85c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906310d1e85c90612df19033908f908f908d908d90600401614500565b600060405180830381600087803b158015612e0b57600080fd5b505af1158015612e1f573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb291906143ba565b83526040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa158015612f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4291906143ba565b6020840152600c5460ff16156130e45773ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205483516dffffffffffffffffffffffffffff9091161115613019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d60205260409020546dffffffffffffffffffffffffffff16836001602002015110156130e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b50600090506131038a6dffffffffffffffffffffffffffff8616614482565b825111613111576000613137565b61312b8a6dffffffffffffffffffffffffffff8616614482565b82516131379190614482565b905060006131558a6dffffffffffffffffffffffffffff8616614482565b60208401511161316657600061318f565b6131808a6dffffffffffffffffffffffffffff8616614482565b602084015161318f9190614482565b905060008211806131a05750600081115b61322c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f586368616e67653a20494e53554646494349454e545f494e5055545f414d4f5560448201527f4e5400000000000000000000000000000000000000000000000000000000000060648201526084016106b2565b60c888811461340f576005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156132a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c79190614398565b156132d35750876133fa565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166334091a436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133649190614578565b6040517f6fcca69b00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9190911690636fcca69b90602401602060405180830381865afa1580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f49190614595565b60ff1690505b60c881111561340a5760c861340c565b805b90505b600061341b8285614402565b855161342a90620186a0614402565b6134349190614482565b905060006134428385614402565b602087015161345490620186a0614402565b61345e9190614482565b905061347d6dffffffffffffffffffffffffffff808916908a16614402565b61348c906402540be400614402565b6134968284614402565b10156134fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f586368616e67653a204b0000000000000000000000000000000000000000000060448201526064016106b2565b50508351602085015161351392508787613582565b60408051838152602081018390529081018c9052606081018b905273ffffffffffffffffffffffffffffffffffffffff8a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a35050505050505050505050565b6dffffffffffffffffffffffffffff84118015906135ae57506dffffffffffffffffffffffffffff8311155b613614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f586368616e67653a204f564552464c4f5700000000000000000000000000000060448201526064016106b2565b60085463ffffffff7c0100000000000000000000000000000000000000000000000000000000909104811642039081161580159061366157506dffffffffffffffffffffffffffff831615155b801561367c57506dffffffffffffffffffffffffffff821615155b15613726578063ffffffff166136b98461369585613f62565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690613f93565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff81166136f98361369586613f62565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b506008805463ffffffff42167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8781166e0100000000000000000000000000009081027fffffffff000000000000000000000000000000000000000000000000000000009095168a83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a150505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015613885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a99190614578565b600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061396257801561395d5760006138f86118516dffffffffffffffffffffffffffff808816908916614402565b9050600061390583613e3b565b90508082111561395a57600061391b8284614482565b6000546139289190614402565b9050600061393683856145b2565b90506000613944828461446e565b90508015613956576139568782613eab565b5050505b50505b61396e565b801561396e576000600b555b505092915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546139a7908290614482565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040812091909155546139dc908290614482565b600090815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928816918591613af9916145ca565b60006040518083038160008787f1925050503d8060008114613b37576040519150601f19603f3d011682016040523d82523d6000602084013e613b3c565b606091505b505090508015613b4f5783915050613b55565b60009150505b949350505050565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054613bfd908290614482565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054613c3a9082906145b2565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613bbf9085815260200190565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392871691613d6291906145ca565b6000604051808303816000865af19150503d8060008114613d9f576040519150601f19603f3d011682016040523d82523d6000602084013e613da4565b606091505b5091509150818015613dce575080511580613dce575080806020019051810190613dce9190614398565b613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f586368616e67653a205452414e534645525f4641494c4544000000000000000060448201526064016106b2565b5050505050565b60006003821115613e9c5750806000613e5560028361446e565b613e609060016145b2565b90505b81811015613e9657905080600281613e7b818661446e565b613e8591906145b2565b613e8f919061446e565b9050613e63565b50919050565b8115613ea6575060015b919050565b80600054613eb991906145b2565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054613eec9082906145b2565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259085815260200190565b6000818310613f595781613f5b565b825b9392505050565b6000613f8d6e0100000000000000000000000000006dffffffffffffffffffffffffffff84166145e6565b92915050565b6000613f5b6dffffffffffffffffffffffffffff83168461462a565b60405180604001604052806002906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114613fef57600080fd5b50565b60008083601f84011261400457600080fd5b50813567ffffffffffffffff81111561401c57600080fd5b60208301915083602082850101111561403457600080fd5b9250929050565b60008060008060006080868803121561405357600080fd5b8535945060208601359350604086013561406c81613fcd565b9250606086013567ffffffffffffffff81111561408857600080fd5b61409488828901613ff2565b969995985093965092949392505050565b600080604083850312156140b857600080fd5b50508035926020909101359150565b60005b838110156140e25781810151838201526020016140ca565b838111156140f1576000848401525b50505050565b60208152600082518060208401526141168160408501602087016140c7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561415b57600080fd5b823561416681613fcd565b946020939093013593505050565b60008060006060848603121561418957600080fd5b833561419481613fcd565b925060208401356141a481613fcd565b929592945050506040919091013590565b80356dffffffffffffffffffffffffffff81168114613ea657600080fd5b6000806000606084860312156141e857600080fd5b83356141f381613fcd565b9250602084013561420381613fcd565b9150614211604085016141b5565b90509250925092565b6000806040838503121561422d57600080fd5b823561423881613fcd565b9150602083013561424881613fcd565b809150509250929050565b60006020828403121561426557600080fd5b8135613f5b81613fcd565b6000806040838503121561428357600080fd5b823561428e81613fcd565b915061429c602084016141b5565b90509250929050565b60ff81168114613fef57600080fd5b600080600080600080600060e0888a0312156142cf57600080fd5b87356142da81613fcd565b965060208801356142ea81613fcd565b955060408801359450606088013593506080880135614308816142a5565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060a0878903121561433e57600080fd5b8635955060208701359450604087013561435781613fcd565b935060608701359250608087013567ffffffffffffffff81111561437a57600080fd5b61438689828a01613ff2565b979a9699509497509295939492505050565b6000602082840312156143aa57600080fd5b81518015158114613f5b57600080fd5b6000602082840312156143cc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561443a5761443a6143d3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261447d5761447d61443f565b500490565b600082821015614494576144946143d3565b500390565b60006dffffffffffffffffffffffffffff838116908316818110156144c0576144c06143d3565b039392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f9576144f96143d3565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b60006020828403121561458a57600080fd5b8151613f5b81613fcd565b6000602082840312156145a757600080fd5b8151613f5b816142a5565b600082198211156145c5576145c56143d3565b500190565b600082516145dc8184602087016140c7565b9190910192915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831681851681830481118215151615614621576146216143d3565b02949350505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808416806146595761465961443f565b9216919091049291505056fea2646970667358221220714f04d8e48c40cdd4003123097e8896acfec0db0acb45b757662ee82e19129564736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c80636a62784211610145578063ba9a7a56116100bd578063d505accf1161008c578063e2507dab11610071578063e2507dab14610622578063ed6e76e11461062f578063fff6cae91461064257600080fd5b8063d505accf146105e4578063dd62ed3e146105f757600080fd5b8063ba9a7a561461058a578063bc25cf7714610593578063c45a0155146105a6578063d21220a7146105c457600080fd5b806389afcb4411610114578063a9059cbb116100f9578063a9059cbb14610534578063a90a3a9514610547578063ac637caa1461057757600080fd5b806389afcb44146104e557806395d89b41146104f857600080fd5b80636a6278421461048957806370a082311461049c5780637464fc3d146104bc5780637ecebe00146104c557600080fd5b806318160ddd116101d85780633644e515116101a7578063485cc9551161018c578063485cc955146104645780635909c0d5146104775780635a3d54931461048057600080fd5b80633644e51514610429578063468d9c671461043257600080fd5b806318160ddd146103be57806323b872dd146103d557806330adf81f146103e8578063313ce5671461040f57600080fd5b80630902f1ac116102145780630902f1ac146102e8578063095ea7b31461034e5780630dfe16811461037157806313966db5146103b657600080fd5b8063022c0d9f14610246578063030cbb2c1461025b57806306fdde031461026e57806308f61154146102c0575b600080fd5b61025961025436600461403b565b61064a565b005b6102596102693660046140a5565b6106db565b6102aa6040518060400160405280600e81526020017f586368616e676520414d4d20563100000000000000000000000000000000000081525081565b6040516102b791906140f7565b60405180910390f35b6102d36102ce366004614148565b6109a7565b604080519283526020830191909152016102b7565b600854604080516dffffffffffffffffffffffffffff80841682526e01000000000000000000000000000084041660208201527c010000000000000000000000000000000000000000000000000000000090920463ffffffff16908201526060016102b7565b61036161035c366004614148565b611131565b60405190151581526020016102b7565b6006546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b7565b610259611147565b6103c760005481565b6040519081526020016102b7565b6103616103e3366004614174565b6111b7565b6103c77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610417601281565b60405160ff90911681526020016102b7565b6103c760035481565b6104456104403660046141d3565b611291565b6040516dffffffffffffffffffffffffffff90911681526020016102b7565b61025961047236600461421a565b611545565b6103c760095481565b6103c7600a5481565b6103c7610497366004614253565b611619565b6103c76104aa366004614253565b60016020526000908152604090205481565b6103c7600b5481565b6103c76104d3366004614253565b60046020526000908152604090205481565b6102d36104f3366004614253565b6119f8565b6102aa6040518060400160405280600981526020017f58372d414d4d2d5631000000000000000000000000000000000000000000000081525081565b610361610542366004614148565b612042565b610445610555366004614253565b600d602052600090815260409020546dffffffffffffffffffffffffffff1681565b610259610585366004614270565b61204f565b6103c76103e881565b6102596105a1366004614253565b612259565b60055473ffffffffffffffffffffffffffffffffffffffff16610391565b6007546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6102596105f23660046142b4565b6126a2565b6103c761060536600461421a565b600260209081526000928352604080842090915290825290205481565b600c546103619060ff1681565b61025961063d366004614325565b61298d565b610259612a19565b600e546001146106bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064015b60405180910390fd5b6000600e556106cf85858560c88686612bb7565b50506001600e55505050565b600e54600114610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190614398565b610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b6006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261099e9173ffffffffffffffffffffffffffffffffffffffff16906370a082319085906024016020604051808303818786fa1580156108b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108db91906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319085906024016020604051808303818786fa15801561094b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061097091906143ba565b6008546dffffffffffffffffffffffffffff808216916e010000000000000000000000000000900416613582565b50506001600e55565b600080600e54600114610a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556005546040517fbae064f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9091169063bae064f490602401602060405180830381865afa158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad9190614398565b610ab657600080fd5b600080610b126008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b506006546007543060009081526001602052604081205494965092945073ffffffffffffffffffffffffffffffffffffffff918216939116916dffffffffffffffffffffffffffff8087169290861691610b6c8888613815565b60005490915080610b7d8685614402565b610b87919061446e565b9a5080610b948585614402565b610b9e919061446e565b995060008b118015610bb0575060008a115b610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4255524e4544000000000000000000000000000000000000000000000000000060648201526084016106b2565b610c463084613976565b610c52878e8d8f613a31565b9a50610c60868e8c8f613a31565b99508b15610dca576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a08231908e906024016020604051808303818786fa93505050508015610d0f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610d0c918101906143ba565b60015b15610d175794505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8716906370a08231908e906024016020604051808303818786fa93505050508015610dbe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610dbb918101906143ba565b60015b15610eec579350610eec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5891906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290955073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa158015610ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee991906143ba565b93505b610ef885858b8b613582565b8115610f3357600854610f2f906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b600c5460ff16156110c65773ffffffffffffffffffffffffffffffffffffffff87166000908152600d60205260409020546dffffffffffffffffffffffffffff16851015611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600d60205260409020546dffffffffffffffffffffffffffff168410156110c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8f169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600e819055509250929050565b600061113e338484613b5d565b50600192915050565b6000806111a36008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50915091506111b28282613815565b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461127c5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915290205461124a908390614482565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b611287848484613bcc565b5060019392505050565b6005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906396d6487990602401602060405180830381865afa158015611300573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113249190614398565b61138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d60205260409020546dffffffffffffffffffffffffffff90811690831611156114045773ffffffffffffffffffffffffffffffffffffffff84166000908152600d60205260409020546dffffffffffffffffffffffffffff1691505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d6020526040812080548492906114499084906dffffffffffffffffffffffffffff16614499565b92506101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506114968484846dffffffffffffffffffffffffffff16613c9b565b60065473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16158015611510575060075473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16155b1561153e57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5092915050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b6000600e54600114611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e819055600854600654604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516dffffffffffffffffffffffffffff808516956e01000000000000000000000000000090950416939273ffffffffffffffffffffffffffffffffffffffff16916370a082319160248083019260209291908290030181865afa15801561172d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175191906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925060009173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156117c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e991906143ba565b905060006118076dffffffffffffffffffffffffffff861684614482565b905060006118256dffffffffffffffffffffffffffff861684614482565b905060006118338787613815565b60008054919250819003611874576103e86118566118518587614402565b613e3b565b6118609190614482565b985061186f60006103e8613eab565b6118c9565b6118c66dffffffffffffffffffffffffffff89166118928387614402565b61189c919061446e565b6dffffffffffffffffffffffffffff89166118b78487614402565b6118c1919061446e565b613f4a565b98505b60008911611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4d494e544544000000000000000000000000000000000000000000000000000060648201526084016106b2565b6119638a8a613eab565b61196f86868a8a613582565b81156119aa576008546119a6906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600e5550949695505050505050565b600080600e54600114611a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e819055600854600654600754604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516dffffffffffffffffffffffffffff808616966e010000000000000000000000000000909604169473ffffffffffffffffffffffffffffffffffffffff94851694909316929184916370a08231916024808201926020929091908290030181865afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd191906143ba565b30600090815260016020526040812054919250611bee8888613815565b60005490915080611bff8685614402565b611c09919061446e565b9a5080611c168585614402565b611c20919061446e565b995060008b118015611c32575060008a115b611cbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954595f60448201527f4255524e4544000000000000000000000000000000000000000000000000000060648201526084016106b2565b611cc83084613976565b611cd3878d8d613c9b565b611cde868d8c613c9b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906143ba565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290955073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa158015611dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfd91906143ba565b9350611e0b85858b8b613582565b8115611e4657600854611e42906dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116614402565b600b555b600c5460ff1615611fd95773ffffffffffffffffffffffffffffffffffffffff87166000908152600d60205260409020546dffffffffffffffffffffffffffff16851015611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600d60205260409020546dffffffffffffffffffffffffffff16841015611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600e81905550915091565b600061113e338484613bcc565b6005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156120bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e19190614398565b612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f586368616e67653a20464f5242494444454e000000000000000000000000000060448201526064016106b2565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600d602052604080822080547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff868116919091179091556006549093168252902054161580156121f9575060075473ffffffffffffffffffffffffffffffffffffffff166000908152600d60205260409020546dffffffffffffffffffffffffffff16155b1561222a57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050565b600e546001146122c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556006546007546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff938416939092169161239191849186916dffffffffffffffffffffffffffff169083906370a08231906024015b602060405180830381865afa15801561235e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238291906143ba565b61238c9190614482565b613c9b565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261241191839186916e01000000000000000000000000000090046dffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401612341565b600c5460ff16156126985773ffffffffffffffffffffffffffffffffffffffff82166000818152600d6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff90911691906370a0823190602401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906143ba565b101561255a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600d6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff90911691906370a0823190602401602060405180830381865afa1580156125e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260b91906143ba565b1015612698576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b50506001600e5550565b4284101561270c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f586368616e67653a20455850495245440000000000000000000000000000000060448201526064016106b2565b60035473ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761276c836144c8565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161280d9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612896573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061291157508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f586368616e67653a20494e56414c49445f5349474e415455524500000000000060448201526064016106b2565b612982898989613b5d565b505050505050505050565b600e546001146129f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e55612a0c868686868686612bb7565b50506001600e5550505050565b600e54600114612a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f586368616e67653a204c4f434b4544000000000000000000000000000000000060448201526064016106b2565b6000600e556006546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612bb09173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1e91906143ba565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015612b8c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097091906143ba565b6001600e55565b6000861180612bc65750600085115b612c52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f586368616e67653a20494e53554646494349454e545f4f55545055545f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106b2565b600080612cae6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b5091509150816dffffffffffffffffffffffffffff1688108015612ce15750806dffffffffffffffffffffffffffff1687105b612d47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f586368616e67653a20494e53554646494349454e545f4c49515549444954590060448201526064016106b2565b612d4f613faf565b60065460075473ffffffffffffffffffffffffffffffffffffffff91821691168a15612d8057612d80828a8d613c9b565b8915612d9157612d91818a8c613c9b565b8515612e24576040517f10d1e85c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906310d1e85c90612df19033908f908f908d908d90600401614500565b600060405180830381600087803b158015612e0b57600080fd5b505af1158015612e1f573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb291906143ba565b83526040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa158015612f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4291906143ba565b6020840152600c5460ff16156130e45773ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205483516dffffffffffffffffffffffffffff9091161115613019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e305f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d60205260409020546dffffffffffffffffffffffffffff16836001602002015110156130e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f586368616e67653a20494e53554646494349454e545f544f4b454e315f42414c60448201527f414e43450000000000000000000000000000000000000000000000000000000060648201526084016106b2565b50600090506131038a6dffffffffffffffffffffffffffff8616614482565b825111613111576000613137565b61312b8a6dffffffffffffffffffffffffffff8616614482565b82516131379190614482565b905060006131558a6dffffffffffffffffffffffffffff8616614482565b60208401511161316657600061318f565b6131808a6dffffffffffffffffffffffffffff8616614482565b602084015161318f9190614482565b905060008211806131a05750600081115b61322c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f586368616e67653a20494e53554646494349454e545f494e5055545f414d4f5560448201527f4e5400000000000000000000000000000000000000000000000000000000000060648201526084016106b2565b60c888811461340f576005546040517f96d6487900000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906396d6487990602401602060405180830381865afa1580156132a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c79190614398565b156132d35750876133fa565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166334091a436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133649190614578565b6040517f6fcca69b00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9190911690636fcca69b90602401602060405180830381865afa1580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f49190614595565b60ff1690505b60c881111561340a5760c861340c565b805b90505b600061341b8285614402565b855161342a90620186a0614402565b6134349190614482565b905060006134428385614402565b602087015161345490620186a0614402565b61345e9190614482565b905061347d6dffffffffffffffffffffffffffff808916908a16614402565b61348c906402540be400614402565b6134968284614402565b10156134fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f586368616e67653a204b0000000000000000000000000000000000000000000060448201526064016106b2565b50508351602085015161351392508787613582565b60408051838152602081018390529081018c9052606081018b905273ffffffffffffffffffffffffffffffffffffffff8a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a35050505050505050505050565b6dffffffffffffffffffffffffffff84118015906135ae57506dffffffffffffffffffffffffffff8311155b613614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f586368616e67653a204f564552464c4f5700000000000000000000000000000060448201526064016106b2565b60085463ffffffff7c0100000000000000000000000000000000000000000000000000000000909104811642039081161580159061366157506dffffffffffffffffffffffffffff831615155b801561367c57506dffffffffffffffffffffffffffff821615155b15613726578063ffffffff166136b98461369585613f62565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690613f93565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff81166136f98361369586613f62565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b506008805463ffffffff42167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8781166e0100000000000000000000000000009081027fffffffff000000000000000000000000000000000000000000000000000000009095168a83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a150505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015613885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a99190614578565b600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061396257801561395d5760006138f86118516dffffffffffffffffffffffffffff808816908916614402565b9050600061390583613e3b565b90508082111561395a57600061391b8284614482565b6000546139289190614402565b9050600061393683856145b2565b90506000613944828461446e565b90508015613956576139568782613eab565b5050505b50505b61396e565b801561396e576000600b555b505092915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546139a7908290614482565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040812091909155546139dc908290614482565b600090815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928816918591613af9916145ca565b60006040518083038160008787f1925050503d8060008114613b37576040519150601f19603f3d011682016040523d82523d6000602084013e613b3c565b606091505b505090508015613b4f5783915050613b55565b60009150505b949350505050565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054613bfd908290614482565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054613c3a9082906145b2565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613bbf9085815260200190565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392871691613d6291906145ca565b6000604051808303816000865af19150503d8060008114613d9f576040519150601f19603f3d011682016040523d82523d6000602084013e613da4565b606091505b5091509150818015613dce575080511580613dce575080806020019051810190613dce9190614398565b613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f586368616e67653a205452414e534645525f4641494c4544000000000000000060448201526064016106b2565b5050505050565b60006003821115613e9c5750806000613e5560028361446e565b613e609060016145b2565b90505b81811015613e9657905080600281613e7b818661446e565b613e8591906145b2565b613e8f919061446e565b9050613e63565b50919050565b8115613ea6575060015b919050565b80600054613eb991906145b2565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054613eec9082906145b2565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a259085815260200190565b6000818310613f595781613f5b565b825b9392505050565b6000613f8d6e0100000000000000000000000000006dffffffffffffffffffffffffffff84166145e6565b92915050565b6000613f5b6dffffffffffffffffffffffffffff83168461462a565b60405180604001604052806002906020820280368337509192915050565b73ffffffffffffffffffffffffffffffffffffffff81168114613fef57600080fd5b50565b60008083601f84011261400457600080fd5b50813567ffffffffffffffff81111561401c57600080fd5b60208301915083602082850101111561403457600080fd5b9250929050565b60008060008060006080868803121561405357600080fd5b8535945060208601359350604086013561406c81613fcd565b9250606086013567ffffffffffffffff81111561408857600080fd5b61409488828901613ff2565b969995985093965092949392505050565b600080604083850312156140b857600080fd5b50508035926020909101359150565b60005b838110156140e25781810151838201526020016140ca565b838111156140f1576000848401525b50505050565b60208152600082518060208401526141168160408501602087016140c7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561415b57600080fd5b823561416681613fcd565b946020939093013593505050565b60008060006060848603121561418957600080fd5b833561419481613fcd565b925060208401356141a481613fcd565b929592945050506040919091013590565b80356dffffffffffffffffffffffffffff81168114613ea657600080fd5b6000806000606084860312156141e857600080fd5b83356141f381613fcd565b9250602084013561420381613fcd565b9150614211604085016141b5565b90509250925092565b6000806040838503121561422d57600080fd5b823561423881613fcd565b9150602083013561424881613fcd565b809150509250929050565b60006020828403121561426557600080fd5b8135613f5b81613fcd565b6000806040838503121561428357600080fd5b823561428e81613fcd565b915061429c602084016141b5565b90509250929050565b60ff81168114613fef57600080fd5b600080600080600080600060e0888a0312156142cf57600080fd5b87356142da81613fcd565b965060208801356142ea81613fcd565b955060408801359450606088013593506080880135614308816142a5565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060a0878903121561433e57600080fd5b8635955060208701359450604087013561435781613fcd565b935060608701359250608087013567ffffffffffffffff81111561437a57600080fd5b61438689828a01613ff2565b979a9699509497509295939492505050565b6000602082840312156143aa57600080fd5b81518015158114613f5b57600080fd5b6000602082840312156143cc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561443a5761443a6143d3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261447d5761447d61443f565b500490565b600082821015614494576144946143d3565b500390565b60006dffffffffffffffffffffffffffff838116908316818110156144c0576144c06143d3565b039392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f9576144f96143d3565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b60006020828403121561458a57600080fd5b8151613f5b81613fcd565b6000602082840312156145a757600080fd5b8151613f5b816142a5565b600082198211156145c5576145c56143d3565b500190565b600082516145dc8184602087016140c7565b9190910192915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80831681851681830481118215151615614621576146216143d3565b02949350505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff808416806146595761465961443f565b9216919091049291505056fea2646970667358221220714f04d8e48c40cdd4003123097e8896acfec0db0acb45b757662ee82e19129564736f6c634300080f0033
Deployed Bytecode Sourcemap
12243:15359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20795:158;;;;;;:::i;:::-;;:::i;:::-;;22228:326;;;;;;:::i;:::-;;:::i;9079:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;18504:2179;;;;;;:::i;:::-;;:::i;:::-;;;;2668:25:1;;;2724:2;2709:18;;2702:34;;;;2641:18;18504:2179:0;2494:248:1;13420:231:0;13553:8;;13420:231;;;13553:8;;;;2996:34:1;;13584:8:0;;;;3061:2:1;3046:18;;3039:43;13625:18:0;;;;;;3098::1;;;3091:51;2935:2;2920:18;13420:231:0;2747:401:1;10139:147:0;;;;;;:::i;:::-;;:::i;:::-;;;3318:14:1;;3311:22;3293:41;;3281:2;3266:18;10139:147:0;3153:187:1;12518:21:0;;;;;;;;;;;;3521:42:1;3509:55;;;3491:74;;3479:2;3464:18;12518:21:0;3345:226:1;14021:158:0;;;:::i;9224:24::-;;;;;;;;;3722:25:1;;;3710:2;3695:18;9224:24:0;3576:177:1;10441:304:0;;;;;;:::i;:::-;;:::i;9516:108::-;;9558:66;9516:108;;9182:35;;9215:2;9182:35;;;;;4573:4:1;4561:17;;;4543:36;;4531:2;4516:18;9182:35:0;4401:184:1;9373:31:0;;;;;;14761:591;;;;;;:::i;:::-;;:::i;:::-;;;5422:30:1;5410:43;;;5392:62;;5380:2;5365:18;14761:591:0;5246:214:1;13795:218:0;;;;;;:::i;:::-;;:::i;12869:32::-;;;;;;12908;;;;;;15464:1218;;;;;;:::i;:::-;;:::i;9255:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;12947:17;;;;;;9631:38;;;;;;:::i;:::-;;;;;;;;;;;;;;16794:1702;;;;;;:::i;:::-;;:::i;9132:43::-;;;;;;;;;;;;;;;;;;;;;10294:139;;;;;;:::i;:::-;;:::i;13083:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14187:403;;;;;;:::i;:::-;;:::i;12337:46::-;;12378:5;12337:46;;21322:639;;;;;;:::i;:::-;;:::i;13320:92::-;13395:8;;;;13320:92;;12546:21;;;;;;;;;10753:670;;;;;;:::i;:::-;;:::i;9303:61::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;13053:23;;;;;;;;;21065:208;;;;;;:::i;:::-;;:::i;22010:158::-;;;:::i;20795:::-;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;;;;;;;;;13268:1;13257:8;:12;20901:44:::1;20907:10:::0;20919;20931:2;20935:3:::1;20940:4:::0;;20901:5:::1;:44::i;:::-;-1:-1:-1::0;;13303:1:0;13292:8;:12;-1:-1:-1;;;20795:158:0:o;22228:326::-;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;22329:8:::1;::::0;:30:::1;::::0;;;;22348:10:::1;22329:30;::::0;::::1;3491:74:1::0;22329:8:0::1;::::0;;::::1;::::0;:18:::1;::::0;3464::1;;22329:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22321:61;;;::::0;::::1;::::0;;8944:2:1;22321:61:0::1;::::0;::::1;8926:21:1::0;8983:2;8963:18;;;8956:30;9022:20;9002:18;;;8995:48;9060:18;;22321:61:0::1;8742:342:1::0;22321:61:0::1;22408:6;::::0;22401:61:::1;::::0;;;;22456:4:::1;22401:61;::::0;::::1;3491:74:1::0;22393:153:0::1;::::0;22408:6:::1;;::::0;22401:24:::1;::::0;22431:15;;3464:18:1;;22401:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22471:6;::::0;22464:61:::1;::::0;;;;22519:4:::1;22464:61;::::0;::::1;3491:74:1::0;22471:6:0::1;::::0;;::::1;::::0;22464:24:::1;::::0;22494:15;;3464:18:1;;22464:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22527:8;::::0;::::1;::::0;;::::1;::::0;22537;;::::1;;22393:7;:153::i;:::-;-1:-1:-1::0;;13303:1:0;13292:8;:12;22228:326::o;18504:2179::-;18576:12;18590;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;18623:8:::1;::::0;:41:::1;::::0;;;;18653:10:::1;18623:41;::::0;::::1;3491:74:1::0;18623:8:0::1;::::0;;::::1;::::0;:29:::1;::::0;3464:18:1;;18623:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18615:50;;;::::0;::::1;;18677:17;18696::::0;18718:13:::1;13553:8:::0;;;;;;;13584;;;;;;;13625:18;;;;;;;13420:231;18718:13:::1;-1:-1:-1::0;18775:6:0::1;::::0;18856::::1;::::0;19028:4:::1;18757:15;19010:24:::0;;;18775:6;19010:24:::1;::::0;;;;;18676:55;;-1:-1:-1;18676:55:0;;-1:-1:-1;18775:6:0::1;::::0;;::::1;::::0;18856;::::1;::::0;18921:25:::1;::::0;;::::1;::::0;18957;;::::1;::::0;19060:30:::1;18676:55:::0;;19060:8:::1;:30::i;:::-;19101:17;19121:11:::0;19047:43;;-1:-1:-1;19121:11:0;19231:20:::1;19243:8:::0;19231:9;:20:::1;:::i;:::-;:35;;;;:::i;:::-;19221:45:::0;-1:-1:-1;19358:12:0;19335:20:::1;19347:8:::0;19335:9;:20:::1;:::i;:::-;:35;;;;:::i;:::-;19325:45;;19447:1;19437:7;:11;:26;;;;;19462:1;19452:7;:11;19437:26;19429:77;;;::::0;::::1;::::0;;10216:2:1;19429:77:0::1;::::0;::::1;10198:21:1::0;10255:2;10235:18;;;10228:30;10294:34;10274:18;;;10267:62;10365:8;10345:18;;;10338:36;10391:19;;19429:77:0::1;10014:402:1::0;19429:77:0::1;19517:31;19531:4;19538:9;19517:5;:31::i;:::-;19569:49;19586:7;19595:2;19599:7;19608:9;19569:16;:49::i;:::-;19559:59;;19639:49;19656:7;19665:2;19669:7;19678:9;19639:16;:49::i;:::-;19629:59:::0;-1:-1:-1;19705:13:0;;19701:517:::1;;19739:56;::::0;;;;19789:4:::1;19739:56;::::0;::::1;3491:74:1::0;19739:25:0::1;::::0;::::1;::::0;::::1;::::0;19770:9;;3464:18:1;;19739:56:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;19739:56:0::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;19735:153:::0;::::1;;19854:9:::0;-1:-1:-1;19735:153:0::1;19908:56;::::0;;;;19958:4:::1;19908:56;::::0;::::1;3491:74:1::0;19908:25:0::1;::::0;::::1;::::0;::::1;::::0;19939:9;;3464:18:1;;19908:56:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;19908:56:0::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;19904:153:::0;19701:517:::1;19904:153;20023:9:::0;-1:-1:-1;19701:517:0::1;;;20100:40;::::0;;;;20134:4:::1;20100:40;::::0;::::1;3491:74:1::0;20100:25:0::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;20100:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20166;::::0;;;;20200:4:::1;20166:40;::::0;::::1;3491:74:1::0;20089:51:0;;-1:-1:-1;20166:25:0::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;20166:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20155:51;;19701:517;20230:49;20238:8;20248;20258:9;20269;20230:7;:49::i;:::-;20294:5;20290:44;;;20326:8;::::0;20309:25:::1;::::0;20326:8:::1;::::0;;::::1;::::0;::::1;::::0;20314::::1;20309:25;:::i;:::-;20301:5;:33:::0;20290:44:::1;20389:11;::::0;::::1;;20385:237;;;20437:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;20425:40:::0;::::1;;20417:89;;;::::0;::::1;::::0;;10623:2:1;20417:89:0::1;::::0;::::1;10605:21:1::0;10662:2;10642:18;;;10635:30;10701:34;10681:18;;;10674:62;10772:6;10752:18;;;10745:34;10796:19;;20417:89:0::1;10421:400:1::0;20417:89:0::1;20541:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;20529:40:::0;::::1;;20521:89;;;::::0;::::1;::::0;;11028:2:1;20521:89:0::1;::::0;::::1;11010:21:1::0;11067:2;11047:18;;;11040:30;11106:34;11086:18;;;11079:62;11177:6;11157:18;;;11150:34;11201:19;;20521:89:0::1;10826:400:1::0;20521:89:0::1;20637:38;::::0;;2668:25:1;;;2724:2;2709:18;;2702:34;;;20637:38:0::1;::::0;::::1;::::0;20642:10:::1;::::0;20637:38:::1;::::0;2641:18:1;20637:38:0::1;;;;;;;18604:2079;;;;;;;;;13303:1:::0;13292:8;:12;;;;18504:2179;;;;;:::o;10139:147::-;10203:4;10220:36;10229:10;10241:7;10250:5;10220:8;:36::i;:::-;-1:-1:-1;10274:4:0;10139:147;;;;:::o;14021:158::-;14061:17;14080;14102:13;13553:8;;;;;;;13584;;;;;;;13625:18;;;;;;;13420:231;14102:13;14060:55;;;;;14141:30;14150:9;14161;14141:8;:30::i;:::-;;14049:130;;14021:158::o;10441:304::-;10540:15;;;10519:4;10540:15;;;:9;:15;;;;;;;;10556:10;10540:27;;;;;;;;10571:14;10540:45;10536:143;;10632:15;;;;;;;:9;:15;;;;;;;;10648:10;10632:27;;;;;;;;:35;;10662:5;;10632:35;:::i;:::-;10602:15;;;;;;;:9;:15;;;;;;;;10618:10;10602:27;;;;;;;:65;10536:143;10689:26;10699:4;10705:2;10709:5;10689:9;:26::i;:::-;-1:-1:-1;10733:4:0;10441:304;;;;;:::o;14761:591::-;14902:8;;:30;;;;;14921:10;14902:30;;;3491:74:1;14874:7:0;;14902:8;;;:18;;3464::1;;14902:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14894:60;;;;;;;8944:2:1;14894:60:0;;;8926:21:1;8983:2;8963:18;;;8956:30;9022:20;9002:18;;;8995:48;9060:18;;14894:60:0;8742:342:1;14894:60:0;14978:33;;;;;;;:19;:33;;;;;;;;;;14969:42;;;;14965:117;;;15037:33;;;;;;;:19;:33;;;;;;;;;-1:-1:-1;14965:117:0;15092:33;;;;;;;:19;:33;;;;;:43;;15129:6;;15092:33;:43;;15129:6;;15092:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15146:40;15160:12;15174:2;15179:6;15146:40;;:13;:40::i;:::-;15223:6;;;;15203:27;;;;:19;:27;;;;;;;;:32;:68;;;;-1:-1:-1;15259:6:0;;;;15239:27;;;;:19;:27;;;;;;;;:32;15203:68;15199:120;;;15288:11;:19;;;;;;15199:120;-1:-1:-1;15338:6:0;14761:591;-1:-1:-1;;14761:591:0:o;13795:218::-;13899:8;;;;13877:10;:31;13869:62;;;;;;;8944:2:1;13869:62:0;;;8926:21:1;8983:2;8963:18;;;8956:30;9022:20;9002:18;;;8995:48;9060:18;;13869:62:0;8742:342:1;13869:62:0;13962:6;:16;;;;;;;;;;;;;;13989:6;:16;;;;;;;;;;;13795:218::o;15464:1218::-;15513:14;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;;;13553:8;;15644:6:::1;::::0;15637:39:::1;::::0;;;;;15670:4:::1;15637:39;::::0;::::1;3491:74:1::0;15637:39:0;;13553:8;;;;;13584;;;;;;13268:1;15644:6:::1;;::::0;15637:24:::1;::::0;3464:18:1;;;;;15637:39:0::1;::::0;;;;;;;;15644:6;15637:39:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15710:6;::::0;15703:39:::1;::::0;;;;15736:4:::1;15703:39;::::0;::::1;3491:74:1::0;15621:55:0;;-1:-1:-1;15687:13:0::1;::::0;15710:6:::1;::::0;;::::1;::::0;15703:24:::1;::::0;3464:18:1;;15703:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15687:55:::0;-1:-1:-1;15753:12:0::1;15768:20;;::::0;::::1;:8:::0;:20:::1;:::i;:::-;15753:35:::0;-1:-1:-1;15799:12:0::1;15814:20;;::::0;::::1;:8:::0;:20:::1;:::i;:::-;15799:35;;15847:10;15860:30;15869:9;15880;15860:8;:30::i;:::-;15901:17;15921:11:::0;;15847:43;;-1:-1:-1;16025:17:0;;;16021:341:::1;;12378:5;16071:28;16081:17;16091:7:::0;16081;:17:::1;:::i;:::-;16071:9;:28::i;:::-;:48;;;;:::i;:::-;16059:60;;16134:36;16148:1;12378:5;16134;:36::i;:::-;16021:341;;;16270:80;16279:34;::::0;::::1;:22;16289:12:::0;16279:7;:22:::1;:::i;:::-;:34;;;;:::i;:::-;16315;::::0;::::1;:22;16325:12:::0;16315:7;:22:::1;:::i;:::-;:34;;;;:::i;:::-;16270:8;:80::i;:::-;16258:92;;16021:341;16392:1;16380:9;:13;16372:64;;;::::0;::::1;::::0;;11810:2:1;16372:64:0::1;::::0;::::1;11792:21:1::0;11849:2;11829:18;;;11822:30;11888:34;11868:18;;;11861:62;11959:8;11939:18;;;11932:36;11985:19;;16372:64:0::1;11608:402:1::0;16372:64:0::1;16447:20;16453:2;16457:9;16447:5;:20::i;:::-;16480:49;16488:8;16498;16508:9;16519;16480:7;:49::i;:::-;16544:5;16540:44;;;16576:8;::::0;16559:25:::1;::::0;16576:8:::1;::::0;;::::1;::::0;::::1;::::0;16564::::1;16559:25;:::i;:::-;16551:5;:33:::0;16540:44:::1;16640:34;::::0;;2668:25:1;;;2724:2;2709:18;;2702:34;;;16645:10:0::1;::::0;16640:34:::1;::::0;2641:18:1;16640:34:0::1;;;;;;;-1:-1:-1::0;;13303:1:0;13292:8;:12;-1:-1:-1;15464:1218:0;;;-1:-1:-1;;;;;;15464:1218:0:o;16794:1702::-;16843:12;16857;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;;;13553:8;;16981:6:::1;::::0;17062::::1;::::0;17141:40:::1;::::0;;;;;17175:4:::1;17141:40;::::0;::::1;3491:74:1::0;17141:40:0;;13553:8;;;;;13584;;;;;;16981:6:::1;::::0;;::::1;::::0;17062;;::::1;::::0;13268:1;16981:6;;17141:25:::1;::::0;3464:18:1;;;;;17141:40:0::1;::::0;;;;;;;;;16981:6;17141:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17208;::::0;;;;17242:4:::1;17208:40;::::0;::::1;3491:74:1::0;17125:56:0;;-1:-1:-1;17192:13:0::1;::::0;17208:25:::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;17208:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17294:4;17259:14;17276:24:::0;;;:9:::1;:24;::::0;;;;;17192:56;;-1:-1:-1;17326:30:0::1;17335:9:::0;17346;17326:8:::1;:30::i;:::-;17367:17;17387:11:::0;17313:43;;-1:-1:-1;17387:11:0;17497:20:::1;17509:8:::0;17497:9;:20:::1;:::i;:::-;:35;;;;:::i;:::-;17487:45:::0;-1:-1:-1;17624:12:0;17601:20:::1;17613:8:::0;17601:9;:20:::1;:::i;:::-;:35;;;;:::i;:::-;17591:45;;17713:1;17703:7;:11;:26;;;;;17728:1;17718:7;:11;17703:26;17695:77;;;::::0;::::1;::::0;;10216:2:1;17695:77:0::1;::::0;::::1;10198:21:1::0;10255:2;10235:18;;;10228:30;10294:34;10274:18;;;10267:62;10365:8;10345:18;;;10338:36;10391:19;;17695:77:0::1;10014:402:1::0;17695:77:0::1;17783:31;17797:4;17804:9;17783:5;:31::i;:::-;17825:35;17839:7;17848:2;17852:7;17825:13;:35::i;:::-;17871;17885:7;17894:2;17898:7;17871:13;:35::i;:::-;17928:40;::::0;;;;17962:4:::1;17928:40;::::0;::::1;3491:74:1::0;17928:25:0::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;17928:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17990;::::0;;;;18024:4:::1;17990:40;::::0;::::1;3491:74:1::0;17917:51:0;;-1:-1:-1;17990:25:0::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;17990:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17979:51;;18043:49;18051:8;18061;18071:9;18082;18043:7;:49::i;:::-;18107:5;18103:44;;;18139:8;::::0;18122:25:::1;::::0;18139:8:::1;::::0;;::::1;::::0;::::1;::::0;18127::::1;18122:25;:::i;:::-;18114:5;:33:::0;18103:44:::1;18202:11;::::0;::::1;;18198:237;;;18250:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;18238:40:::0;::::1;;18230:89;;;::::0;::::1;::::0;;10623:2:1;18230:89:0::1;::::0;::::1;10605:21:1::0;10662:2;10642:18;;;10635:30;10701:34;10681:18;;;10674:62;10772:6;10752:18;;;10745:34;10796:19;;18230:89:0::1;10421:400:1::0;18230:89:0::1;18354:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;18342:40:::0;::::1;;18334:89;;;::::0;::::1;::::0;;11028:2:1;18334:89:0::1;::::0;::::1;11010:21:1::0;11067:2;11047:18;;;11040:30;11106:34;11086:18;;;11079:62;11177:6;11157:18;;;11150:34;11201:19;;18334:89:0::1;10826:400:1::0;18334:89:0::1;18450:38;::::0;;2668:25:1;;;2724:2;2709:18;;2702:34;;;18450:38:0::1;::::0;::::1;::::0;18455:10:::1;::::0;18450:38:::1;::::0;2641:18:1;18450:38:0::1;;;;;;;16871:1625;;;;;;;;;13303:1:::0;13292:8;:12;;;;16794:1702;;;:::o;10294:139::-;10354:4;10371:32;10381:10;10393:2;10397:5;10371:9;:32::i;14187:403::-;14287:8;;:30;;;;;14306:10;14287:30;;;3491:74:1;14287:8:0;;;;;:18;;3464::1;;14287:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14279:60;;;;;;;8944:2:1;14279:60:0;;;8926:21:1;8983:2;8963:18;;;8956:30;9022:20;9002:18;;;8995:48;9060:18;;14279:60:0;8742:342:1;14279:60:0;14350:33;;;;;;;;:19;:33;;;;;;:49;;;;;;;;;;;;;;;14436:6;;;;;14416:27;;;;;;:32;:68;;;;-1:-1:-1;14472:6:0;;;;14452:27;;;;:19;:27;;;;;;;;:32;14416:68;14412:171;;;14501:11;:19;;;;;;14187:403;;:::o;14412:171::-;14553:11;:18;;;;14567:4;14553:18;;;14187:403;;:::o;21322:639::-;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;21391:6:::1;::::0;21441::::1;::::0;21543:8:::1;::::0;21500:40:::1;::::0;;;;21534:4:::1;21500:40;::::0;::::1;3491:74:1::0;21391:6:0::1;::::0;;::::1;::::0;21441;;::::1;::::0;21473:79:::1;::::0;21391:6;;21496:2;;21543:8:::1;;::::0;21391:6;;21500:25:::1;::::0;3464:18:1;;21500:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;21473:13;:79::i;:::-;21633:8;::::0;21590:40:::1;::::0;;;;21624:4:::1;21590:40;::::0;::::1;3491:74:1::0;21563:79:0::1;::::0;21577:7;;21586:2;;21633:8;;::::1;;;::::0;21590:25:::1;::::0;::::1;::::0;::::1;::::0;3464:18:1;;21590:40:0::1;3345:226:1::0;21563:79:0::1;21657:11;::::0;::::1;;21653:301;;;21737:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;21693:40;;;;;21727:4:::1;21693:40;::::0;::::1;3491:74:1::0;21737:28:0::1;::::0;;::::1;::::0;;21693:25:::1;::::0;3464:18:1;;21693:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;21685:121;;;::::0;::::1;::::0;;10623:2:1;21685:121:0::1;::::0;::::1;10605:21:1::0;10662:2;10642:18;;;10635:30;10701:34;10681:18;;;10674:62;10772:6;10752:18;;;10745:34;10796:19;;21685:121:0::1;10421:400:1::0;21685:121:0::1;21873:28;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;21829:40;;;;;21863:4:::1;21829:40;::::0;::::1;3491:74:1::0;21873:28:0::1;::::0;;::::1;::::0;;21829:25:::1;::::0;3464:18:1;;21829:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;21821:121;;;::::0;::::1;::::0;;11028:2:1;21821:121:0::1;::::0;::::1;11010:21:1::0;11067:2;11047:18;;;11040:30;11106:34;11086:18;;;11079:62;11177:6;11157:18;;;11150:34;11201:19;;21821:121:0::1;10826:400:1::0;21821:121:0::1;-1:-1:-1::0;;13303:1:0;13292:8;:12;-1:-1:-1;21322:639:0:o;10753:670::-;10899:15;10887:8;:27;;10879:56;;;;;;;12217:2:1;10879:56:0;;;12199:21:1;12256:2;12236:18;;;12229:30;12295:18;12275;;;12268:46;12331:18;;10879:56:0;12015:340:1;10879:56:0;11051:16;;11147:13;;;10946:14;11147:13;;;:6;:13;;;;;:15;;10946:14;;11051:16;9558:66;;11124:5;;11131:7;;11140:5;;11147:15;10946:14;11147:15;;;:::i;:::-;;;;-1:-1:-1;11096:77:0;;;;;;12847:25:1;;;;12891:42;12969:15;;;12949:18;;;12942:43;13021:15;;;;13001:18;;;12994:43;13053:18;;;13046:34;13096:19;;;13089:35;13140:19;;;13133:35;;;12819:19;;11096:77:0;;;;;;;;;;;;11086:88;;;;;;10987:202;;;;;;;;13449:66:1;13437:79;;13541:1;13532:11;;13525:27;;;;13577:2;13568:12;;13561:28;13614:2;13605:12;;13179:444;10987:202:0;;;;;;;;;;;;;;10963:237;;10987:202;10963:237;;;;11211:24;11238:26;;;;;;;;;13855:25:1;;;13928:4;13916:17;;13896:18;;;13889:45;;;;13950:18;;;13943:34;;;13993:18;;;13986:34;;;10963:237:0;;-1:-1:-1;11211:24:0;11238:26;;13827:19:1;;11238:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11238:26:0;;;;;;-1:-1:-1;;11283:30:0;;;;;;;:59;;;11337:5;11317:25;;:16;:25;;;11283:59;11275:98;;;;;;;14233:2:1;11275:98:0;;;14215:21:1;14272:2;14252:18;;;14245:30;14311:28;14291:18;;;14284:56;14357:18;;11275:98:0;14031:350:1;11275:98:0;11384:31;11393:5;11400:7;11409:5;11384:8;:31::i;:::-;10868:555;;10753:670;;;;;;;:::o;21065:208::-;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;21207:58:::1;21213:10:::0;21225;21237:2;21241:17;21260:4;;21207:5:::1;:58::i;:::-;-1:-1:-1::0;;13303:1:0;13292:8;:12;-1:-1:-1;;;;21065:208:0:o;22010:158::-;13213:8;;13225:1;13213:13;13205:41;;;;;;;8318:2:1;13205:41:0;;;8300:21:1;8357:2;8337:18;;;8330:30;8396:17;8376:18;;;8369:45;8431:18;;13205:41:0;8116:339:1;13205:41:0;13268:1;13257:8;:12;22066:6:::1;::::0;22059:39:::1;::::0;;;;22092:4:::1;22059:39;::::0;::::1;3491:74:1::0;22051:109:0::1;::::0;22066:6:::1;;::::0;22059:24:::1;::::0;3464:18:1;;22059:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22107:6;::::0;22100:39:::1;::::0;;;;22133:4:::1;22100:39;::::0;::::1;3491:74:1::0;22107:6:0::1;::::0;;::::1;::::0;22100:24:::1;::::0;3464:18:1;;22100:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22051:109::-;13303:1:::0;13292:8;:12;22010:158::o;23454:2574::-;23601:1;23588:10;:14;:32;;;;23619:1;23606:10;:14;23588:32;23580:80;;;;;;;14588:2:1;23580:80:0;;;14570:21:1;14627:2;14607:18;;;14600:30;14666:34;14646:18;;;14639:62;14737:5;14717:18;;;14710:33;14760:19;;23580:80:0;14386:399:1;23580:80:0;23672:17;23691;23713:13;13553:8;;;;;;;13584;;;;;;;13625:18;;;;;;;13420:231;23713:13;23671:55;;;;;23773:9;23760:22;;:10;:22;:48;;;;;23799:9;23786:22;;:10;:22;23760:48;23752:92;;;;;;;14992:2:1;23752:92:0;;;14974:21:1;15031:2;15011:18;;;15004:30;15070:33;15050:18;;;15043:61;15121:18;;23752:92:0;14790:355:1;23752:92:0;23857:23;;:::i;:::-;23979:6;;24018;;23979;;;;;24018;24043:14;;24039:58;;24059:38;24073:7;24082:2;24086:10;24059:13;:38::i;:::-;24150:14;;24146:58;;24166:38;24180:7;24189:2;24193:10;24166:13;:38::i;:::-;24257:15;;24253:97;;24274:76;;;;;:34;;;;;;:76;;24309:10;;24321;;24333;;24345:4;;;;24274:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24253:97;24379:40;;;;;24413:4;24379:40;;;3491:74:1;24379:25:0;;;;;;3464:18:1;;24379:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24365:54;;24448:40;;;;;24482:4;24448:40;;;3491:74:1;24448:25:0;;;;;;3464:18:1;;24448:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24434:11;;;:54;24507:11;;;;24503:255;;;24562:28;;;;;;;:19;:28;;;;;;24547:11;;24562:28;;;;-1:-1:-1;24547:43:0;24539:92;;;;;;;10623:2:1;24539:92:0;;;10605:21:1;10662:2;10642:18;;;10635:30;10701:34;10681:18;;;10674:62;10772:6;10752:18;;;10745:34;10796:19;;24539:92:0;10421:400:1;24539:92:0;24673:28;;;;;;;:19;:28;;;;;;;;24658:8;24673:28;24658:11;;;;:43;;24650:92;;;;;;;11028:2:1;24650:92:0;;;11010:21:1;11067:2;11047:18;;;11040:30;11106:34;11086:18;;;11079:62;11177:6;11157:18;;;11150:34;11201:19;;24650:92:0;10826:400:1;24650:92:0;-1:-1:-1;24779:14:0;;-1:-1:-1;24810:22:0;24822:10;24810:22;;;;:::i;:::-;24796:11;;:36;:81;;24876:1;24796:81;;;24850:22;24862:10;24850:22;;;;:::i;:::-;24835:11;;:38;;;;:::i;:::-;24779:98;-1:-1:-1;24888:14:0;24919:22;24931:10;24919:22;;;;:::i;:::-;24905:11;;;;:36;:81;;24985:1;24905:81;;;24959:22;24971:10;24959:22;;;;:::i;:::-;24944:11;;;;:38;;;;:::i;:::-;24888:98;;25017:1;25005:9;:13;:30;;;;25034:1;25022:9;:13;25005:30;24997:77;;;;;;;16260:2:1;24997:77:0;;;16242:21:1;16299:2;16279:18;;;16272:30;16338:34;16318:18;;;16311:62;16409:4;16389:18;;;16382:32;16431:19;;24997:77:0;16058:398:1;24997:77:0;25181:3;25203:24;;;25199:369;;25252:8;;:30;;;;;25271:10;25252:30;;;3491:74:1;25252:8:0;;;;;:18;;3464::1;;25252:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25248:240;;;-1:-1:-1;25319:17:0;25248:240;;;25423:8;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25397:71;;;;;25457:10;25397:71;;;3491:74:1;25397:59:0;;;;;;;;3464:18:1;;25397:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25385:83;;;;25248:240;25531:3;25518:9;:16;;:34;;25549:3;25518:34;;;25537:9;25518:34;25506:46;;25199:369;25584:21;25634;25646:9;25634;:21;:::i;:::-;25609:11;;:20;;25623:6;25609:20;:::i;:::-;25608:48;;;;:::i;:::-;25584:72;-1:-1:-1;25671:21:0;25721;25733:9;25721;:21;:::i;:::-;25696:11;;;;:20;;25710:6;25696:20;:::i;:::-;25695:48;;;;:::i;:::-;25671:72;-1:-1:-1;25805:27:0;;;;;;:15;;:27;:::i;:::-;:39;;25835:9;25805:39;:::i;:::-;25766:35;25785:16;25766;:35;:::i;:::-;:78;;25758:101;;;;;;;17171:2:1;25758:101:0;;;17153:21:1;17210:2;17190:18;;;17183:30;17249:12;17229:18;;;17222:40;17279:18;;25758:101:0;16969:334:1;25758:101:0;-1:-1:-1;;25891:11:0;;;25904;;;25883:55;;-1:-1:-1;25917:9:0;25928;25883:7;:55::i;:::-;25954:66;;;17539:25:1;;;17595:2;17580:18;;17573:34;;;17623:18;;;17616:34;;;17681:2;17666:18;;17659:34;;;25954:66:0;;;;25959:10;;25954:66;;17526:3:1;17511:19;25954:66:0;;;;;;;23569:2459;;;;;23454:2574;;;;;;:::o;26113:880::-;26237:17;26225:29;;;;;:62;;-1:-1:-1;26270:17:0;26258:29;;;26225:62;26217:92;;;;;;;17906:2:1;26217:92:0;;;17888:21:1;17945:2;17925:18;;;17918:30;17984:19;17964:18;;;17957:47;18021:18;;26217:92:0;17704:341:1;26217:92:0;26394:18;;;;;;;;;26375:15;26368:44;;26454:15;;;;;;:33;;-1:-1:-1;26473:14:0;;;;;26454:33;:51;;;;-1:-1:-1;26491:14:0;;;;;26454:51;26450:352;;;26668:11;26615:64;;26620:44;26654:9;26620:27;26637:9;26620:16;:27::i;:::-;:33;;;;:44::i;:::-;26591:20;:88;;26615:50;;;;;:64;;;;26591:88;;;26722:64;;;26727:44;26761:9;26727:27;26744:9;26727:16;:27::i;:44::-;26698:20;:88;;26722:50;;;;;:64;;;;26698:88;;;26450:352;-1:-1:-1;26823:8:0;:28;;26901:44;26929:15;26901:44;;;;26823:28;26862;;;;;;;;;;;26823;;;26862;;;;;26901:44;;;;;;;;;26961:24;;;26966:8;;;;;;;;;;18273:34:1;;26976:8:0;;;;;;;18338:2:1;18323:18;;18316:43;26961:24:0;;18197:18:1;26961:24:0;;;;;;;26113:880;;;;:::o;22644:802::-;22717:10;22740:13;22756:8;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22835:5;;22791:19;;;;;;;-1:-1:-1;22740:32:0;;-1:-1:-1;22835:5:0;22866:573;;22896:11;;22892:477;;22928:10;22941:38;22951:27;;;;;;:15;;:27;:::i;22941:38::-;22928:51;;22998:14;23015:17;23025:6;23015:9;:17::i;:::-;22998:34;;23063:9;23055:5;:17;23051:303;;;23097:14;23129:17;23137:9;23129:5;:17;:::i;:::-;23114:11;;:33;;;;:::i;:::-;23097:50;-1:-1:-1;23170:16:0;23189:17;23197:9;23189:5;:17;:::i;:::-;23170:36;-1:-1:-1;23229:14:0;23246:23;23170:36;23246:9;:23;:::i;:::-;23229:40;-1:-1:-1;23296:13:0;;23292:42;;23311:23;23317:5;23324:9;23311:5;:23::i;:::-;23074:280;;;23051:303;22909:460;;22892:477;22866:573;;;23390:11;;23386:53;;23426:1;23418:5;:9;23386:53;22729:717;;22644:802;;;;:::o;11634:203::-;11713:15;;;;;;;:9;:15;;;;;;:23;;11731:5;;11713:23;:::i;:::-;11695:15;;;;;;;:9;:15;;;;;:41;;;;11761:11;:19;;11775:5;;11761:19;:::i;:::-;11747:11;:33;;;11796;;3722:25:1;;;11796:33:0;;;;;;3710:2:1;3695:18;11796:33:0;;;;;;;;11634:203;;:::o;27294:305::-;12442:34;;;;;;;;;;;;;;;;;27449:43;;27422:10;18695:55:1;;;27449:43:0;;;18677:74:1;18767:18;;;;18760:34;;;27449:43:0;;;;;;;;;;18650:18:1;;;;27449:43:0;;;;;;;;;;;;;27422:71;;-1:-1:-1;;;;27422:10:0;;;27438:9;;27422:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27409:84;;;27508:2;27504:88;;;27534:5;27527:12;;;;;27504:88;27579:1;27572:8;;;27294:305;;;;;;;:::o;11845:169::-;11926:16;;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;11975:31;;3722:25:1;;;11975:31:0;;3695:18:1;11975:31:0;;;;;;;;11845:169;;;:::o;12022:214::-;12116:15;;;;;;;:9;:15;;;;;;:23;;12134:5;;12116:23;:::i;:::-;12098:15;;;;;;;;:9;:15;;;;;;:41;;;;12166:13;;;;;;;:21;;12182:5;;12166:21;:::i;:::-;12150:13;;;;;;;;:9;:13;;;;;;;:37;;;;12203:25;;;;;;;;;;12222:5;3722:25:1;;3710:2;3695:18;;3576:177;27001:285:0;12442:34;;;;;;;;;;;;;;;;;27129:43;;27118:10;18695:55:1;;;27129:43:0;;;18677:74:1;18767:18;;;;18760:34;;;27129:43:0;;;;;;;;;;18650:18:1;;;;27129:43:0;;;;;;;;;;;;;27118:55;;-1:-1:-1;;;;27118:10:0;;;:55;;27129:43;27118:55;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27082:91;;;;27192:7;:57;;;;-1:-1:-1;27204:11:0;;:16;;:44;;;27235:4;27224:24;;;;;;;;;;;;:::i;:::-;27184:94;;;;;;;19286:2:1;27184:94:0;;;19268:21:1;19325:2;19305:18;;;19298:30;19364:26;19344:18;;;19337:54;19408:18;;27184:94:0;19084:348:1;27184:94:0;27071:215;;27001:285;;;:::o;31101:303::-;31146:6;31173:1;31169;:5;31165:232;;;-1:-1:-1;31195:1:0;31211:6;31220:5;31224:1;31195;31220:5;:::i;:::-;:9;;31228:1;31220:9;:::i;:::-;31211:18;;31244:92;31255:1;31251;:5;31244:92;;;31281:1;-1:-1:-1;31281:1:0;31319;31281;31306:5;31281:1;31306;:5;:::i;:::-;:9;;;;:::i;:::-;31305:15;;;;:::i;:::-;31301:19;;31244:92;;;31176:171;31101:303;;;:::o;31165:232::-;31357:6;;31353:44;;-1:-1:-1;31384:1:0;31353:44;31101:303;;;:::o;11431:195::-;11518:5;11504:11;;:19;;;;:::i;:::-;11490:11;:33;;;11550:13;;;;;:9;:13;;;;;;:21;;11566:5;;11550:21;:::i;:::-;11534:13;;;;;;;:9;:13;;;;;;:37;;;;11587:31;;11534:13;;;11587:31;;;;11612:5;3722:25:1;;3710:2;3695:18;;3576:177;30887:96:0;30939:6;30966:1;30962;:5;:13;;30974:1;30962:13;;;30970:1;30962:13;30958:17;30887:96;-1:-1:-1;;;30887:96:0:o;31677:120::-;31727:9;31753:17;31622:6;31753:10;;;:17;:::i;:::-;31749:21;31677:120;-1:-1:-1;;31677:120:0:o;31868:108::-;31928:9;31954:14;31958:10;;;31954:1;:14;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:154:1:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:347::-;224:8;234:6;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;-1:-1:-1;329:20:1;;372:18;361:30;;358:50;;;404:1;401;394:12;358:50;441:4;433:6;429:17;417:29;;493:3;486:4;477:6;469;465:19;461:30;458:39;455:59;;;510:1;507;500:12;455:59;173:347;;;;;:::o;525:681::-;622:6;630;638;646;654;707:3;695:9;686:7;682:23;678:33;675:53;;;724:1;721;714:12;675:53;760:9;747:23;737:33;;817:2;806:9;802:18;789:32;779:42;;871:2;860:9;856:18;843:32;884:31;909:5;884:31;:::i;:::-;934:5;-1:-1:-1;990:2:1;975:18;;962:32;1017:18;1006:30;;1003:50;;;1049:1;1046;1039:12;1003:50;1088:58;1138:7;1129:6;1118:9;1114:22;1088:58;:::i;:::-;525:681;;;;-1:-1:-1;525:681:1;;-1:-1:-1;1165:8:1;;1062:84;525:681;-1:-1:-1;;;525:681:1:o;1211:248::-;1279:6;1287;1340:2;1328:9;1319:7;1315:23;1311:32;1308:52;;;1356:1;1353;1346:12;1308:52;-1:-1:-1;;1379:23:1;;;1449:2;1434:18;;;1421:32;;-1:-1:-1;1211:248:1:o;1464:258::-;1536:1;1546:113;1560:6;1557:1;1554:13;1546:113;;;1636:11;;;1630:18;1617:11;;;1610:39;1582:2;1575:10;1546:113;;;1677:6;1674:1;1671:13;1668:48;;;1712:1;1703:6;1698:3;1694:16;1687:27;1668:48;;1464:258;;;:::o;1727:442::-;1876:2;1865:9;1858:21;1839:4;1908:6;1902:13;1951:6;1946:2;1935:9;1931:18;1924:34;1967:66;2026:6;2021:2;2010:9;2006:18;2001:2;1993:6;1989:15;1967:66;:::i;:::-;2085:2;2073:15;2090:66;2069:88;2054:104;;;;2160:2;2050:113;;1727:442;-1:-1:-1;;1727:442:1:o;2174:315::-;2242:6;2250;2303:2;2291:9;2282:7;2278:23;2274:32;2271:52;;;2319:1;2316;2309:12;2271:52;2358:9;2345:23;2377:31;2402:5;2377:31;:::i;:::-;2427:5;2479:2;2464:18;;;;2451:32;;-1:-1:-1;;;2174:315:1:o;3758:456::-;3835:6;3843;3851;3904:2;3892:9;3883:7;3879:23;3875:32;3872:52;;;3920:1;3917;3910:12;3872:52;3959:9;3946:23;3978:31;4003:5;3978:31;:::i;:::-;4028:5;-1:-1:-1;4085:2:1;4070:18;;4057:32;4098:33;4057:32;4098:33;:::i;:::-;3758:456;;4150:7;;-1:-1:-1;;;4204:2:1;4189:18;;;;4176:32;;3758:456::o;4590:184::-;4658:20;;4718:30;4707:42;;4697:53;;4687:81;;4764:1;4761;4754:12;4779:462;4856:6;4864;4872;4925:2;4913:9;4904:7;4900:23;4896:32;4893:52;;;4941:1;4938;4931:12;4893:52;4980:9;4967:23;4999:31;5024:5;4999:31;:::i;:::-;5049:5;-1:-1:-1;5106:2:1;5091:18;;5078:32;5119:33;5078:32;5119:33;:::i;:::-;5171:7;-1:-1:-1;5197:38:1;5231:2;5216:18;;5197:38;:::i;:::-;5187:48;;4779:462;;;;;:::o;5465:388::-;5533:6;5541;5594:2;5582:9;5573:7;5569:23;5565:32;5562:52;;;5610:1;5607;5600:12;5562:52;5649:9;5636:23;5668:31;5693:5;5668:31;:::i;:::-;5718:5;-1:-1:-1;5775:2:1;5760:18;;5747:32;5788:33;5747:32;5788:33;:::i;:::-;5840:7;5830:17;;;5465:388;;;;;:::o;5858:247::-;5917:6;5970:2;5958:9;5949:7;5945:23;5941:32;5938:52;;;5986:1;5983;5976:12;5938:52;6025:9;6012:23;6044:31;6069:5;6044:31;:::i;6110:321::-;6178:6;6186;6239:2;6227:9;6218:7;6214:23;6210:32;6207:52;;;6255:1;6252;6245:12;6207:52;6294:9;6281:23;6313:31;6338:5;6313:31;:::i;:::-;6363:5;-1:-1:-1;6387:38:1;6421:2;6406:18;;6387:38;:::i;:::-;6377:48;;6110:321;;;;;:::o;6436:114::-;6520:4;6513:5;6509:16;6502:5;6499:27;6489:55;;6540:1;6537;6530:12;6555:801;6666:6;6674;6682;6690;6698;6706;6714;6767:3;6755:9;6746:7;6742:23;6738:33;6735:53;;;6784:1;6781;6774:12;6735:53;6823:9;6810:23;6842:31;6867:5;6842:31;:::i;:::-;6892:5;-1:-1:-1;6949:2:1;6934:18;;6921:32;6962:33;6921:32;6962:33;:::i;:::-;7014:7;-1:-1:-1;7068:2:1;7053:18;;7040:32;;-1:-1:-1;7119:2:1;7104:18;;7091:32;;-1:-1:-1;7175:3:1;7160:19;;7147:33;7189:31;7147:33;7189:31;:::i;:::-;6555:801;;;;-1:-1:-1;6555:801:1;;;;7239:7;7293:3;7278:19;;7265:33;;-1:-1:-1;7345:3:1;7330:19;;;7317:33;;6555:801;-1:-1:-1;;6555:801:1:o;7361:750::-;7467:6;7475;7483;7491;7499;7507;7560:3;7548:9;7539:7;7535:23;7531:33;7528:53;;;7577:1;7574;7567:12;7528:53;7613:9;7600:23;7590:33;;7670:2;7659:9;7655:18;7642:32;7632:42;;7724:2;7713:9;7709:18;7696:32;7737:31;7762:5;7737:31;:::i;:::-;7787:5;-1:-1:-1;7839:2:1;7824:18;;7811:32;;-1:-1:-1;7894:3:1;7879:19;;7866:33;7922:18;7911:30;;7908:50;;;7954:1;7951;7944:12;7908:50;7993:58;8043:7;8034:6;8023:9;8019:22;7993:58;:::i;:::-;7361:750;;;;-1:-1:-1;7361:750:1;;-1:-1:-1;7361:750:1;;8070:8;;7361:750;-1:-1:-1;;;7361:750:1:o;8460:277::-;8527:6;8580:2;8568:9;8559:7;8555:23;8551:32;8548:52;;;8596:1;8593;8586:12;8548:52;8628:9;8622:16;8681:5;8674:13;8667:21;8660:5;8657:32;8647:60;;8703:1;8700;8693:12;9089:184;9159:6;9212:2;9200:9;9191:7;9187:23;9183:32;9180:52;;;9228:1;9225;9218:12;9180:52;-1:-1:-1;9251:16:1;;9089:184;-1:-1:-1;9089:184:1:o;9278:::-;9330:77;9327:1;9320:88;9427:4;9424:1;9417:15;9451:4;9448:1;9441:15;9467:228;9507:7;9633:1;9565:66;9561:74;9558:1;9555:81;9550:1;9543:9;9536:17;9532:105;9529:131;;;9640:18;;:::i;:::-;-1:-1:-1;9680:9:1;;9467:228::o;9700:184::-;9752:77;9749:1;9742:88;9849:4;9846:1;9839:15;9873:4;9870:1;9863:15;9889:120;9929:1;9955;9945:35;;9960:18;;:::i;:::-;-1:-1:-1;9994:9:1;;9889:120::o;11231:125::-;11271:4;11299:1;11296;11293:8;11290:34;;;11304:18;;:::i;:::-;-1:-1:-1;11341:9:1;;11231:125::o;11361:242::-;11401:4;11430:30;11510:10;;;;11480;;11532:12;;;11529:38;;;11547:18;;:::i;:::-;11584:13;;11361:242;-1:-1:-1;;;11361:242:1:o;12360:195::-;12399:3;12430:66;12423:5;12420:77;12417:103;;12500:18;;:::i;:::-;-1:-1:-1;12547:1:1;12536:13;;12360:195::o;15150:714::-;15403:42;15395:6;15391:55;15380:9;15373:74;15483:6;15478:2;15467:9;15463:18;15456:34;15526:6;15521:2;15510:9;15506:18;15499:34;15569:3;15564:2;15553:9;15549:18;15542:31;15610:6;15604:3;15593:9;15589:19;15582:35;15668:6;15660;15654:3;15643:9;15639:19;15626:49;15725:1;15695:22;;;15719:3;15691:32;;;15684:43;;;;15779:2;15767:15;;;15784:66;15763:88;15748:104;15744:114;;15150:714;-1:-1:-1;;;;15150:714:1:o;16461:251::-;16531:6;16584:2;16572:9;16563:7;16559:23;16555:32;16552:52;;;16600:1;16597;16590:12;16552:52;16632:9;16626:16;16651:31;16676:5;16651:31;:::i;16717:247::-;16785:6;16838:2;16826:9;16817:7;16813:23;16809:32;16806:52;;;16854:1;16851;16844:12;16806:52;16886:9;16880:16;16905:29;16928:5;16905:29;:::i;18370:128::-;18410:3;18441:1;18437:6;18434:1;18431:13;18428:39;;;18447:18;;:::i;:::-;-1:-1:-1;18483:9:1;;18370:128::o;18805:274::-;18934:3;18972:6;18966:13;18988:53;19034:6;19029:3;19022:4;19014:6;19010:17;18988:53;:::i;:::-;19057:16;;;;;18805:274;-1:-1:-1;;18805:274:1:o;19437:311::-;19477:7;19509:58;19594:2;19591:1;19587:10;19624:2;19621:1;19617:10;19680:3;19676:2;19672:12;19667:3;19664:21;19657:3;19650:11;19643:19;19639:47;19636:73;;;19689:18;;:::i;:::-;19729:13;;19437:311;-1:-1:-1;;;;19437:311:1:o;19753:240::-;19793:1;19819:58;19904:2;19901:1;19897:10;19926:3;19916:37;;19933:18;;:::i;:::-;19971:10;;19967:20;;;;;19753:240;-1:-1:-1;;19753:240:1:o
Swarm Source
ipfs://714f04d8e48c40cdd4003123097e8896acfec0db0acb45b757662ee82e191295
Loading...
Loading
Loading...
Loading
[ 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.