Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,374 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 15568404 | 721 days ago | IN | 0 ETH | 0.00099496 | ||||
Swap | 15568322 | 721 days ago | IN | 0 ETH | 0.00130706 | ||||
Swap | 15568096 | 721 days ago | IN | 0 ETH | 0.00187414 | ||||
Remove Liquidity... | 12121148 | 1262 days ago | IN | 0 ETH | 0.01559513 | ||||
Remove Liquidity... | 12013830 | 1279 days ago | IN | 0 ETH | 0.01009143 | ||||
Remove Liquidity... | 12003516 | 1281 days ago | IN | 0 ETH | 0.01072625 | ||||
Remove Liquidity... | 11972259 | 1285 days ago | IN | 0 ETH | 0.01173345 | ||||
Remove Liquidity... | 11929158 | 1292 days ago | IN | 0 ETH | 0.01630951 | ||||
Remove Liquidity... | 11928897 | 1292 days ago | IN | 0 ETH | 0.01378077 | ||||
Remove Liquidity... | 11922706 | 1293 days ago | IN | 0 ETH | 0.01540842 | ||||
Remove Liquidity... | 11920352 | 1293 days ago | IN | 0 ETH | 0.01747011 | ||||
Remove Liquidity... | 11915246 | 1294 days ago | IN | 0 ETH | 0.02368521 | ||||
Remove Liquidity... | 11909390 | 1295 days ago | IN | 0 ETH | 0.01895643 | ||||
Remove Liquidity... | 11907216 | 1295 days ago | IN | 0 ETH | 0.01882848 | ||||
Remove Liquidity... | 11907181 | 1295 days ago | IN | 0 ETH | 0.01720288 | ||||
Remove Liquidity... | 11907160 | 1295 days ago | IN | 0 ETH | 0.02278537 | ||||
Remove Liquidity... | 11907034 | 1295 days ago | IN | 0 ETH | 0.02181051 | ||||
Remove Liquidity... | 11906624 | 1296 days ago | IN | 0 ETH | 0.01457811 | ||||
Remove Liquidity... | 11906503 | 1296 days ago | IN | 0 ETH | 0.01683575 | ||||
Remove Liquidity... | 11905856 | 1296 days ago | IN | 0 ETH | 0.01512875 | ||||
Remove Liquidity... | 11905750 | 1296 days ago | IN | 0 ETH | 0.01324907 | ||||
Remove Liquidity... | 11905726 | 1296 days ago | IN | 0 ETH | 0.01457418 | ||||
Remove Liquidity... | 11905478 | 1296 days ago | IN | 0 ETH | 0.0135861 | ||||
Remove Liquidity... | 11905105 | 1296 days ago | IN | 0 ETH | 0.01236335 | ||||
Remove Liquidity... | 11904015 | 1296 days ago | IN | 0 ETH | 0.01261952 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11845943 | 1305 days ago | Contract Creation | 0 ETH | |||
11765746 | 1317 days ago | Contract Creation | 0 ETH | |||
11671653 | 1332 days ago | Contract Creation | 0 ETH | |||
11649814 | 1335 days ago | Contract Creation | 0 ETH | |||
11617897 | 1340 days ago | Contract Creation | 0 ETH | |||
11571180 | 1347 days ago | Contract Creation | 0 ETH | |||
11571179 | 1347 days ago | Contract Creation | 0 ETH | |||
11571179 | 1347 days ago | Contract Creation | 0 ETH | |||
11570763 | 1347 days ago | Contract Creation | 0 ETH | |||
11569793 | 1347 days ago | Contract Creation | 0 ETH | |||
11569440 | 1347 days ago | Contract Creation | 0 ETH | |||
11569382 | 1347 days ago | Contract Creation | 0 ETH | |||
11569323 | 1347 days ago | Contract Creation | 0 ETH | |||
11569124 | 1347 days ago | Contract Creation | 0 ETH | |||
11568918 | 1347 days ago | Contract Creation | 0 ETH | |||
11568915 | 1347 days ago | Contract Creation | 0 ETH | |||
11568913 | 1347 days ago | Contract Creation | 0 ETH | |||
11568883 | 1347 days ago | Contract Creation | 0 ETH | |||
11568838 | 1347 days ago | Contract Creation | 0 ETH | |||
11568802 | 1347 days ago | Contract Creation | 0 ETH | |||
11568767 | 1347 days ago | Contract Creation | 0 ETH | |||
11568749 | 1347 days ago | Contract Creation | 0 ETH | |||
11568673 | 1347 days ago | Contract Creation | 0 ETH | |||
11568629 | 1347 days ago | Contract Creation | 0 ETH | |||
11568627 | 1347 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
FlashApp
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-01 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function burn(uint256 value) external returns (bool); } pragma solidity 0.6.12; interface IFlashReceiver { function receiveFlash( bytes32 _id, uint256 _amountIn, uint256 _expireAfter, uint256 _mintedAmount, address _staker, bytes calldata _data ) external returns (uint256); } pragma solidity 0.6.12; interface IFlashProtocol { function stake( uint256 _amountIn, uint256 _days, address _receiver, bytes calldata _data ) external returns ( uint256 mintedAmount, uint256 matchedAmount, bytes32 id ); function unstake(bytes32 _id) external returns (uint256 withdrawAmount); function getFPY(uint256 _amountIn) external view returns (uint256); } pragma solidity 0.6.12; // A library for performing overflow-safe math, courtesy of DappHub: https://github.com/dapphub/ds-math/blob/d0ef6d6a5f/src/math.sol // Modified to include only the essentials library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "MATH:: ADD_OVERFLOW"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "MATH:: SUB_UNDERFLOW"); } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MATH:: MUL_OVERFLOW"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "MATH:: DIVISION_BY_ZERO"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } 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; } } } pragma solidity 0.6.12; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } pragma solidity ^0.6.0; /** * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * `CREATE2` can be used to compute in advance the address where a smart * contract will be deployed, which allows for interesting new mechanisms known * as 'counterfactual interactions'. * * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more * information. */ library Create2 { /** * @dev Deploys a contract using `CREATE2`. The address where the contract * will be deployed can be known in advance via {computeAddress}. * * The bytecode for a contract can be obtained from Solidity with * `type(contractName).creationCode`. * * Requirements: * * - `bytecode` must not be empty. * - `salt` must have not been used for `bytecode` already. * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address) { address addr; require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); // solhint-disable-next-line no-inline-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); return addr; } /** * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the * `bytecodeHash` or `salt` will result in a new destination address. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { return computeAddress(salt, bytecodeHash, address(this)); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address) { bytes32 _data = keccak256( abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash) ); return address(uint256(_data)); } } pragma solidity 0.6.12; interface IPool { function initialize(address _token) external; function stakeWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) external returns (uint256 result); function addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _maker ) external returns ( uint256, uint256, uint256 ); function removeLiquidity(address _maker) external returns (uint256, uint256); function swapWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) external returns (uint256 result); } pragma solidity 0.6.12; // Lightweight token modelled after UNI-LP: // https://github.com/Uniswap/uniswap-v2-core/blob/v1.0.1/contracts/UniswapV2ERC20.sol // Adds: // - An exposed `mint()` with minting role // - An exposed `burn()` // - ERC-3009 (`transferWithAuthorization()`) // - flashMint() - allows to flashMint an arbitrary amount of FLASH, with the // condition that it is burned before the end of the transaction. contract PoolERC20 is IERC20 { using SafeMath for uint256; // bytes32 private constant EIP712DOMAIN_HASH = // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") bytes32 private constant EIP712DOMAIN_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; // bytes32 private constant NAME_HASH = keccak256("FLASH-ALT-LP Token") bytes32 private constant NAME_HASH = 0xfdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c; // bytes32 private constant VERSION_HASH = keccak256("1") bytes32 private constant VERSION_HASH = 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6; // bytes32 public constant PERMIT_TYPEHASH = // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)"); bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267; string public constant name = "FLASH-ALT-LP Token"; string public constant symbol = "FLASH-ALT-LP"; uint8 public constant decimals = 18; uint256 public override totalSupply; address public minter; mapping(address => uint256) public override balanceOf; mapping(address => mapping(address => uint256)) public override allowance; // ERC-2612, ERC-3009 state mapping(address => uint256) public nonces; mapping(address => mapping(bytes32 => bool)) public authorizationState; event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); function _validateSignedData( address signer, bytes32 encodeData, uint8 v, bytes32 r, bytes32 s ) internal view { bytes32 digest = keccak256(abi.encodePacked("\x19\x01", getDomainSeparator(), encodeData)); address recoveredAddress = ecrecover(digest, v, r, s); // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages require(recoveredAddress != address(0) && recoveredAddress == signer, "FLASH-ALT-LP Token:: INVALID_SIGNATURE"); } function _mint(address to, uint256 value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint256 value) internal { // Balance is implicitly checked with SafeMath's underflow protection balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve( address owner, address spender, uint256 value ) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer( address from, address to, uint256 value ) private { require(to != address(0), "FLASH-ALT-LP Token:: RECEIVER_IS_TOKEN_OR_ZERO"); // Balance is implicitly checked with SafeMath's underflow protection balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function getChainId() public pure returns (uint256 chainId) { // solhint-disable-next-line no-inline-assembly assembly { chainId := chainid() } } function getDomainSeparator() public view returns (bytes32) { return keccak256(abi.encode(EIP712DOMAIN_HASH, NAME_HASH, VERSION_HASH, getChainId(), address(this))); } function burn(uint256 value) external override returns (bool) { _burn(msg.sender, value); return true; } function approve(address spender, uint256 value) external override returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint256 value) external override returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom( address from, address to, uint256 value ) external override returns (bool) { uint256 fromAllowance = allowance[from][msg.sender]; if (fromAllowance != uint256(-1)) { // Allowance is implicitly checked with SafeMath's underflow protection allowance[from][msg.sender] = fromAllowance.sub(value); } _transfer(from, to, value); return true; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "FLASH-ALT-LP Token:: AUTH_EXPIRED"); bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner], deadline)); nonces[owner] = nonces[owner].add(1); _validateSignedData(owner, encodeData, v, r, s); _approve(owner, spender, value); } function transferWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) external { require(block.timestamp > validAfter, "FLASH-ALT-LP Token:: AUTH_NOT_YET_VALID"); require(block.timestamp < validBefore, "FLASH-ALT-LP Token:: AUTH_EXPIRED"); require(!authorizationState[from][nonce], "FLASH-ALT-LP Token:: AUTH_ALREADY_USED"); bytes32 encodeData = keccak256( abi.encode(TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce) ); _validateSignedData(from, encodeData, v, r, s); authorizationState[from][nonce] = true; emit AuthorizationUsed(from, nonce); _transfer(from, to, value); } } // File: ../../../../media/shakeib98/xio-flashapp-contracts/contracts/pool/contracts/Pool.sol pragma solidity 0.6.12; contract Pool is PoolERC20, IPool { using SafeMath for uint256; uint256 public constant MINIMUM_LIQUIDITY = 10**3; bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); address public constant FLASH_TOKEN = 0xB4467E8D621105312a914F1D42f10770C0Ffe3c8; address public constant FLASH_PROTOCOL = 0xEc02f813404656E2A2AEd5BaeEd41D785324E8D0; uint256 public reserveFlashAmount; uint256 public reserveAltAmount; uint256 private unlocked = 1; address public token; address public factory; modifier lock() { require(unlocked == 1, "Pool: LOCKED"); unlocked = 0; _; unlocked = 1; } modifier onlyFactory() { require(msg.sender == factory, "Pool:: ONLY_FACTORY"); _; } constructor() public { factory = msg.sender; } function _safeTransfer( address _token, address _to, uint256 _value ) private { (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Pool:: TRANSFER_FAILED"); } function initialize(address _token) public override onlyFactory { token = _token; } function swapWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) public override lock onlyFactory returns (uint256 result) { result = getAPYSwap(_amountIn); require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER"); calcNewReserveSwap(_amountIn, result); _safeTransfer(FLASH_TOKEN, _staker, result); } function stakeWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) public override lock onlyFactory returns (uint256 result) { result = getAPYStake(_amountIn); require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER"); calcNewReserveStake(_amountIn, result); _safeTransfer(token, _staker, result); } function addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _maker ) public override onlyFactory returns ( uint256 amountFLASH, uint256 amountALT, uint256 liquidity ) { (amountFLASH, amountALT) = _addLiquidity(_amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin); liquidity = mintLiquidityTokens(_maker, amountFLASH, amountALT); calcNewReserveAddLiquidity(amountFLASH, amountALT); } function removeLiquidity(address _maker) public override onlyFactory returns (uint256 amountFLASH, uint256 amountALT) { (amountFLASH, amountALT) = burn(_maker); } function getAPYStake(uint256 _amountIn) public view returns (uint256 result) { uint256 amountInWithFee = _amountIn.mul(getLPFee()); uint256 num = amountInWithFee.mul(reserveAltAmount); uint256 den = (reserveFlashAmount.mul(1000)).add(amountInWithFee); result = num.div(den); } function getAPYSwap(uint256 _amountIn) public view returns (uint256 result) { uint256 amountInWithFee = _amountIn.mul(getLPFee()); uint256 num = amountInWithFee.mul(reserveFlashAmount); uint256 den = (reserveAltAmount.mul(1000)).add(amountInWithFee); result = num.div(den); } function getLPFee() public view returns (uint256) { uint256 fpy = IFlashProtocol(FLASH_PROTOCOL).getFPY(0); return uint256(1000).sub(fpy.div(5e15)); } function quote( uint256 _amountA, uint256 _reserveA, uint256 _reserveB ) public pure returns (uint256 amountB) { require(_amountA > 0, "Pool:: INSUFFICIENT_AMOUNT"); require(_reserveA > 0 && _reserveB > 0, "Pool:: INSUFFICIENT_LIQUIDITY"); amountB = _amountA.mul(_reserveB).div(_reserveA); } function burn(address to) private lock returns (uint256 amountFLASH, uint256 amountALT) { uint256 balanceFLASH = IERC20(FLASH_TOKEN).balanceOf(address(this)); uint256 balanceALT = IERC20(token).balanceOf(address(this)); uint256 liquidity = balanceOf[address(this)]; amountFLASH = liquidity.mul(balanceFLASH) / totalSupply; amountALT = liquidity.mul(balanceALT) / totalSupply; require(amountFLASH > 0 && amountALT > 0, "Pool:: INSUFFICIENT_LIQUIDITY_BURNED"); _burn(address(this), liquidity); _safeTransfer(FLASH_TOKEN, to, amountFLASH); _safeTransfer(token, to, amountALT); balanceFLASH = balanceFLASH.sub(IERC20(FLASH_TOKEN).balanceOf(address(this))); balanceALT = balanceALT.sub(IERC20(token).balanceOf(address(this))); calcNewReserveRemoveLiquidity(balanceFLASH, balanceALT); } function _addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin ) private view returns (uint256 amountFLASH, uint256 amountALT) { if (reserveAltAmount == 0 && reserveFlashAmount == 0) { (amountFLASH, amountALT) = (_amountFLASH, _amountALT); } else { uint256 amountALTQuote = quote(_amountFLASH, reserveFlashAmount, reserveAltAmount); if (amountALTQuote <= _amountALT) { require(amountALTQuote >= _amountALTMin, "Pool:: INSUFFICIENT_B_AMOUNT"); (amountFLASH, amountALT) = (_amountFLASH, amountALTQuote); } else { uint256 amountFLASHQuote = quote(_amountALT, reserveAltAmount, reserveFlashAmount); require( (amountFLASHQuote <= _amountFLASH) && (amountFLASHQuote >= _amountFLASHMin), "Pool:: INSUFFICIENT_A_AMOUNT" ); (amountFLASH, amountALT) = (amountFLASHQuote, _amountALT); } } } function mintLiquidityTokens( address _to, uint256 _flashAmount, uint256 _altAmount ) private returns (uint256 liquidity) { if (totalSupply == 0) { liquidity = SafeMath.sqrt(_flashAmount.mul(_altAmount)).sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } else { liquidity = SafeMath.min( _flashAmount.mul(totalSupply) / reserveFlashAmount, _altAmount.mul(totalSupply) / reserveAltAmount ); } require(liquidity > 0, "Pool:: INSUFFICIENT_LIQUIDITY_MINTED"); _mint(_to, liquidity); } function calcNewReserveStake(uint256 _amountIn, uint256 _amountOut) private { reserveFlashAmount = reserveFlashAmount.add(_amountIn); reserveAltAmount = reserveAltAmount.sub(_amountOut); } function calcNewReserveSwap(uint256 _amountIn, uint256 _amountOut) private { reserveFlashAmount = reserveFlashAmount.sub(_amountOut); reserveAltAmount = reserveAltAmount.add(_amountIn); } function calcNewReserveAddLiquidity(uint256 _amountFLASH, uint256 _amountALT) private { reserveFlashAmount = reserveFlashAmount.add(_amountFLASH); reserveAltAmount = reserveAltAmount.add(_amountALT); } function calcNewReserveRemoveLiquidity(uint256 _amountFLASH, uint256 _amountALT) private { reserveFlashAmount = reserveFlashAmount.sub(_amountFLASH); reserveAltAmount = reserveAltAmount.sub(_amountALT); } } pragma solidity 0.6.12; contract FlashApp is IFlashReceiver { using SafeMath for uint256; address public constant FLASH_TOKEN = 0xB4467E8D621105312a914F1D42f10770C0Ffe3c8; address public constant FLASH_PROTOCOL = 0xEc02f813404656E2A2AEd5BaeEd41D785324E8D0; mapping(bytes32 => uint256) public stakerReward; mapping(address => address) public pools; // token -> pools event PoolCreated(address _pool, address _token); event Staked(bytes32 _id, uint256 _rewardAmount, address _pool); event LiquidityAdded(address _pool, uint256 _amountFLASH, uint256 _amountALT, uint256 _liquidity, address _sender); event LiquidityRemoved( address _pool, uint256 _amountFLASH, uint256 _amountALT, uint256 _liquidity, address _sender ); event Swapped(address _sender, uint256 _swapAmount, uint256 _flashReceived, address _pool); modifier onlyProtocol() { require(msg.sender == FLASH_PROTOCOL, "FlashApp:: ONLY_PROTOCOL"); _; } function createPool(address _token) external returns (address poolAddress) { require(_token != address(0), "FlashApp:: INVALID_TOKEN_ADDRESS"); require(pools[_token] == address(0), "FlashApp:: POOL_ALREADY_EXISTS"); bytes memory bytecode = type(Pool).creationCode; bytes32 salt = keccak256(abi.encodePacked(block.timestamp, msg.sender)); poolAddress = Create2.deploy(0, salt, bytecode); pools[_token] = poolAddress; IPool(poolAddress).initialize(_token); emit PoolCreated(poolAddress, _token); } function receiveFlash( bytes32 _id, uint256 _amountIn, //unused uint256 _expireAfter, //unused uint256 _mintedAmount, address _staker, bytes calldata _data ) external override onlyProtocol returns (uint256) { (address token, uint256 expectedOutput) = abi.decode(_data, (address, uint256)); address pool = pools[token]; IERC20(FLASH_TOKEN).transfer(pool, _mintedAmount); uint256 reward = IPool(pool).stakeWithFeeRewardDistribution(_mintedAmount, _staker, expectedOutput); stakerReward[_id] = reward; emit Staked(_id, reward, pool); } function unstake(bytes32[] memory _expiredIds) public { for (uint256 i = 0; i < _expiredIds.length; i = i.add(1)) { IFlashProtocol(FLASH_PROTOCOL).unstake(_expiredIds[i]); } } function swap( uint256 _altQuantity, address _token, uint256 _expectedOutput ) public returns (uint256 result) { address user = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); require(_altQuantity > 0, "FlashApp:: INVALID_AMOUNT"); IERC20(_token).transferFrom(user, address(this), _altQuantity); IERC20(_token).transfer(pool, _altQuantity); result = IPool(pool).swapWithFeeRewardDistribution(_altQuantity, user, _expectedOutput); emit Swapped(user, _altQuantity, result, pool); } function addLiquidityInPool( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _token ) public { address maker = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); require(_amountFLASH > 0 && _amountALT > 0, "FlashApp:: INVALID_AMOUNT"); (uint256 amountFLASH, uint256 amountALT, uint256 liquidity) = IPool(pool).addLiquidity( _amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin, maker ); IERC20(FLASH_TOKEN).transferFrom(maker, address(this), amountFLASH); IERC20(FLASH_TOKEN).transfer(pool, amountFLASH); IERC20(_token).transferFrom(maker, address(this), amountALT); IERC20(_token).transfer(pool, amountALT); emit LiquidityAdded(pool, amountFLASH, amountALT, liquidity, maker); } function removeLiquidityInPool(uint256 _liquidity, address _token) public { address maker = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); IERC20(pool).transferFrom(maker, address(this), _liquidity); IERC20(pool).transfer(pool, _liquidity); (uint256 amountFLASH, uint256 amountALT) = IPool(pool).removeLiquidity(maker); emit LiquidityRemoved(pool, amountFLASH, amountALT, _liquidity, maker); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_flashReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"FLASH_PROTOCOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"internalType":"uint256","name":"_amountALT","type":"uint256"},{"internalType":"uint256","name":"_amountFLASHMin","type":"uint256"},{"internalType":"uint256","name":"_amountALTMin","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"addLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"createPool","outputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_expireAfter","type":"uint256"},{"internalType":"uint256","name":"_mintedAmount","type":"uint256"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"receiveFlash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"removeLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"stakerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_altQuantity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_expectedOutput","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_expiredIds","type":"bytes32[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615336806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a4063dbc11610066578063a4063dbc146102d4578063a7f0e90314610342578063b12c10f714610376578063d959d8bc1461042e578063eb1ce2211461049a5761009e565b80631d994a53146100a357806323c6e14c146100f15780632cbff4461461012557806343264349146101fa5780639049f9d214610266575b600080fd5b6100ef600480360360408110156100b957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506104dc565b005b6100f961089f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e4600480360360c081101561013b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b90919293919293905050506108b7565b6040518082815260200191505060405180910390f35b6102506004803603606081101561021057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c16565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061104b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610316600480360360208110156102ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61034a611416565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61042c6004803603602081101561038c57600080fd5b81019080803590602001906401000000008111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111640100000000831117156103dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061142e565b005b610498600480360360a081101561044457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b6104c6600480360360208110156104b057600080fd5b8101908080359060200190929190505050611b27565b6040518082815260200191505060405180910390f35b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561067757600080fd5b505af115801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663d798f86e856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b1580156107cb57600080fd5b505af11580156107df573d6000803e3d6000fd5b505050506040513d60408110156107f557600080fd5b810190808051906020019092919080519060200190929190505050915091507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e8383838988604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1505050505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b600073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f466c6173684170703a3a204f4e4c595f50524f544f434f4c000000000000000081525060200191505060405180910390fd5b6000808484604081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050915091506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b81019080805190602001909291905050505060008173ffffffffffffffffffffffffffffffffffffffff1663687fbed88a8a866040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b81019080805190602001909291905050509050806000808e8152602001908152602001600020819055507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc528c8284604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050979650505050505050565b6000803390506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008611610d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8330896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b8101908080519060200190929190505050508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff166350b814a08784876040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f8a57600080fd5b505af1158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b810190808051906020019092919050505092507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc082878584604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f466c6173684170703a3a20494e56414c49445f544f4b454e5f4144445245535381525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466c6173684170703a3a20504f4f4c5f414c52454144595f455849535453000081525060200191505060405180910390fd5b60606040518060200161120290611d6c565b6020820181038252601f19601f82011660405250905060004233604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120905061127060008284611b3f565b925082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050507f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48968385604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050919050565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b60005b815181101561150b5773ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff166371ed5d1a83838151811061147657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b505050506040513d60208110156114de57600080fd5b810190808051906020019092919050505050611504600182611ce990919063ffffffff16565b9050611431565b5050565b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008711801561162b5750600086115b61169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050606060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505050506040513d606081101561175557600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505092509250925073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b81019080805190602001909291905050505073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff166323b872dd8630856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b505050506040513d60208110156119d957600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b8101908080519060200190929190505050507f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d418484848489604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a150505050505050505050565b60006020528060005260406000206000915090505481565b60008084471015611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f437265617465323a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b600083511415611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8383516020850187f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b809150509392505050565b6000828284019150811015611d66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61358780611d7a8339019056fe6080604052600160085534801561001557600080fd5b5033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613521806100666000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab077214610aa3578063e3ee160e14610b31578063e94a010214610bdf578063ed24911d14610c43578063fc0c546a14610c6157610211565b8063c4d66de8146108ef578063d505accf14610933578063d798f86e146109cc578063dd62ed3e14610a2b57610211565b8063a9059cbb116100f4578063a9059cbb146107c5578063ad615dec14610829578063ba9a7a561461087f578063c0bd9f161461089d578063c45a0155146108bb57610211565b806395d89b41146106ae578063a0cc6a6814610731578063a10adb171461074f578063a7f0e9031461079157610211565b80633408e470116101a85780634d861ece116101775780634d861ece1461050857806350b814a014610526578063687fbed81461059257806370a08231146105fe5780637ecebe001461065657610211565b80633408e470146104465780633750a8bd14610464578063411542701461048257806342966c68146104c457610211565b806323b872dd116101e457806323b872dd1461034f57806323c6e14c146103d357806330adf81f14610407578063313ce5671461042557610211565b806306fdde03146102165780630754617214610299578063095ea7b3146102cd57806318160ddd14610331575b600080fd5b61021e610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a1610cce565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610319600480360360408110156102e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b610339610d0b565b6040518082815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d11565b60405180821515815260200191505060405180910390f35b6103db610e65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f610e7d565b6040518082815260200191505060405180910390f35b61042d610ea4565b604051808260ff16815260200191505060405180910390f35b61044e610ea9565b6040518082815260200191505060405180910390f35b61046c610eb1565b6040518082815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050610f8b565b6040518082815260200191505060405180910390f35b6104f0600480360360208110156104da57600080fd5b810190808035906020019092919050505061100d565b60405180821515815260200191505060405180910390f35b610510611022565b6040518082815260200191505060405180910390f35b61057c6004803603606081101561053c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611028565b6040518082815260200191505060405180910390f35b6105e8600480360360608110156105a857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611226565b6040518082815260200191505060405180910390f35b6106406004803603602081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611432565b6040518082815260200191505060405180910390f35b6106986004803603602081101561066c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144a565b6040518082815260200191505060405180910390f35b6106b6611462565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f65780820151818401526020810190506106db565b50505050905090810190601f1680156107235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61073961149b565b6040518082815260200191505060405180910390f35b61077b6004803603602081101561076557600080fd5b81019080803590602001909291905050506114c2565b6040518082815260200191505060405180910390f35b610799611544565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610811600480360360408110156107db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155c565b60405180821515815260200191505060405180910390f35b6108696004803603606081101561083f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611573565b6040518082815260200191505060405180910390f35b61088761169a565b6040518082815260200191505060405180910390f35b6108a56116a0565b6040518082815260200191505060405180910390f35b6108c36116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109316004803603602081101561090557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b005b6109ca600480360360e081101561094957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506117d3565b005b610a0e600480360360208110156109e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119c5565b604051808381526020018281526020019250505060405180910390f35b610a8d60048036036040811015610a4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa1565b6040518082815260200191505060405180910390f35b610b0d600480360360a0811015610ab957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac6565b60405180848152602001838152602001828152602001935050505060405180910390f35b610bdd6004803603610120811015610b4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611bc4565b005b610c2b60048036036040811015610bf557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ea3565b60405180821515815260200191505060405180910390f35b610c4b611ed2565b6040518082815260200191505060405180910390f35b610c69611fa6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6040518060400160405280601281526020017f464c4153482d414c542d4c5020546f6b656e000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d01338484611fcc565b6001905092915050565b60005481565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e4e57610dcd83826120b790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610e5985858561213a565b60019150509392505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b601281565b600046905090565b60008073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff1663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f1a57600080fd5b505afa158015610f2e573d6000803e3d6000fd5b505050506040513d6020811015610f4457600080fd5b81019080805190602001909291905050509050610f85610f746611c37937e080008361235490919063ffffffff16565b6103e86120b790919063ffffffff16565b91505090565b600080610fa8610f99610eb1565b846123e390919063ffffffff16565b90506000610fc1600754836123e390919063ffffffff16565b90506000610fee83610fe06103e86006546123e390919063ffffffff16565b61248690919063ffffffff16565b9050611003818361235490919063ffffffff16565b9350505050919050565b60006110193383612509565b60019050919050565b60065481565b60006001600854146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611176846114c2565b9050808211156111ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6111f88482612623565b61121773b4467e8d621105312a914f1d42f10770c0ffe3c8848361265d565b60016008819055509392505050565b60006001600854146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b61137484610f8b565b9050808211156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6113f68482612894565b611423600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848361265d565b60016008819055509392505050565b60026020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b6040518060400160405280600c81526020017f464c4153482d414c542d4c50000000000000000000000000000000000000000081525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b81565b6000806114df6114d0610eb1565b846123e390919063ffffffff16565b905060006114f8600654836123e390919063ffffffff16565b90506000611525836115176103e86007546123e390919063ffffffff16565b61248690919063ffffffff16565b905061153a818361235490919063ffffffff16565b9350505050919050565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b600061156933848461213a565b6001905092915050565b60008084116115ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a20494e53554646494349454e545f414d4f554e5400000000000081525060200191505060405180910390fd5b6000831180156115fa5750600082115b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c3a3a20494e53554646494349454e545f4c495155494449545900000081525060200191505060405180910390fd5b6116918361168384876123e390919063ffffffff16565b61235490919063ffffffff16565b90509392505050565b6103e881565b60075481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b4284101561182c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205489604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506119606001600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119b088828686866128ce565b6119bb888888611fcc565b5050505050505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611a9483612a5e565b8092508193505050915091565b6003602052816000526040600020602052806000526040600020600091509150505481565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611b9a88888888612f5e565b8093508194505050611bad8484846130d4565b9050611bb983836131d8565b955095509592505050565b854211611c1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061347d6027913960400191505060405180910390fd5b844210611c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff1615611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133e26026913960400191505060405180910390fd5b60007f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8a8a8a8a8a8a604051602001808881526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050611ddf8a828686866128ce565b6001600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550848a73ffffffffffffffffffffffffffffffffffffffff167f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a560405160405180910390a3611e978a8a8a61213a565b50505050505050505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60001b7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c60001b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b611f48610ea9565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828284039150811115612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d4154483a3a205355425f554e444552464c4f5700000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613408602e913960400191505060405180910390fd5b61221281600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122a781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d4154483a3a204449564953494f4e5f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b60008284816123d657fe5b0490508091505092915050565b6000808314156123f65760009050612480565b600082840290508284828161240757fe5b041461247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204d554c5f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b6000828284019150811015612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61255b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125b3816000546120b790919063ffffffff16565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612638816006546120b790919063ffffffff16565b6006819055506126538260075461248690919063ffffffff16565b6007819055505050565b600060608473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106127745780518252602082019150602081019050602083039250612751565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127d6576040519150601f19603f3d011682016040523d82523d6000602084013e6127db565b606091505b509150915081801561281b575060008151148061281a575080806020019051602081101561280857600080fd5b81019080805190602001909291905050505b5b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f506f6f6c3a3a205452414e534645525f4641494c45440000000000000000000081525060200191505060405180910390fd5b5050505050565b6128a98260065461248690919063ffffffff16565b6006819055506128c4816007546120b790919063ffffffff16565b6007819055505050565b60006128d8611ed2565b8560405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a0057508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134576026913960400191505060405180910390fd5b50505050505050565b600080600160085414612ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b810190808051906020019092919050505090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d6020811015612c5057600080fd5b810190808051906020019092919050505090506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600054612cbd84836123e390919063ffffffff16565b81612cc457fe5b049450600054612cdd83836123e390919063ffffffff16565b81612ce457fe5b049350600085118015612cf75750600084115b612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134a46024913960400191505060405180910390fd5b612d563082612509565b612d7573b4467e8d621105312a914f1d42f10770c0ffe3c8878761265d565b612da2600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878661265d565b612e6a73b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b8101908080519060200190929190505050846120b790919063ffffffff16565b9250612f42600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ef857600080fd5b505afa158015612f0c573d6000803e3d6000fd5b505050506040513d6020811015612f2257600080fd5b8101908080519060200190929190505050836120b790919063ffffffff16565b9150612f4e8383613212565b5050506001600881905550915091565b6000806000600754148015612f7557506000600654145b15612f8957858580925081935050506130cb565b6000612f9a87600654600754611573565b90508581116130285783811015613019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e540000000081525060200191505060405180910390fd5b868180935081945050506130c9565b600061303987600754600654611573565b905087811115801561304b5750858110155b6130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e540000000081525060200191505060405180910390fd5b80878094508195505050505b505b94509492505050565b60008060005414156131235761310f6103e86131016130fc85876123e390919063ffffffff16565b61324c565b6120b790919063ffffffff16565b905061311e60006103e86132ae565b61316e565b61316b60065461313e600054866123e390919063ffffffff16565b8161314557fe5b0460075461315e600054866123e390919063ffffffff16565b8161316557fe5b046133c8565b90505b600081116131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134c86024913960400191505060405180910390fd5b6131d184826132ae565b9392505050565b6131ed8260065461248690919063ffffffff16565b6006819055506132088160075461248690919063ffffffff16565b6007819055505050565b613227826006546120b790919063ffffffff16565b600681905550613242816007546120b790919063ffffffff16565b6007819055505050565b6000600382111561329b57819050600060016002848161326857fe5b040190505b818110156132955780915060028182858161328457fe5b04018161328d57fe5b04905061326d565b506132a9565b600082146132a857600190505b5b919050565b6132c38160005461248690919063ffffffff16565b60008190555061331b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008183106133d757816133d9565b825b90509291505056fe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a2646970667358221220a303fd62f349c50b6d9027293ed3707e0ca21c2a55fdb4ab6e1f684983b562db64736f6c634300060c0033a26469706673582212209d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb97164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a4063dbc11610066578063a4063dbc146102d4578063a7f0e90314610342578063b12c10f714610376578063d959d8bc1461042e578063eb1ce2211461049a5761009e565b80631d994a53146100a357806323c6e14c146100f15780632cbff4461461012557806343264349146101fa5780639049f9d214610266575b600080fd5b6100ef600480360360408110156100b957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506104dc565b005b6100f961089f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e4600480360360c081101561013b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101a057600080fd5b8201836020820111156101b257600080fd5b803590602001918460018302840111640100000000831117156101d457600080fd5b90919293919293905050506108b7565b6040518082815260200191505060405180910390f35b6102506004803603606081101561021057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c16565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061104b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610316600480360360208110156102ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61034a611416565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61042c6004803603602081101561038c57600080fd5b81019080803590602001906401000000008111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111640100000000831117156103dd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061142e565b005b610498600480360360a081101561044457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b6104c6600480360360208110156104b057600080fd5b8101908080359060200190929190505050611b27565b6040518082815260200191505060405180910390f35b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561067757600080fd5b505af115801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561072457600080fd5b505af1158015610738573d6000803e3d6000fd5b505050506040513d602081101561074e57600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663d798f86e856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b1580156107cb57600080fd5b505af11580156107df573d6000803e3d6000fd5b505050506040513d60408110156107f557600080fd5b810190808051906020019092919080519060200190929190505050915091507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e8383838988604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1505050505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b600073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f466c6173684170703a3a204f4e4c595f50524f544f434f4c000000000000000081525060200191505060405180910390fd5b6000808484604081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050915091506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a9f57600080fd5b505af1158015610ab3573d6000803e3d6000fd5b505050506040513d6020811015610ac957600080fd5b81019080805190602001909291905050505060008173ffffffffffffffffffffffffffffffffffffffff1663687fbed88a8a866040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b81019080805190602001909291905050509050806000808e8152602001908152602001600020819055507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc528c8284604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150505050979650505050505050565b6000803390506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008611610d99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8330896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610e2857600080fd5b505af1158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b8101908080519060200190929190505050508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d6020811015610eff57600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff166350b814a08784876040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f8a57600080fd5b505af1158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b810190808051906020019092919050505092507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc082878584604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f466c6173684170703a3a20494e56414c49445f544f4b454e5f4144445245535381525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f466c6173684170703a3a20504f4f4c5f414c52454144595f455849535453000081525060200191505060405180910390fd5b60606040518060200161120290611d6c565b6020820181038252601f19601f82011660405250905060004233604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120905061127060008284611b3f565b925082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff1663c4d66de8856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561135957600080fd5b505af115801561136d573d6000803e3d6000fd5b505050507f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48968385604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050919050565b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b60005b815181101561150b5773ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff166371ed5d1a83838151811061147657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b505050506040513d60208110156114de57600080fd5b810190808051906020019092919050505050611504600182611ce990919063ffffffff16565b9050611431565b5050565b60003390506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f466c6173684170703a3a20504f4f4c5f444f45534e545f45584953540000000081525060200191505060405180910390fd5b60008711801561162b5750600086115b61169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f466c6173684170703a3a20494e56414c49445f414d4f554e540000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050606060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505050506040513d606081101561175557600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505092509250925073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561182357600080fd5b505af1158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b81019080805190602001909291905050505073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff166323b872dd8630856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156119af57600080fd5b505af11580156119c3573d6000803e3d6000fd5b505050506040513d60208110156119d957600080fd5b8101908080519060200190929190505050508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b8101908080519060200190929190505050507f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d418484848489604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a150505050505050505050565b60006020528060005260406000206000915090505481565b60008084471015611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f437265617465323a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b600083511415611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f437265617465323a2062797465636f6465206c656e677468206973207a65726f81525060200191505060405180910390fd5b8383516020850187f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f437265617465323a204661696c6564206f6e206465706c6f790000000000000081525060200191505060405180910390fd5b809150509392505050565b6000828284019150811015611d66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61358780611d7a8339019056fe6080604052600160085534801561001557600080fd5b5033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613521806100666000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab077214610aa3578063e3ee160e14610b31578063e94a010214610bdf578063ed24911d14610c43578063fc0c546a14610c6157610211565b8063c4d66de8146108ef578063d505accf14610933578063d798f86e146109cc578063dd62ed3e14610a2b57610211565b8063a9059cbb116100f4578063a9059cbb146107c5578063ad615dec14610829578063ba9a7a561461087f578063c0bd9f161461089d578063c45a0155146108bb57610211565b806395d89b41146106ae578063a0cc6a6814610731578063a10adb171461074f578063a7f0e9031461079157610211565b80633408e470116101a85780634d861ece116101775780634d861ece1461050857806350b814a014610526578063687fbed81461059257806370a08231146105fe5780637ecebe001461065657610211565b80633408e470146104465780633750a8bd14610464578063411542701461048257806342966c68146104c457610211565b806323b872dd116101e457806323b872dd1461034f57806323c6e14c146103d357806330adf81f14610407578063313ce5671461042557610211565b806306fdde03146102165780630754617214610299578063095ea7b3146102cd57806318160ddd14610331575b600080fd5b61021e610c95565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025e578082015181840152602081019050610243565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a1610cce565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610319600480360360408110156102e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610cf4565b60405180821515815260200191505060405180910390f35b610339610d0b565b6040518082815260200191505060405180910390f35b6103bb6004803603606081101561036557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d11565b60405180821515815260200191505060405180910390f35b6103db610e65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f610e7d565b6040518082815260200191505060405180910390f35b61042d610ea4565b604051808260ff16815260200191505060405180910390f35b61044e610ea9565b6040518082815260200191505060405180910390f35b61046c610eb1565b6040518082815260200191505060405180910390f35b6104ae6004803603602081101561049857600080fd5b8101908080359060200190929190505050610f8b565b6040518082815260200191505060405180910390f35b6104f0600480360360208110156104da57600080fd5b810190808035906020019092919050505061100d565b60405180821515815260200191505060405180910390f35b610510611022565b6040518082815260200191505060405180910390f35b61057c6004803603606081101561053c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611028565b6040518082815260200191505060405180910390f35b6105e8600480360360608110156105a857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611226565b6040518082815260200191505060405180910390f35b6106406004803603602081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611432565b6040518082815260200191505060405180910390f35b6106986004803603602081101561066c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061144a565b6040518082815260200191505060405180910390f35b6106b6611462565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f65780820151818401526020810190506106db565b50505050905090810190601f1680156107235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61073961149b565b6040518082815260200191505060405180910390f35b61077b6004803603602081101561076557600080fd5b81019080803590602001909291905050506114c2565b6040518082815260200191505060405180910390f35b610799611544565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610811600480360360408110156107db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061155c565b60405180821515815260200191505060405180910390f35b6108696004803603606081101561083f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611573565b6040518082815260200191505060405180910390f35b61088761169a565b6040518082815260200191505060405180910390f35b6108a56116a0565b6040518082815260200191505060405180910390f35b6108c36116a6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109316004803603602081101561090557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cc565b005b6109ca600480360360e081101561094957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506117d3565b005b610a0e600480360360208110156109e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119c5565b604051808381526020018281526020019250505060405180910390f35b610a8d60048036036040811015610a4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa1565b6040518082815260200191505060405180910390f35b610b0d600480360360a0811015610ab957600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac6565b60405180848152602001838152602001828152602001935050505060405180910390f35b610bdd6004803603610120811015610b4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611bc4565b005b610c2b60048036036040811015610bf557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ea3565b60405180821515815260200191505060405180910390f35b610c4b611ed2565b6040518082815260200191505060405180910390f35b610c69611fa6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6040518060400160405280601281526020017f464c4153482d414c542d4c5020546f6b656e000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d01338484611fcc565b6001905092915050565b60005481565b600080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e4e57610dcd83826120b790919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610e5985858561213a565b60019150509392505050565b73b4467e8d621105312a914f1d42f10770c0ffe3c881565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b601281565b600046905090565b60008073ec02f813404656e2a2aed5baeed41d785324e8d073ffffffffffffffffffffffffffffffffffffffff1663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f1a57600080fd5b505afa158015610f2e573d6000803e3d6000fd5b505050506040513d6020811015610f4457600080fd5b81019080805190602001909291905050509050610f85610f746611c37937e080008361235490919063ffffffff16565b6103e86120b790919063ffffffff16565b91505090565b600080610fa8610f99610eb1565b846123e390919063ffffffff16565b90506000610fc1600754836123e390919063ffffffff16565b90506000610fee83610fe06103e86006546123e390919063ffffffff16565b61248690919063ffffffff16565b9050611003818361235490919063ffffffff16565b9350505050919050565b60006110193383612509565b60019050919050565b60065481565b60006001600854146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611176846114c2565b9050808211156111ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6111f88482612623565b61121773b4467e8d621105312a914f1d42f10770c0ffe3c8848361265d565b60016008819055509392505050565b60006001600854146112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b61137484610f8b565b9050808211156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a2045585045435445445f49535f4752454154455200000000000081525060200191505060405180910390fd5b6113f68482612894565b611423600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848361265d565b60016008819055509392505050565b60026020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b6040518060400160405280600c81526020017f464c4153482d414c542d4c50000000000000000000000000000000000000000081525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b81565b6000806114df6114d0610eb1565b846123e390919063ffffffff16565b905060006114f8600654836123e390919063ffffffff16565b90506000611525836115176103e86007546123e390919063ffffffff16565b61248690919063ffffffff16565b905061153a818361235490919063ffffffff16565b9350505050919050565b73ec02f813404656e2a2aed5baeed41d785324e8d081565b600061156933848461213a565b6001905092915050565b60008084116115ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f506f6f6c3a3a20494e53554646494349454e545f414d4f554e5400000000000081525060200191505060405180910390fd5b6000831180156115fa5750600082115b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c3a3a20494e53554646494349454e545f4c495155494449545900000081525060200191505060405180910390fd5b6116918361168384876123e390919063ffffffff16565b61235490919063ffffffff16565b90509392505050565b6103e881565b60075481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b4284101561182c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b888888600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205489604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506119606001600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119b088828686866128ce565b6119bb888888611fcc565b5050505050505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611a9483612a5e565b8092508193505050915091565b6003602052816000526040600020602052806000526040600020600091509150505481565b6000806000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c3a3a204f4e4c595f464143544f52590000000000000000000000000081525060200191505060405180910390fd5b611b9a88888888612f5e565b8093508194505050611bad8484846130d4565b9050611bb983836131d8565b955095509592505050565b854211611c1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061347d6027913960400191505060405180910390fd5b844210611c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060009054906101000a900460ff1615611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133e26026913960400191505060405180910390fd5b60007f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226760001b8a8a8a8a8a8a604051602001808881526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001838152602001828152602001975050505050505050604051602081830303815290604052805190602001209050611ddf8a828686866128ce565b6001600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060006101000a81548160ff021916908315150217905550848a73ffffffffffffffffffffffffffffffffffffffff167f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a560405160405180910390a3611e978a8a8a61213a565b50505050505050505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60001b7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c60001b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660001b611f48610ea9565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828284039150811115612134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d4154483a3a205355425f554e444552464c4f5700000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613408602e913960400191505060405180910390fd5b61221281600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122a781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082116123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d4154483a3a204449564953494f4e5f42595f5a45524f00000000000000000081525060200191505060405180910390fd5b60008284816123d657fe5b0490508091505092915050565b6000808314156123f65760009050612480565b600082840290508284828161240757fe5b041461247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204d554c5f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b6000828284019150811015612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d4154483a3a204144445f4f564552464c4f570000000000000000000000000081525060200191505060405180910390fd5b92915050565b61255b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120b790919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125b3816000546120b790919063ffffffff16565b600081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612638816006546120b790919063ffffffff16565b6006819055506126538260075461248690919063ffffffff16565b6007819055505050565b600060608473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106127745780518252602082019150602081019050602083039250612751565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127d6576040519150601f19603f3d011682016040523d82523d6000602084013e6127db565b606091505b509150915081801561281b575060008151148061281a575080806020019051602081101561280857600080fd5b81019080805190602001909291905050505b5b61288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f506f6f6c3a3a205452414e534645525f4641494c45440000000000000000000081525060200191505060405180910390fd5b5050505050565b6128a98260065461248690919063ffffffff16565b6006819055506128c4816007546120b790919063ffffffff16565b6007819055505050565b60006128d8611ed2565b8560405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561298c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a0057508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134576026913960400191505060405180910390fd5b50505050505050565b600080600160085414612ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f506f6f6c3a204c4f434b4544000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600881905550600073b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b810190808051906020019092919050505090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2657600080fd5b505afa158015612c3a573d6000803e3d6000fd5b505050506040513d6020811015612c5057600080fd5b810190808051906020019092919050505090506000600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600054612cbd84836123e390919063ffffffff16565b81612cc457fe5b049450600054612cdd83836123e390919063ffffffff16565b81612ce457fe5b049350600085118015612cf75750600084115b612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134a46024913960400191505060405180910390fd5b612d563082612509565b612d7573b4467e8d621105312a914f1d42f10770c0ffe3c8878761265d565b612da2600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878661265d565b612e6a73b4467e8d621105312a914f1d42f10770c0ffe3c873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b8101908080519060200190929190505050846120b790919063ffffffff16565b9250612f42600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ef857600080fd5b505afa158015612f0c573d6000803e3d6000fd5b505050506040513d6020811015612f2257600080fd5b8101908080519060200190929190505050836120b790919063ffffffff16565b9150612f4e8383613212565b5050506001600881905550915091565b6000806000600754148015612f7557506000600654145b15612f8957858580925081935050506130cb565b6000612f9a87600654600754611573565b90508581116130285783811015613019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e540000000081525060200191505060405180910390fd5b868180935081945050506130c9565b600061303987600754600654611573565b905087811115801561304b5750858110155b6130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e540000000081525060200191505060405180910390fd5b80878094508195505050505b505b94509492505050565b60008060005414156131235761310f6103e86131016130fc85876123e390919063ffffffff16565b61324c565b6120b790919063ffffffff16565b905061311e60006103e86132ae565b61316e565b61316b60065461313e600054866123e390919063ffffffff16565b8161314557fe5b0460075461315e600054866123e390919063ffffffff16565b8161316557fe5b046133c8565b90505b600081116131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134c86024913960400191505060405180910390fd5b6131d184826132ae565b9392505050565b6131ed8260065461248690919063ffffffff16565b6006819055506132088160075461248690919063ffffffff16565b6007819055505050565b613227826006546120b790919063ffffffff16565b600681905550613242816007546120b790919063ffffffff16565b6007819055505050565b6000600382111561329b57819050600060016002848161326857fe5b040190505b818110156132955780915060028182858161328457fe5b04018161328d57fe5b04905061326d565b506132a9565b600082146132a857600190505b5b919050565b6132c38160005461248690919063ffffffff16565b60008190555061331b81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008183106133d757816133d9565b825b90509291505056fe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e544544a2646970667358221220a303fd62f349c50b6d9027293ed3707e0ca21c2a55fdb4ab6e1f684983b562db64736f6c634300060c0033a26469706673582212209d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb97164736f6c634300060c0033
Deployed Bytecode Sourcemap
22877:4700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27047:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22955:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24491:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25368:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23911:572;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23188:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23042:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25149:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26027:1012;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23134:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27047:527;27132:13;27148:10;27132:26;;27171:12;27186:5;:13;27192:6;27186:13;;;;;;;;;;;;;;;;;;;;;;;;;27171:28;;27236:1;27220:18;;:4;:18;;;;27212:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27291:4;27284:25;;;27310:5;27325:4;27332:10;27284:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27361:4;27354:21;;;27376:4;27382:10;27354:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27407:19;27428:17;27455:4;27449:27;;;27477:5;27449:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27406:77;;;;27501:65;27518:4;27524:11;27537:9;27548:10;27560:5;27501:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27047:527;;;;;;:::o;22955:80::-;22993:42;22955:80;:::o;24491:650::-;24748:7;23083:42;23826:28;;:10;:28;;;23818:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24769:13:::1;24784:22:::0;24821:5:::1;;24810:37;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24768:79;;;;24858:12;24873:5;:12;24879:5;24873:12;;;;;;;;;;;;;;;;;;;;;;;;;24858:27;;22993:42;24896:28;;;24925:4;24931:13;24896:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;24956:14;24979:4;24973:42;;;25016:13;25031:7;25040:14;24973:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;24956:99;;25086:6;25066:12;:17:::0;25079:3:::1;25066:17;;;;;;;;;;;:26;;;;25108:25;25115:3;25120:6;25128:4;25108:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23894:1;;;;24491:650:::0;;;;;;;;;:::o;25368:651::-;25495:14;25522:12;25537:10;25522:25;;25558:12;25573:5;:13;25579:6;25573:13;;;;;;;;;;;;;;;;;;;;;;;;;25558:28;;25623:1;25607:18;;:4;:18;;;;25599:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25692:1;25677:12;:16;25669:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25743:6;25736:27;;;25764:4;25778;25785:12;25736:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25816:6;25809:23;;;25833:4;25839:12;25809:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25880:4;25874:41;;;25916:12;25930:4;25936:15;25874:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25865:87;;25970:41;25978:4;25984:12;25998:6;26006:4;25970:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25368:651;;;;;;;:::o;23911:572::-;23965:19;24023:1;24005:20;;:6;:20;;;;23997:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24106:1;24081:27;;:5;:13;24087:6;24081:13;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;24073:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24154:21;24178:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;24154:47;;24212:12;24254:15;24271:10;24237:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24227:56;;;;;;24212:71;;24308:33;24323:1;24326:4;24332:8;24308:14;:33::i;:::-;24294:47;;24368:11;24352:5;:13;24358:6;24352:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24396:11;24390:29;;;24420:6;24390:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24443:32;24455:11;24468:6;24443:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;23911:572;;;;;:::o;23188:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;23042:83::-;23083:42;23042:83;:::o;25149:211::-;25219:9;25214:139;25238:11;:18;25234:1;:22;25214:139;;;23083:42;25287:38;;;25326:11;25338:1;25326:14;;;;;;;;;;;;;;25287:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25262:8;25268:1;25262;:5;;:8;;;;:::i;:::-;25258:12;;25214:139;;;;25149:211;:::o;26027:1012::-;26231:13;26247:10;26231:26;;26268:12;26283:5;:13;26289:6;26283:13;;;;;;;;;;;;;;;;;;;;;;;;;26268:28;;26333:1;26317:18;;:4;:18;;;;26309:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26402:1;26387:12;:16;:34;;;;;26420:1;26407:10;:14;26387:34;26379:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26465:19;26486:17;26505;26532:4;26526:24;;;26565:12;26592:10;26617:15;26647:13;26675:5;26526:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26464:227;;;;;;22993:42;26704:32;;;26737:5;26752:4;26759:11;26704:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22993:42;26782:28;;;26811:4;26817:11;26782:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26847:6;26840:27;;;26868:5;26883:4;26890:9;26840:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26918:6;26911:23;;;26935:4;26941:9;26911:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26969:62;26984:4;26990:11;27003:9;27014;27025:5;26969:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26027:1012;;;;;;;;;;:::o;23134:47::-;;;;;;;;;;;;;;;;;:::o;5444:545::-;5531:7;5551:12;5607:6;5582:21;:31;;5574:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5685:1;5666:8;:15;:20;;5658:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5877:4;5866:8;5860:15;5853:4;5843:8;5839:19;5831:6;5823:59;5815:67;;5927:1;5911:18;;:4;:18;;;;5903:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5977:4;5970:11;;;5444:545;;;;;:::o;1724:136::-;1782:9;1827:1;1821;1817;:5;1813:9;;;1812:16;;1804:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1724:136;;;;:::o;-1:-1:-1:-;;;;;;;;:::o
Swarm Source
ipfs://9d839cc9fb5b62ee208926dbb39706d7e64f35d486cdf2211120671def7eb971
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.