Contract Overview
Balance:
3.2 Ether
Token:
More Info
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 8 internal transactions
[ Download CSV Export ]
Contract Name:
eMarketDex
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-07 */ /** *Submitted for verification at Etherscan.io on 2020-09-11 */ /** *Submitted for verification at Etherscan.io on 2020-09-09 */ /** *Submitted for verification at Etherscan.io on 2020-09-04 */ /** *Submitted for verification at Etherscan.io on 2020-08-27 */ /** *Submitted for verification at Etherscan.io on 2020-06-27 */ /** *Submitted for verification at Etherscan.io on 2019-09-25 */ pragma solidity 0.5.17; /* ___________________________________________________________________ _ _ ______ | | / / / --|-/|-/-----__---/----__----__---_--_----__-------/-------__------ |/ |/ /___) / / ' / ) / / ) /___) / / ) __/__|____(___ _/___(___ _(___/_/_/__/_(___ _____/______(___/__o_o_ ███████╗███╗░░░███╗░█████╗░██████╗░██╗░░██╗███████╗████████╗ ██████╗░███████╗██╗░░██╗ ██╔════╝████╗░████║██╔══██╗██╔══██╗██║░██╔╝██╔════╝╚══██╔══╝ ██╔══██╗██╔════╝╚██╗██╔╝ █████╗░░██╔████╔██║███████║██████╔╝█████═╝░█████╗░░░░░██║░░░ ██║░░██║█████╗░░░╚███╔╝░ ██╔══╝░░██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗░██╔══╝░░░░░██║░░░ ██║░░██║██╔══╝░░░██╔██╗░ ███████╗██║░╚═╝░██║██║░░██║██║░░██║██║░╚██╗███████╗░░░██║░░░ ██████╔╝███████╗██╔╝╚██╗ ╚══════╝╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚══════╝░░░╚═╝░░░ ╚═════╝░╚══════╝╚═╝░░╚═╝ ------------------------------------------------------------------------------------------------------ Copyright 2019 eMarket DEX https://eMarket.io Contract designed with ❤ by EtherAuthority ( https://EtherAuthority.io ) ------------------------------------------------------------------------------------------------------ */ //******************************************************************* //------------------------ SafeMath Library ------------------------- //******************************************************************* library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: 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; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } //*******************************************************************// //------------------ Contract to Manage Ownership -------------------// //*******************************************************************// contract owned { address payable public owner; address payable public newOwner; event OwnershipTransferred(uint256 curTime, address indexed _from, address indexed _to); constructor() public { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function onlyOwnerTransferOwnership(address payable _newOwner) public onlyOwner { newOwner = _newOwner; } //this flow is to prevent transferring ownership to wrong wallet by mistake function acceptOwnership() public { require(msg.sender == newOwner); emit OwnershipTransferred(now, owner, newOwner); owner = newOwner; newOwner = address(0); } } interface ERC20Essential { function transfer(address _to, uint256 _amount) external returns (bool); function transferFrom(address _from, address _to, uint256 _amount) external returns (bool); } interface ERC865Essential { function transferPreSigned(address _from, address _to,uint256 _value,uint256 _fee,uint256 _nonce,uint8 v,bytes32 r,bytes32 s) external returns(bool); function withdrawPreSigned(address _from, address _to,uint256 _value,uint256 _fee,uint256 _nonce,uint8 v,bytes32 r,bytes32 s) external returns(bool); } contract eMarketDex is owned { using SafeMath for uint256; bool public safeGuard; // To hault all non owner functions in case of imergency - by default false address public admin; //the admin address address public feeAccount; //the account that will receive fees uint public tradingFee = 50; // 50 = 0.5% mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether) mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature) mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled) event Order(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user); event Cancel(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s); event Trade(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give, uint256 orderBookID); event Deposit(uint256 curTime, address token, address user, uint amount, uint balance); event Withdraw(uint256 curTime, address token, address user, uint amount, uint balance); event OwnerWithdrawTradingFee(address indexed ownerAddress, uint256 amount); constructor() public { feeAccount = msg.sender; } //Calculate percent and return result function calculatePercentage(uint256 PercentOf, uint256 percentTo ) internal pure returns (uint256) { uint256 factor = 10000; require(percentTo <= factor); uint256 c = PercentOf.mul(percentTo).div(factor); return c; } // contract without fallback automatically reject incoming ether // function() external { } function changeFeeAccount(address feeAccount_) public onlyOwner { feeAccount = feeAccount_; } function changetradingFee(uint tradingFee_) public onlyOwner{ //require(tradingFee_ <= tradingFee); tradingFee = tradingFee_; } function availableTradingFeeOwner() public view returns(uint256){ //it only holds ether as fee return tokens[address(0)][feeAccount]; } function withdrawTradingFeeOwner() public onlyOwner returns (string memory){ uint256 amount = availableTradingFeeOwner(); require (amount > 0, 'Nothing to withdraw'); tokens[address(0)][feeAccount] = 0; msg.sender.transfer(amount); emit OwnerWithdrawTradingFee(owner, amount); } function deposit() public payable { tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender].add(msg.value); emit Deposit(now, address(0), msg.sender, msg.value, tokens[address(0)][msg.sender]); } function withdraw(uint amount) public { require(!safeGuard,"System Paused by Admin"); require(tokens[address(0)][msg.sender] >= amount); tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender].sub(amount); msg.sender.transfer(amount); emit Withdraw(now, address(0), msg.sender, amount, tokens[address(0)][msg.sender]); } function depositToken(address token, uint amount) public { //remember to call Token(address).approve(this, amount) or this contract will not be able to do the transfer on your behalf. require(token!=address(0)); require(ERC20Essential(token).transferFrom(msg.sender, address(this), amount)); tokens[token][msg.sender] = tokens[token][msg.sender].add(amount); emit Deposit(now, token, msg.sender, amount, tokens[token][msg.sender]); } function withdrawToken(address token, uint amount) public { require(!safeGuard,"System Paused by Admin"); require(token!=address(0)); require(tokens[token][msg.sender] >= amount); tokens[token][msg.sender] = tokens[token][msg.sender].sub(amount); ERC20Essential(token).transfer(msg.sender, amount); emit Withdraw(now, token, msg.sender, amount, tokens[token][msg.sender]); } function balanceOf(address token, address user) public view returns (uint) { return tokens[token][user]; } function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) public { bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); orders[msg.sender][hash] = true; emit Order(now, tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender); } function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, uint256 orderBookID) public { require(!safeGuard,"System Paused by Admin"); //amount is in amountGet terms bytes32 hash = keccak256(abi.encodePacked(address(this), tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); require(( (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) && block.number <= expires && orderFills[user][hash].add(amount) <= amountGet ),"Invalid"); splitTrade(tokenGet, amountGet, tokenGive, amountGive, user, amount, orderBookID); orderFills[user][hash] = orderFills[user][hash].add(amount); } function splitTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint256 orderBookID) internal { tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount); emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender, orderBookID); } function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) internal { uint tradingFeeXfer = calculatePercentage(amount,tradingFee); tokens[tokenGet][msg.sender] = tokens[tokenGet][msg.sender].sub(amount.add(tradingFeeXfer)); tokens[tokenGet][user] = tokens[tokenGet][user].add(amount.sub(tradingFeeXfer)); tokens[address(0)][feeAccount] = tokens[address(0)][feeAccount].add(tradingFeeXfer); tokens[tokenGive][user] = tokens[tokenGive][user].sub(amountGive.mul(amount) / amountGet); tokens[tokenGive][msg.sender] = tokens[tokenGive][msg.sender].add(amountGive.mul(amount) / amountGet); } function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) public view returns(bool) { if (!( tokens[tokenGet][sender] >= amount && availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount )) return false; return true; } function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) public view returns(uint) { bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); uint available1; if (!( (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) && block.number <= expires )) return 0; available1 = tokens[tokenGive][user].mul(amountGet) / amountGive; if (amountGet.sub(orderFills[user][hash])<available1) return amountGet.sub(orderFills[user][hash]); return available1; } function amountFilled(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user) public view returns(uint) { bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); return orderFills[user][hash]; } function cancelOrder(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) public { require(!safeGuard,"System Paused by Admin"); bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); require((orders[msg.sender][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == msg.sender)); orderFills[msg.sender][hash] = amountGet; emit Cancel(now, tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender, v, r, s); } /****************************************/ /* Custom Code for the ERC865 TOKEN */ /****************************************/ /* Nonces of transfers performed */ mapping(bytes32 => bool) transactionHashes; function transferFromPreSigned( address token, address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce, uint8 v, bytes32 r, bytes32 s ) public returns (bool) { require(_to != address(0)); bytes32 hashedTx = keccak256(abi.encodePacked('transferFromPreSigned', address(this), _from, _to, _value, _fee, _nonce)); require(transactionHashes[hashedTx] == false, 'transaction hash is already used'); address spender = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s); require(spender != address(0), 'Invalid _from address'); require(ERC20Essential(token).transferFrom(_from, _to, _value),"transferfrom fail"); require(ERC20Essential(token).transferFrom(spender, msg.sender, _fee),"transfer from fee fail"); transactionHashes[hashedTx] = true; return true; } function transferPreSigned( address token, address _from, address _to, uint256 _value, uint256 _fee, uint256 _nonce, uint8 v, bytes32 r, bytes32 s ) public returns (bool) { require(_to != address(0)); bytes32 hashedTx = keccak256(abi.encodePacked('transferFromPreSigned', address(this), _to, _value, _fee, _nonce)); require(transactionHashes[hashedTx] == false, 'transaction hash is already used'); address spender = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s); require(spender != address(0), 'Invalid _from address'); require(_from==spender); require(ERC20Essential(token).transfer(_to, _value.sub(_fee)),"transferfrom fail"); require(ERC20Essential(token).transfer( msg.sender, _fee),"transfer from fee fail"); transactionHashes[hashedTx] = true; return true; } function testSender( address _to, uint256 _value, uint256 _fee, uint256 _nonce, uint8 v, bytes32 r, bytes32 s ) public view returns (address) { bytes32 hashedTx = keccak256(abi.encodePacked(address(this), _to, _value, _fee, _nonce)); return ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s); } /********************************/ /* Code for helper functions */ /********************************/ //Just in case, owner wants to transfer Ether from contract to owner address function manualWithdrawEther()onlyOwner public{ address(owner).transfer(address(this).balance); } //Just in case, owner wants to transfer Tokens from contract to owner address //tokenAmount must be in WEI function manualWithdrawTokens(address token, uint256 tokenAmount)onlyOwner public{ ERC20Essential(token).transfer(msg.sender, tokenAmount); } //selfdestruct function. just in case owner decided to destruct this contract. function destructContract()onlyOwner public{ selfdestruct(owner); } /** * Change safeguard status on or off * * When safeguard is true, then all the non-owner functions will stop working. * When safeguard is false, then all the functions will resume working back again! */ function changeSafeguardStatus() onlyOwner public{ if (safeGuard == false){ safeGuard = true; } else{ safeGuard = false; } } // function getpreSignHash(string memory _messg, address currentcon, address _to, uint _amount, uint fee, uint _nonce)public view returns (bytes32) // { // return keccak256(abi.encodePacked(_messg,currentcon,_to,_amount,fee,_nonce)); // } // function transferfromPresignedhash(string memory _messg,address _from, address currentcon, address _to, uint _amount, uint fee, uint _nonce)public view returns (bytes32) // { // return keccak256(abi.encodePacked(_messg,currentcon,_from, _to,_amount,fee,_nonce)); // } // function getpreSignTradeHash(address tokenGet,uint amountGet,address tokenGive,uint amountGive,uint expires,uint nonce, address _from)public view returns (bytes32) // { // return keccak256(abi.encodePacked(_from, tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); // } function preSignDeposit(address token, uint amount,uint8 v,bytes32 r,bytes32 s, address _from, uint _fee,uint _nonce) public { require(token!=address(0)); require(ERC865Essential(token).transferPreSigned(_from, address(this), amount, _fee, _nonce, v, r, s)); //require(ERC20Essential(token).transfer(msg.sender, _fee)); tokens[token][_from] = tokens[token][_from].add(amount).sub(_fee); emit Deposit(now, token, _from, amount, tokens[token][_from]); } function preSignWithdraw(address token,address _to, uint amount,uint fee,uint8 v,bytes32 r,bytes32 s,uint _nonce ) public returns(bool){ require(!safeGuard,"System Paused by Admin"); require(token!=address(0)); require(tokens[token][_to] >= amount); require(ERC865Essential(token).withdrawPreSigned(address(this),_to, amount, fee, _nonce, v, r, s)); tokens[token][_to] = tokens[token][_to].sub(amount).sub(fee); emit Withdraw(now, token, _to, amount, tokens[token][_to]); return true; } function presigntrade(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, uint _fee, uint256 orderBookID) public { require(!safeGuard,"System Paused by Admin"); //amount is in amountGet terms bytes32 hash = keccak256(abi.encodePacked(address(this), tokenGet, amountGet, tokenGive, amountGive, expires, nonce)); require(orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user,"invvalid"); require(block.number <= expires,"Block Expired"); require(orderFills[user][hash].add(amount) <= amountGet,"invalid amount"); splitPresignTrade(_from,tokenGet, amountGet, tokenGive, amountGive, user, amount, _fee, orderBookID); orderFills[user][hash] = orderFills[user][hash].add(amount); //emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, _from); } function splitPresignTrade(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint _fee, uint256 orderBookID) internal { presigntradeBalances(_from,tokenGet, amountGet, tokenGive, amountGive, user, amount, _fee); emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, _from, orderBookID); } function presigntradeBalances(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint _fee) internal { uint tradingFeeXfer = calculatePercentage(amount,tradingFee); tokens[tokenGet][_from] = tokens[tokenGet][_from].sub(amount.add(tradingFeeXfer)); tokens[tokenGet][user] = tokens[tokenGet][user].add(amount.sub(tradingFeeXfer)); tokens[address(0)][feeAccount] = tokens[address(0)][feeAccount].add(tradingFeeXfer); tokens[tokenGive][user] = tokens[tokenGive][user].sub(amountGive.mul(amount) / amountGet); tokens[tokenGive][_from] = tokens[tokenGive][_from].add(amountGive.mul(amount) / amountGet).sub(_fee); tokens[tokenGive][msg.sender] = tokens[tokenGive][msg.sender].add(_fee); } }
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"v","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"r","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"Cancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Order","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerWithdrawTradingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"address","name":"get","type":"address"},{"indexed":false,"internalType":"address","name":"give","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"amountFilled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"availableTradingFeeOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"availableVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"feeAccount_","type":"address"}],"name":"changeFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"changeSafeguardStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tradingFee_","type":"uint256"}],"name":"changetradingFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destructContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"manualWithdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualWithdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"onlyOwnerTransferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"order","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orderFills","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"preSignDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"preSignWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"presigntrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"safeGuard","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"testSender","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"testTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"trade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferFromPreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferPreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawTradingFeeOwner","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052603260045534801561001557600080fd5b5060008054336001600160a01b0319918216811783556003805490921617905561354b90819061004590396000f3fe60806040526004361061020e5760003560e01c806379279fd111610118578063d0e30db0116100a0578063f7888aec1161006f578063f7888aec14610996578063f851a440146109d1578063f95b1325146109e6578063f96b05d614610a70578063fb6e155f14610aca5761020e565b8063d0e30db0146108a1578063d4ee1d90146108a9578063eb3941cc146108be578063eba3477a1461092a5761020e565b80639e281a98116100e75780639e281a9814610754578063bb5f46291461078d578063c4042133146107c6578063c5d9a28f14610859578063cc9c18071461088c5761020e565b806379279fd11461070057806379ba5097146107155780638da5cb5b1461072a5780639499e0181461073f5761020e565b80634bec83351161019b5780635954c8c51161016a5780635954c8c51461058357806362bbb2081461059857806365e17c9d146106195780636c86888b1461064a57806371ffcb16146106cd5761020e565b80634bec8335146104a5578063508493bc146104ba57806356f43352146104f5578063590bab2e1461050a5761020e565b806319774d43116101e257806319774d4314610330578063278b8c0e1461037b5780632d804ca2146103e55780632e1a7d4d14610442578063338b5dea1461046c5761020e565b8062649cb61461021357806303d196371461027a57806304e4c741146102a45780630b927666146102dd575b600080fd5b34801561021f57600080fd5b50610278600480360361010081101561023757600080fd5b506001600160a01b03813581169160208101359160ff6040830135169160608101359160808201359160a08101359091169060c08101359060e00135610b3d565b005b34801561028657600080fd5b506102786004803603602081101561029d57600080fd5b5035610ccf565b3480156102b057600080fd5b50610278600480360360408110156102c757600080fd5b506001600160a01b038135169060200135610ceb565b3480156102e957600080fd5b50610278600480360360c081101561030057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060808101359060a00135610d81565b34801561033c57600080fd5b506103696004803603604081101561035357600080fd5b506001600160a01b038135169060200135610e87565b60408051918252519081900360200190f35b34801561038757600080fd5b50610278600480360361012081101561039f57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ea4565b3480156103f157600080fd5b50610369600480360360e081101561040857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c090910135166110da565b34801561044e57600080fd5b506102786004803603602081101561046557600080fd5b503561116b565b34801561047857600080fd5b506102786004803603604081101561048f57600080fd5b506001600160a01b0381351690602001356112cb565b3480156104b157600080fd5b50610278611416565b3480156104c657600080fd5b50610369600480360360408110156104dd57600080fd5b506001600160a01b0381358116916020013516611466565b34801561050157600080fd5b50610369611483565b34801561051657600080fd5b5061056f600480360361010081101561052e57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c08101359060e00135611489565b604080519115158252519081900360200190f35b34801561058f57600080fd5b50610278611696565b3480156105a457600080fd5b5061027860048036036101808110156105bc57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c0820135169060ff60e0820135169061010081013590610120810135906101408101359061016001356116ea565b34801561062557600080fd5b5061062e6119c7565b604080516001600160a01b039092168252519081900360200190f35b34801561065657600080fd5b5061056f600480360361018081101561066e57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c082013581169160ff60e082013516916101008201359161012081013591610140820135916101600135166119d6565b3480156106d957600080fd5b50610278600480360360208110156106f057600080fd5b50356001600160a01b0316611a3e565b34801561070c57600080fd5b5061056f611a77565b34801561072157600080fd5b50610278611a87565b34801561073657600080fd5b5061062e611b0f565b34801561074b57600080fd5b50610278611b1e565b34801561076057600080fd5b506102786004803603604081101561077757600080fd5b506001600160a01b038135169060200135611b43565b34801561079957600080fd5b5061056f600480360360408110156107b057600080fd5b506001600160a01b038135169060200135611d16565b3480156107d257600080fd5b5061027860048036036101c08110156107ea57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013582169160808201359160a08101359160c08201359160e08101359091169060ff6101008201351690610120810135906101408101359061016081013590610180810135906101a00135611d36565b34801561086557600080fd5b506102786004803603602081101561087c57600080fd5b50356001600160a01b031661208b565b34801561089857600080fd5b506103696120c4565b6102786120ef565b3480156108b557600080fd5b5061062e61218d565b3480156108ca57600080fd5b5061056f60048036036101208110156108e257600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561219c565b34801561093657600080fd5b5061056f600480360361012081101561094e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135612549565b3480156109a257600080fd5b50610369600480360360408110156109b957600080fd5b506001600160a01b0381358116916020013516612871565b3480156109dd57600080fd5b5061062e61289e565b3480156109f257600080fd5b506109fb6128ad565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a35578181015183820152602001610a1d565b50505050905090810190601f168015610a625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a7c57600080fd5b5061062e600480360360e0811015610a9357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c001356129b9565b348015610ad657600080fd5b506103696004803603610140811015610aee57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c0820135169060ff60e08201351690610100810135906101200135612ab5565b6001600160a01b038816610b5057600080fd5b6040805163747cab3360e11b81526001600160a01b038581166004830152306024830152604482018a9052606482018590526084820184905260ff891660a483015260c4820188905260e482018790529151918a169163e8f9566691610104808201926020929091908290030181600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b505050506040513d6020811015610bf957600080fd5b5051610c0457600080fd5b6001600160a01b03808916600090815260056020908152604080832093871683529290522054610c4c908390610c40908a63ffffffff612ce616565b9063ffffffff612d4716565b6001600160a01b0389811660008181526005602090815260408083209489168084529482529182902085905581514281529081019290925281810192909252606081018a90526080810192909252517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a15050505050505050565b6000546001600160a01b03163314610ce657600080fd5b600455565b6000546001600160a01b03163314610d0257600080fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b158015610d5157600080fd5b505af1158015610d65573d6000803e3d6000fd5b505050506040513d6020811015610d7b57600080fd5b50505050565b6040805130606090811b6020808401919091526001600160601b03198a831b81166034850152604884018a90529188901b9091166068830152607c8201869052609c820185905260bc8083018590528351808403909101815260dc83018085528151918301919091203360008181526006855286812083825290945292859020805460ff19166001179055429091526001600160a01b03808b1660fc85015261011c84018a9052881661013c84015261015c830187905261017c830186905261019c83018590526101bc83019190915291517f5d4e2e93cb30c11a5ef49975ca501a4adc79af355f3ae0ad88d0c4d27a27a6a9918190036101dc0190a150505050505050565b600760209081526000928352604080842090915290825290205481565b600154600160a01b900460ff1615610ef1576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6040805130606090811b6020808401919091526001600160601b03198d831b81166034850152604884018d9052918b901b9091166068830152607c8201899052609c820188905260bc8083018890528351808403909101815260dc9092018352815191810191909120336000908152600683528381208282529092529190205460ff168061101f575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8716609c83015260bc820186905260dc82018590529151339260019260fc80820193601f1981019281900390910190855afa15801561100a573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b61102857600080fd5b3360008181526007602090815260408083208584528252918290208c905581514281526001600160a01b038e8116928201929092528083018d9052908b166060820152608081018a905260a0810189905260c0810188905260e081019290925260ff861661010083015261012082018590526101408201849052517fc46ed0e85bc35bcaec73fbbd1bc0bce5d9eef397e24db51ae1bffd9ed238a7c3918190036101600190a150505050505050505050565b6040805130606090811b6020808401919091526001600160601b03198b831b81166034850152604884018b90529189901b9091166068830152607c8201879052609c820186905260bc8083018690528351808403909101815260dc90920183528151918101919091206001600160a01b03841660009081526007835283812091815291522054979650505050505050565b600154600160a01b900460ff16156111b8576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b3360009081526000805160206134d783398151915260205260409020548111156111e157600080fd5b3360009081526000805160206134d7833981519152602052604090205461120e908263ffffffff612d4716565b3360008181526000805160206134d78339815191526020526040808220939093559151909183156108fc02918491818181858888f19350505050158015611259573d6000803e3d6000fd5b503360008181526000805160206134d783398151915260209081526040808320548151428152928301939093528181019390935260608101849052608081019190915290517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a150565b6001600160a01b0382166112de57600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b505050506040513d602081101561135d57600080fd5b505161136857600080fd5b6001600160a01b038216600090815260056020908152604080832033845290915290205461139c908263ffffffff612ce616565b6001600160a01b0383166000818152600560209081526040808320338085529083529281902085905580514281529182019390935280830191909152606081018490526080810192909252517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a15050565b6000546001600160a01b0316331461142d57600080fd5b600154600160a01b900460ff16611456576001805460ff60a01b1916600160a01b179055611464565b6001805460ff60a01b191690555b565b600560209081526000928352604080842090915290825290205481565b60045481565b600154600090600160a01b900460ff16156114d9576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6001600160a01b0389166114ec57600080fd5b6001600160a01b03808a166000908152600560209081526040808320938c168352929052205487111561151e57600080fd5b6040805163ac19767d60e01b81523060048201526001600160a01b038a81166024830152604482018a9052606482018990526084820185905260ff881660a483015260c4820187905260e482018690529151918b169163ac19767d91610104808201926020929091908290030181600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505050506040513d60208110156115c757600080fd5b50516115d257600080fd5b6001600160a01b03808a166000908152600560209081526040808320938c168352929052205461160e908790610c40908a63ffffffff612d4716565b6001600160a01b038a81166000818152600560209081526040808320948e168084529482529182902085905581514281529081019290925281810192909252606081018a90526080810192909252517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a150600198975050505050505050565b6000546001600160a01b031633146116ad57600080fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156116e7573d6000803e3d6000fd5b50565b600154600160a01b900460ff1615611737576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6000308d8d8d8d8d8d60405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b8152601401868152602001856001600160a01b03166001600160a01b031660601b815260140184815260200183815260200182815260200197505050505050505060405160208183030381529060405280519060200120905060066000886001600160a01b03166001600160a01b03168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16806118c9575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8916609c83015260bc820188905260dc820187905291516001600160a01b038a169260019260fc80820193601f1981019281900390910190855afa1580156118b4573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b80156118d55750884311155b801561191557506001600160a01b03871660009081526007602090815260408083208484529091529020548c90611912908563ffffffff612ce616565b11155b611950576040805162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b604482015290519081900360640190fd5b61195f8d8d8d8d8b8888612da4565b6001600160a01b0387166000908152600760209081526040808320848452909152902054611993908463ffffffff612ce616565b6001600160a01b03909716600090815260076020908152604080832093835292905220959095555050505050505050505050565b6003546001600160a01b031681565b6001600160a01b03808d1660009081526005602090815260408083209385168352929052908120548311801590611a1e575082611a1b8e8e8e8e8e8e8e8e8e8e612ab5565b10155b611a2a57506000611a2e565b5060015b9c9b505050505050505050505050565b6000546001600160a01b03163314611a5557600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff1681565b6001546001600160a01b03163314611a9e57600080fd5b6001546000546040805142815290516001600160a01b039384169392909216917f16b85f49bf01212961345d3016c9a531894accf62eb7680f2045d79185cc0ec09181900360200190a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b6000546001600160a01b03163314611b3557600080fd5b6000546001600160a01b0316ff5b600154600160a01b900460ff1615611b90576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6001600160a01b038216611ba357600080fd5b6001600160a01b0382166000908152600560209081526040808320338452909152902054811115611bd357600080fd5b6001600160a01b0382166000908152600560209081526040808320338452909152902054611c07908263ffffffff612d4716565b6001600160a01b03831660008181526005602090815260408083203380855290835281842095909555805163a9059cbb60e01b815260048101959095526024850186905251929363a9059cbb9360448083019491928390030190829087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d6020811015611c9c57600080fd5b50506001600160a01b038216600081815260056020908152604080832033808552908352928190205481514281529283019490945281810192909252606081018490526080810192909252517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a15050565b600660209081526000928352604080842090915290825290205460ff1681565b600154600160a01b900460ff1615611d83576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6000308e8e8e8e8e8e60405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b8152601401868152602001856001600160a01b03166001600160a01b031660601b815260140184815260200183815260200182815260200197505050505050505060405160208183030381529060405280519060200120905060066000896001600160a01b03166001600160a01b03168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1680611f15575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8a16609c83015260bc820189905260dc820188905291516001600160a01b038b169260019260fc80820193601f1981019281900390910190855afa158015611f00573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b611f51576040805162461bcd60e51b81526020600482015260086024820152671a5b9d9d985b1a5960c21b604482015290519081900360640190fd5b89431115611f96576040805162461bcd60e51b815260206004820152600d60248201526c109b1bd8dac8115e1c1a5c9959609a1b604482015290519081900360640190fd5b6001600160a01b03881660009081526007602090815260408083208484529091529020548d90611fcc908663ffffffff612ce616565b1115612010576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6120218f8f8f8f8f8d8a8a8a612e38565b6001600160a01b0388166000908152600760209081526040808320848452909152902054612055908563ffffffff612ce616565b6001600160a01b039098166000908152600760209081526040808320938352929052209690965550505050505050505050505050565b6000546001600160a01b031633146120a257600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031660009081526000805160206134d7833981519152602052604090205490565b3360009081526000805160206134d7833981519152602052604090205461211c903463ffffffff612ce616565b3360008181526000805160206134d78339815191526020908152604080832085905580514281529182019290925280820192909252346060830152608082019290925290517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a1565b6001546001600160a01b031681565b60006001600160a01b0388166121b157600080fd5b60408051741d1c985b9cd9995c919c9bdb541c9954da59db9959605a1b60208083019190915230606090811b60358401526001600160601b03198d821b81166049850152908c901b16605d830152607182018a90526091820189905260b18083018990528351808403909101815260d19092018352815191810191909120600081815260089092529190205460ff1615612292576040805162461bcd60e51b815260206004820181905260248201527f7472616e73616374696f6e206861736820697320616c72656164792075736564604482015290519081900360640190fd5b60408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c8301808552815191830191909120600091829052607c84018086525260ff8916609c84015260bc830188905260dc8301879052925160019260fc8082019392601f1981019281900390910190855afa158015612322573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612382576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964205f66726f6d206164647265737360581b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038d811660048301528c81166024830152604482018c90529151918e16916323b872dd916064808201926020929091908290030181600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b505050506040513d602081101561240757600080fd5b505161244e576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c999c9bdb4819985a5b607a1b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038381166004830152336024830152604482018b90529151918e16916323b872dd916064808201926020929091908290030181600087803b1580156124a757600080fd5b505af11580156124bb573d6000803e3d6000fd5b505050506040513d60208110156124d157600080fd5b505161251d576040805162461bcd60e51b81526020600482015260166024820152751d1c985b9cd9995c88199c9bdb481999594819985a5b60521b604482015290519081900360640190fd5b506000908152600860205260409020805460ff1916600190811790915590509998505050505050505050565b60006001600160a01b03881661255e57600080fd5b60408051741d1c985b9cd9995c919c9bdb541c9954da59db9959605a1b60208083019190915230606090811b60358401528b901b6001600160601b0319166049830152605d82018a9052607d8201899052609d8083018990528351808403909101815260bd9092018352815191810191909120600081815260089092529190205460ff1615612634576040805162461bcd60e51b815260206004820181905260248201527f7472616e73616374696f6e206861736820697320616c72656164792075736564604482015290519081900360640190fd5b60408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c8301808552815191830191909120600091829052607c84018086525260ff8916609c84015260bc830188905260dc8301879052925160019260fc8082019392601f1981019281900390910190855afa1580156126c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612724576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964205f66726f6d206164647265737360581b604482015290519081900360640190fd5b806001600160a01b03168b6001600160a01b03161461274257600080fd5b6001600160a01b038c1663a9059cbb8b6127628c8c63ffffffff612d4716565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b505050506040513d60208110156127db57600080fd5b5051612822576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c999c9bdb4819985a5b607a1b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018a905290516001600160a01b038e169163a9059cbb9160448083019260209291908290030181600087803b1580156124a757600080fd5b6001600160a01b038083166000908152600560209081526040808320938516835292905220545b92915050565b6002546001600160a01b031681565b6000546060906001600160a01b031633146128c757600080fd5b60006128d16120c4565b90506000811161291e576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b6003546001600160a01b031660009081526000805160206134d7833981519152602052604080822082905551339183156108fc02918491818181858888f19350505050158015612972573d6000803e3d6000fd5b506000546040805183815290516001600160a01b03909216917fad8a10b8218c5c9db36608f71b7288c2041ebaee2aa86d946d6ea50c047558369181900360200190a25090565b6040805130606090811b602080840191909152908a901b6001600160601b0319166034830152604882018990526068820188905260888083018890528351808403909101815260a88301845280519082012060008051602061349683398151915260c884015260e480840182905284518085039091018152610104840180865281519184019190912060009182905261012485018087525260ff881661014485015261016484018790526101848401869052935190926001926101a4808301939192601f198301929081900390910190855afa158015612a9d573d6000803e3d6000fd5b5050604051601f1901519a9950505050505050505050565b6040805130606090811b6020808401919091526001600160601b03198e831b81166034850152604884018e9052918c901b9091166068830152607c82018a9052609c820189905260bc8083018990528351808403909101815260dc90920183528151918101919091206001600160a01b03871660009081526006835283812082825290925291812054909190829060ff1680612bfa575060408051600080516020613496833981519152602080830191909152603c80830186905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8916609c83015260bc820188905260dc820187905291516001600160a01b038a169260019260fc80820193601f1981019281900390910190855afa158015612be5573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b8015612c065750884311155b612c1557600092505050612cd8565b6001600160a01b03808c166000908152600560209081526040808320938b16835292905220548a90612c4d908e63ffffffff612ed216565b81612c5457fe5b6001600160a01b038916600090815260076020908152604080832087845290915290205491900491508190612c90908e9063ffffffff612d4716565b1015612cd4576001600160a01b0387166000908152600760209081526040808320858452909152902054612ccb908d9063ffffffff612d4716565b92505050612cd8565b9150505b9a9950505050505050505050565b600082820183811015612d40576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082821115612d9e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612db2878787878787612f2b565b7f35cc15ad16b95a9d45fadedd6ecbbd89858ec4bfedf144506f3f531d3eb63509428884888a878a0281612de257fe5b604080519687526001600160a01b0395861660208801528681019490945291841660608601529004608084015290861660a08301523360c083015260e0820184905251908190036101000190a150505050505050565b612e488989898989898989613157565b7f35cc15ad16b95a9d45fadedd6ecbbd89858ec4bfedf144506f3f531d3eb63509428985898b888b0281612e7857fe5b604080519687526001600160a01b0395861660208801528681019490945291841660608601529004608084015281881660a0840152908c1660c083015260e0820184905251908190036101000190a1505050505050505050565b600082612ee157506000612898565b82820282848281612eee57fe5b0414612d405760405162461bcd60e51b81526004018080602001828103825260218152602001806134b66021913960400191505060405180910390fd5b6000612f39826004546133ee565b9050612f7e612f4e838363ffffffff612ce616565b6001600160a01b03891660009081526005602090815260408083203384529091529020549063ffffffff612d4716565b6001600160a01b0388166000908152600560209081526040808320338452909152902055612fe7612fb5838363ffffffff612d4716565b6001600160a01b03808a166000908152600560209081526040808320938916835292905220549063ffffffff612ce616565b6001600160a01b038089166000908152600560209081526040808320888516845282528083209490945560035490921681526000805160206134d7833981519152909152205461303d908263ffffffff612ce616565b6003546001600160a01b031660009081526000805160206134d783398151915260205260409020556130b486613079868563ffffffff612ed216565b8161308057fe5b6001600160a01b038089166000908152600560209081526040808320938a168352929052205491900463ffffffff612d4716565b6001600160a01b03808716600090815260056020908152604080832093881683529290522055613127866130ee868563ffffffff612ed216565b816130f557fe5b6001600160a01b038816600090815260056020908152604080832033845290915290205491900463ffffffff612ce616565b6001600160a01b039095166000908152600560209081526040808320338452909152902094909455505050505050565b6000613165836004546133ee565b90506131ac61317a848363ffffffff612ce616565b6001600160a01b03808b166000908152600560209081526040808320938f16835292905220549063ffffffff612d4716565b6001600160a01b03808a166000908152600560209081526040808320938e16835292905220556132176131e5848363ffffffff612d4716565b6001600160a01b03808b166000908152600560209081526040808320938a16835292905220549063ffffffff612ce616565b6001600160a01b03808a166000908152600560209081526040808320898516845282528083209490945560035490921681526000805160206134d7833981519152909152205461326d908263ffffffff612ce616565b6003546001600160a01b031660009081526000805160206134d783398151915260205260409020556132e4876132a9878663ffffffff612ed216565b816132b057fe5b6001600160a01b03808a166000908152600560209081526040808320938b168352929052205491900463ffffffff612d4716565b6001600160a01b0380881660009081526005602090815260408083209389168352929052205561338182610c4089613322898863ffffffff612ed216565b8161332957fe5b04600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002054612ce690919063ffffffff16565b6001600160a01b038781166000908152600560209081526040808320938e168352929052818120929092553382529020546133bc9083612ce6565b6001600160a01b0390961660009081526005602090815260408083203384529091529020959095555050505050505050565b60006127108083111561340057600080fd5b600061342282613416878763ffffffff612ed216565b9063ffffffff61342b16565b95945050505050565b6000808211613481576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161348c57fe5b0494935050505056fe19457468657265756d205369676e6564204d6573736167653a0a333200000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7705b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc53797374656d205061757365642062792041646d696e00000000000000000000a265627a7a72315820a304766cfcc4ae47de04b84a6415dc7e606fb546004ad599cb0d5d784217b66e64736f6c63430005110032
Deployed ByteCode Sourcemap
7620:17089:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:513;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21376:513:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21376:513:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9812:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9812:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9812:140:0;;:::i;19700:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19700:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19700:155:0;;;;;;;;:::i;12058:371::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12058:371:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12058:371:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8287:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8287:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8287:64:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15835:624;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15835:624:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15835:624:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15514:315::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15514:315:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15514:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10696:356::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10696:356:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10696:356:0;;:::i;11058:461::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11058:461:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11058:461:0;;;;;;;;:::i;20284:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20284:195:0;;;:::i;7948:60::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7948:60:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7948:60:0;;;;;;;;;;:::i;7899:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7899:27:0;;;:::i;21905:561::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21905:561:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21905:561:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19460:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19460:111:0;;;:::i;12435:826::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12435:826:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12435:826:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7832:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7832:25:0;;;:::i;:::-;;;;-1:-1:-1;;;;;7832:25:0;;;;;;;;;;;;;;14333:432;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14333:432:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14333:432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9705:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9705:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9705:101:0;-1:-1:-1;;;;;9705:101:0;;:::i;7685:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7685:21:0;;;:::i;6851:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6851:201:0;;;:::i;6316:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6316:28:0;;;:::i;19951:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19951:81:0;;;:::i;11526:406::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11526:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11526:406:0;;;;;;;;:::i;8095:60::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8095:60:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8095:60:0;;;;;;;;:::i;22476:997::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22476:997:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;22476:997:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6643:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6643:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6643:119:0;-1:-1:-1;;;;;6643:119:0;;:::i;9960:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9960:152:0;;;:::i;10474:216::-;;;:::i;6351:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6351:31:0;;;:::i;16714:1006::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16714:1006:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;16714:1006:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17732:1016::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17732:1016:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;17732:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11938:114::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11938:114:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11938:114:0;;;;;;;;;;:::i;7787:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7787:20:0;;;:::i;10120:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10120:348:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10120:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18775:459;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18775:459:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;18775:459:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14771:737::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14771:737:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14771:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21376:513::-;-1:-1:-1;;;;;21530:17:0;;21522:26;;;;;;21567:93;;;-1:-1:-1;;;21567:93:0;;-1:-1:-1;;;;;21567:93:0;;;;;;;21623:4;21567:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;:93;;;;;;;;;;;;;;;-1:-1:-1;21567:40:0;:93;;;5:2:-1;;;;30:1;27;20:12;5:2;21567:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21567:93:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21567:93:0;21559:102;;;;;;-1:-1:-1;;;;;21765:13:0;;;;;;;:6;:13;;;;;;;;:20;;;;;;;;;;:42;;21802:4;;21765:32;;21790:6;21765:32;:24;:32;:::i;:::-;:36;:42;:36;:42;:::i;:::-;-1:-1:-1;;;;;21742:13:0;;;;;;;:6;:13;;;;;;;;:20;;;;;;;;;;;;;:65;;;21823:56;;21831:3;21823:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:513;;;;;;;;:::o;9812:140::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;9922:10;:24;9812:140::o;19700:155::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;19792:55;;;-1:-1:-1;;;19792:55:0;;19823:10;19792:55;;;;;;;;;;;;-1:-1:-1;;;;;19792:30:0;;;;;:55;;;;;;;;;;;;;;-1:-1:-1;19792:30:0;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;19792:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19792:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;19700:155:0:o;12058:371::-;12208:82;;;12225:4;12208:82;;;;;;;;;;;;-1:-1:-1;;;;;;12208:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12208:82:0;;;;;;12198:93;;;;;;;;;12305:10;12183:12;12298:18;;;:6;:18;;;;;:24;;;;;;;;;;:31;;-1:-1:-1;;12298:31:0;12325:4;12298:31;;;12347:3;12341:82;;;-1:-1:-1;;;;;12208:82:0;;;12341;;;;;;;;;;12208;;12341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12058:371;;;;;;;:::o;8287:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;15835:624::-;16006:9;;-1:-1:-1;;;16006:9:0;;;;16005:10;15997:44;;;;;-1:-1:-1;;;15997:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15997:44:0;;;;;;;;;;;;;;;16073:82;;;16090:4;16073:82;;;;;;;;;;;;-1:-1:-1;;;;;;16073:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16073:82:0;;;;;;16063:93;;;;;;;;;16179:10;16048:12;16172:18;;;:6;:18;;;;;:24;;;;;;;;;;;;;:128;;-1:-1:-1;16220:58:0;;;-1:-1:-1;;;;;;;;;;;16220:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16220:58:0;;;;;;16210:69;;;;;;;;;-1:-1:-1;16200:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16290:10;;16200:86;;;;;;;-1:-1:-1;;16200:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16200:86:0;;;;;;;;-1:-1:-1;;;;;16200:100:0;;16172:128;16163:139;;;;;;16320:10;16309:22;;;;:10;:22;;;;;;;;:28;;;;;;;;;:40;;;16361:92;;16368:3;16361:92;;-1:-1:-1;;;;;16361:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15835:624;;;;;;;;;;:::o;15514:315::-;15704:82;;;15721:4;15704:82;;;;;;;;;;;;-1:-1:-1;;;;;;15704:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15704:82:0;;;;;;15694:93;;;;;;;;;-1:-1:-1;;;;;15801:16:0;;15666:4;15801:16;;;:10;:16;;;;;:22;;;;;;;15514:315;;;;;;;;;:::o;10696:356::-;10750:9;;-1:-1:-1;;;10750:9:0;;;;10749:10;10741:44;;;;;-1:-1:-1;;;10741:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10741:44:0;;;;;;;;;;;;;;;10819:10;10800:18;:30;;;-1:-1:-1;;;;;;;;;;;10800:18:0;:30;:18;:30;;;:40;-1:-1:-1;10800:40:0;10792:49;;;;;;10900:10;10881:18;:30;;;-1:-1:-1;;;;;;;;;;;10881:18:0;:30;:18;:30;;;:42;;10916:6;10881:42;:34;:42;:::i;:::-;10867:10;10848:18;:30;;;-1:-1:-1;;;;;;;;;;;10848:18:0;:30;:18;:30;;;:75;;;;10930:27;;10867:10;;10930:27;;;;;10950:6;;10930:27;10848:18;10930:27;10950:6;10867:10;10930:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;10995:10:0;10991:1;11015:30;;;-1:-1:-1;;;;;;;;;;;11015:18:0;:30;;;:18;:30;;;;10969:77;;10978:3;10969:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10696:356;:::o;11058:461::-;-1:-1:-1;;;;;11260:17:0;;11252:26;;;;;;11293:69;;;-1:-1:-1;;;11293:69:0;;11328:10;11293:69;;;;11348:4;11293:69;;;;;;;;;;;;-1:-1:-1;;;;;11293:34:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;11293:34:0;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;11293:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11293:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11293:69:0;11285:78;;;;;;-1:-1:-1;;;;;11398:13:0;;;;;;:6;:13;;;;;;;;11412:10;11398:25;;;;;;;;:37;;11428:6;11398:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;11370:13:0;;;;;;:6;:13;;;;;;;;11384:10;11370:25;;;;;;;;;;:65;;;11447:66;;11455:3;11447:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11058:461;;:::o;20284:195::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;20348:9;;-1:-1:-1;;;20348:9:0;;;;20344:128;;20394:4;20382:16;;-1:-1:-1;;;;20382:16:0;-1:-1:-1;;;20382:16:0;;;20344:128;;;20439:9;:17;;-1:-1:-1;;;;20439:17:0;;;20344:128;20284:195::o;7948:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7899:27::-;;;;:::o;21905:561::-;22071:9;;22036:4;;-1:-1:-1;;;22071:9:0;;;;22070:10;22062:44;;;;;-1:-1:-1;;;22062:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22062:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22125:17:0;;22117:26;;;;;;-1:-1:-1;;;;;22162:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;:28;-1:-1:-1;22162:28:0;22154:37;;;;;;22207:89;;;-1:-1:-1;;;22207:89:0;;22256:4;22207:89;;;;-1:-1:-1;;;;;22207:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;:89;;;;;;;;;;;;;;;-1:-1:-1;22207:40:0;:89;;;5:2:-1;;;;30:1;27;20:12;5:2;22207:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22207:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22207:89:0;22199:98;;;;;;-1:-1:-1;;;;;22326:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;:39;;22361:3;;22326:30;;22349:6;22326:30;:22;:30;:::i;:39::-;-1:-1:-1;;;;;22305:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;;;;:60;;;22381:53;;22390:3;22381:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22452:4:0;21905:561;;;;;;;;;;:::o;19460:111::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;19525:5;;;19517:46;;-1:-1:-1;;;;;19525:5:0;;;;19541:21;19517:46;;;;;19541:21;;19517:46;19525:5;19517:46;19541:21;19525:5;19517:46;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19517:46:0;19460:111::o;12435:826::-;12648:9;;-1:-1:-1;;;12648:9:0;;;;12647:10;12639:44;;;;;-1:-1:-1;;;12639:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12639:44:0;;;;;;;;;;;;;;;12726:12;12776:4;12783:8;12793:9;12804;12815:10;12827:7;12836:5;12751:91;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12751:91:0;;;12741:102;;;;;;12726:117;;12868:6;:12;12875:4;-1:-1:-1;;;;;12868:12:0;-1:-1:-1;;;;;12868:12:0;;;;;;;;;;;;:18;12881:4;12868:18;;;;;;;;;;;;;;;;;;;;;:116;;;-1:-1:-1;12910:58:0;;;-1:-1:-1;;;;;;;;;;;12910:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12910:58:0;;;;;;12900:69;;;;;;;;;-1:-1:-1;12890:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12890:94:0;;;:86;;;;;;;-1:-1:-1;;12890:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12890:86:0;;;;;;;;-1:-1:-1;;;;;12890:94:0;;12868:116;12867:152;;;;;13012:7;12996:12;:23;;12867:152;:210;;;;-1:-1:-1;;;;;;13030:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;13068:9;;13030:34;;13057:6;13030:34;:26;:34;:::i;:::-;:47;;12867:210;12850:245;;;;;-1:-1:-1;;;12850:245:0;;;;;;;;;;;;-1:-1:-1;;;12850:245:0;;;;;;;;;;;;;;;13102:81;13113:8;13123:9;13134;13145:10;13157:4;13163:6;13171:11;13102:10;:81::i;:::-;-1:-1:-1;;;;;13215:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;:34;;13242:6;13215:34;:26;:34;:::i;:::-;-1:-1:-1;;;;;13190:16:0;;;;;;;:10;:16;;;;;;;;:22;;;;;;;:59;;;;-1:-1:-1;;;;;;;;;;;12435:826:0:o;7832:25::-;;;-1:-1:-1;;;;;7832:25:0;;:::o;14333:432::-;-1:-1:-1;;;;;14575:16:0;;;14542:4;14575:16;;;:6;:16;;;;;;;;:24;;;;;;;;;;;;:34;-1:-1:-1;14575:34:0;;;:145;;;14714:6;14620:90;14636:8;14646:9;14657;14668:10;14680:7;14689:5;14696:4;14702:1;14705;14708;14620:15;:90::i;:::-;:100;;14575:145;14561:180;;-1:-1:-1;14736:5:0;14729:12;;14561:180;-1:-1:-1;14755:4:0;14333:432;;;;;;;;;;;;;;;:::o;9705:101::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;9776:10;:24;;-1:-1:-1;;;;;;9776:24:0;-1:-1:-1;;;;;9776:24:0;;;;;;;;;;9705:101::o;7685:21::-;;;-1:-1:-1;;;7685:21:0;;;;;:::o;6851:201::-;6918:8;;-1:-1:-1;;;;;6918:8:0;6904:10;:22;6896:31;;;;;;6976:8;;;6969:5;6943:42;;;6964:3;6943:42;;;;-1:-1:-1;;;;;6976:8:0;;;;6969:5;;;;;6943:42;;;;;;;;;7004:8;;;;6996:16;;-1:-1:-1;;;;;;6996:16:0;;;-1:-1:-1;;;;;7004:8:0;;6996:16;;;;7023:21;;;6851:201::o;6316:28::-;;;-1:-1:-1;;;;;6316:28:0;;:::o;19951:81::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;20018:5;;-1:-1:-1;;;;;20018:5:0;20005:19;11526:406;11600:9;;-1:-1:-1;;;11600:9:0;;;;11599:10;11591:44;;;;;-1:-1:-1;;;11591:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11591:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11650:17:0;;11642:26;;;;;;-1:-1:-1;;;;;11683:13:0;;;;;;:6;:13;;;;;;;;11697:10;11683:25;;;;;;;;:35;-1:-1:-1;11683:35:0;11675:44;;;;;;-1:-1:-1;;;;;11754:13:0;;;;;;:6;:13;;;;;;;;11768:10;11754:25;;;;;;;;:37;;11784:6;11754:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;11726:13:0;;;;;;:6;:13;;;;;;;;11740:10;11726:25;;;;;;;;;:65;;;;11797:50;;-1:-1:-1;;;11797:50:0;;;;;;;;;;;;;;;;11726:13;;11797:30;;:50;;;;;;;;;;;;;;11726:13;11797:50;;;5:2:-1;;;;30:1;27;20:12;5:2;11797:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11797:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;11900:13:0;;;;;;:6;11797:50;11900:13;;;;;;;11880:10;11900:25;;;;;;;;;;;11859:67;;11868:3;11859:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11526:406;;:::o;8095:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22476:997::-;22722:9;;-1:-1:-1;;;22722:9:0;;;;22721:10;22713:44;;;;;-1:-1:-1;;;22713:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22713:44:0;;;;;;;;;;;;;;;22800:12;22850:4;22857:8;22867:9;22878;22889:10;22901:7;22910:5;22825:91;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22825:91:0;;;22815:102;;;;;;22800:117;;22932:6;:12;22939:4;-1:-1:-1;;;;;22932:12:0;-1:-1:-1;;;;;22932:12:0;;;;;;;;;;;;:18;22945:4;22932:18;;;;;;;;;;;;;;;;;;;;;:116;;;-1:-1:-1;22974:58:0;;;-1:-1:-1;;;;;;;;;;;22974:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22974:58:0;;;;;;22964:69;;;;;;;;;-1:-1:-1;22954:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22954:94:0;;;:86;;;;;;;-1:-1:-1;;22954:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22954:86:0;;;;;;;;-1:-1:-1;;;;;22954:94:0;;22932:116;22924:136;;;;;-1:-1:-1;;;22924:136:0;;;;;;;;;;;;-1:-1:-1;;;22924:136:0;;;;;;;;;;;;;;;23091:7;23075:12;:23;;23067:48;;;;;-1:-1:-1;;;23067:48:0;;;;;;;;;;;;-1:-1:-1;;;23067:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23130:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;23168:9;;23130:34;;23157:6;23130:34;:26;:34;:::i;:::-;:47;;23122:73;;;;;-1:-1:-1;;;23122:73:0;;;;;;;;;;;;-1:-1:-1;;;23122:73:0;;;;;;;;;;;;;;;23202:100;23220:5;23226:8;23236:9;23247;23258:10;23270:4;23276:6;23284:4;23290:11;23202:17;:100::i;:::-;-1:-1:-1;;;;;23334:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;:34;;23361:6;23334:34;:26;:34;:::i;:::-;-1:-1:-1;;;;;23309:16:0;;;;;;;:10;:16;;;;;;;;:22;;;;;;;:59;;;;-1:-1:-1;;;;;;;;;;;;;22476:997:0:o;6643:119::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;6734:8;:20;;-1:-1:-1;;;;;;6734:20:0;-1:-1:-1;;;;;6734:20:0;;;;;;;;;;6643:119::o;9960:152::-;10095:10;;-1:-1:-1;;;;;10095:10:0;10016:7;10076:30;;;-1:-1:-1;;;;;;;;;;;10076:18:0;:30;:18;:30;;;9960:152;:::o;10474:216::-;10567:10;10548:18;:30;;;-1:-1:-1;;;;;;;;;;;10548:18:0;:30;:18;:30;;;:45;;10583:9;10548:45;:34;:45;:::i;:::-;10534:10;10515:18;:30;;;-1:-1:-1;;;;;;;;;;;10515:18:0;:30;;;:18;:30;;;:78;;;10605:79;;10613:3;10605:79;;;;;;;;;;;;;;;;10642:9;10605:79;;;;;;;;;;;;;;;;;;;;;;10474:216::o;6351:31::-;;;-1:-1:-1;;;;;6351:31:0;;:::o;16714:1006::-;16989:4;-1:-1:-1;;;;;17019:17:0;;17011:26;;;;;;17077:90;;;-1:-1:-1;;;17077:90:0;;;;;;;;17127:4;17077:90;;;;;;;;-1:-1:-1;;;;;;17077:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17077:90:0;;;;;;17067:101;;;;;;;;;17048:16;17187:27;;;:17;:27;;;;;;;;;:36;17179:81;;;;;-1:-1:-1;;;17179:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17309:62;;;-1:-1:-1;;;;;;;;;;;17309:62:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17309:62:0;;;;;;17299:73;;;;;;;;;17271:15;17289:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17309:62;-1:-1:-1;;17289:90:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;17289:90:0;;-1:-1:-1;;17289:90:0;;;-1:-1:-1;;;;;;;17398:21:0;;17390:55;;;;;-1:-1:-1;;;17390:55:0;;;;;;;;;;;;-1:-1:-1;;;17390:55:0;;;;;;;;;;;;;;;17464:54;;;-1:-1:-1;;;17464:54:0;;-1:-1:-1;;;;;17464:54:0;;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;17464:34:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;17464:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17464:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17464:54:0;17456:83;;;;;-1:-1:-1;;;17456:83:0;;;;;;;;;;;;-1:-1:-1;;;17456:83:0;;;;;;;;;;;;;;;17558:61;;;-1:-1:-1;;;17558:61:0;;-1:-1:-1;;;;;17558:61:0;;;;;;;17602:10;17558:61;;;;;;;;;;;;:34;;;;;;:61;;;;;;;;;;;;;;;-1:-1:-1;17558:34:0;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;17558:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17558:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17558:61:0;17550:95;;;;;-1:-1:-1;;;17550:95:0;;;;;;;;;;;;-1:-1:-1;;;17550:95:0;;;;;;;;;;;;;;;-1:-1:-1;17656:27:0;;;;:17;:27;;;;;:34;;-1:-1:-1;;17656:34:0;17686:4;17656:34;;;;;;17686:4;-1:-1:-1;16714:1006:0;;;;;;;;;;;:::o;17732:1016::-;18003:4;-1:-1:-1;;;;;18033:17:0;;18025:26;;;;;;18091:83;;;-1:-1:-1;;;18091:83:0;;;;;;;;18141:4;18091:83;;;;;;;;;;;-1:-1:-1;;;;;;18091:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18091:83:0;;;;;;18081:94;;;;;;;;;-1:-1:-1;18194:27:0;;;:17;:27;;;;;;;;;:36;18186:81;;;;;-1:-1:-1;;;18186:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:62;;;-1:-1:-1;;;;;;;;;;;18316:62:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18316:62:0;;;;;;18306:73;;;;;;;;;18278:15;18296:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:62;-1:-1:-1;;18296:90:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;18296:90:0;;-1:-1:-1;;18296:90:0;;;-1:-1:-1;;;;;;;18405:21:0;;18397:55;;;;;-1:-1:-1;;;18397:55:0;;;;;;;;;;;;-1:-1:-1;;;18397:55:0;;;;;;;;;;;;;;;18478:7;-1:-1:-1;;;;;18471:14:0;:5;-1:-1:-1;;;;;18471:14:0;;18463:23;;;;;;-1:-1:-1;;;;;18505:30:0;;;18536:3;18541:16;:6;18552:4;18541:16;:10;:16;:::i;:::-;18505:53;;;;;;;;;;;;;-1:-1:-1;;;;;18505:53:0;-1:-1:-1;;;;;18505:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18505:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18505:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18505:53:0;18497:82;;;;;-1:-1:-1;;;18497:82:0;;;;;;;;;;;;-1:-1:-1;;;18497:82:0;;;;;;;;;;;;;;;18598:49;;;-1:-1:-1;;;18598:49:0;;18630:10;18598:49;;;;;;;;;;;;-1:-1:-1;;;;;18598:30:0;;;;;:49;;;;;;;;;;;;;;-1:-1:-1;18598:30:0;:49;;;5:2:-1;;;;30:1;27;20:12;11938:114:0;-1:-1:-1;;;;;12027:13:0;;;12007:4;12027:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;11938:114;;;;;:::o;7787:20::-;;;-1:-1:-1;;;;;7787:20:0;;:::o;10120:348::-;6607:5;;10181:13;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;10204:14;10221:26;:24;:26::i;:::-;10204:43;;10274:1;10265:6;:10;10256:43;;;;;-1:-1:-1;;;10256:43:0;;;;;;;;;;;;-1:-1:-1;;;10256:43:0;;;;;;;;;;;;;;;10335:10;;-1:-1:-1;;;;;10335:10:0;10349:1;10316:30;;;-1:-1:-1;;;;;;;;;;;10316:18:0;:30;:18;:30;;;:34;;;10367:27;:10;;:27;;;;;10387:6;;10367:27;10349:1;10367:27;10387:6;10367:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;10440:5:0;;10416:38;;;;;;;;-1:-1:-1;;;;;10440:5:0;;;;10416:38;;;;;;;;;6624:1;10120:348;:::o;18775:459::-;19059:58;;;19084:4;19059:58;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19059:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19059:58:0;;;;;19049:69;;;;;;-1:-1:-1;;;;;;;;;;;19156:62:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19156:62:0;;;;;;19146:73;;;;;;;;;-1:-1:-1;19136:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19049:69;;19136:90;;;;;;;19059:58;;-1:-1:-1;;19136:90:0;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;19136:90:0;;-1:-1:-1;;19136:90:0;;;18775:459;-1:-1:-1;;;;;;;;;;18775:459:0:o;14771:737::-;14995:82;;;15012:4;14995:82;;;;;;;;;;;;-1:-1:-1;;;;;;14995:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14995:82:0;;;;;;14985:93;;;;;;;;;-1:-1:-1;;;;;15122:12:0;;14957:4;15122:12;;;:6;:12;;;;;:18;;;;;;;;;;14957:4;;14985:93;14957:4;;15122:18;;;:116;;-1:-1:-1;15164:58:0;;;-1:-1:-1;;;;;;;;;;;15164:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15164:58:0;;;;;;15154:69;;;;;;;;;-1:-1:-1;15144:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15144:94:0;;;:86;;;;;;;-1:-1:-1;;15144:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15144:86:0;;;;;;;;-1:-1:-1;;;;;15144:94:0;;15122:116;15121:152;;;;;15266:7;15250:12;:23;;15121:152;15107:183;;15289:1;15282:8;;;;;;15107:183;-1:-1:-1;;;;;15310:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;15351:10;;15310:38;;15338:9;15310:38;:27;:38;:::i;:::-;:51;;;;;-1:-1:-1;;;;;15392:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;15310:51;;;;-1:-1:-1;15310:51:0;;15378:37;;:9;;:37;:13;:37;:::i;:::-;:48;15374:98;;;-1:-1:-1;;;;;15449:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;15435:37;;:9;;:37;:13;:37;:::i;:::-;15428:44;;;;;;15374:98;15486:10;-1:-1:-1;;14771:737:0;;;;;;;;;;;;;:::o;3289:181::-;3347:7;3379:5;;;3403:6;;;;3395:46;;;;;-1:-1:-1;;;3395:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3461:1;3289:181;-1:-1:-1;;;3289:181:0:o;3745:184::-;3803:7;3836:1;3831;:6;;3823:49;;;;;-1:-1:-1;;;3823:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3895:5:0;;;3745:184::o;13269:358::-;13433:71;13447:8;13457:9;13468;13479:10;13491:4;13497:6;13433:13;:71::i;:::-;13518:103;13524:3;13529:8;13539:6;13547:9;13580;13571:6;13558:10;:19;:31;;;;;13518:103;;;;;;-1:-1:-1;;;;;13518:103:0;;;;;;;;;;;;;;;;;;;;;13558:31;;13518:103;;;;;;;;;;;13597:10;13518:103;;;;;;;;;;;;;;;;;;;13269:358;;;;;;;:::o;23481:411::-;23677:90;23698:5;23704:8;23714:9;23725;23736:10;23748:4;23754:6;23762:4;23677:20;:90::i;:::-;23781:98;23787:3;23792:8;23802:6;23810:9;23843;23834:6;23821:10;:19;:31;;;;;23781:98;;;;;;-1:-1:-1;;;;;23781:98:0;;;;;;;;;;;;;;;;;;;;;23821:31;;23781:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23481:411;;;;;;;;;:::o;4180:470::-;4238:7;4482:6;4478:47;;-1:-1:-1;4512:1:0;4505:8;;4478:47;4549:5;;;4553:1;4549;:5;:1;4573:5;;;;;:10;4565:56;;;;-1:-1:-1;;;4565:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13637:690;13779:19;13801:38;13821:6;13828:10;;13801:19;:38::i;:::-;13779:60;-1:-1:-1;13879:60:0;13912:26;:6;13779:60;13912:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;13879:16:0;;;;;;:6;:16;;;;;;;;13896:10;13879:28;;;;;;;;;:60;:32;:60;:::i;:::-;-1:-1:-1;;;;;13848:16:0;;;;;;:6;:16;;;;;;;;13865:10;13848:28;;;;;;;:91;13971:54;13998:26;:6;14009:14;13998:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;13971:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;;:54;:26;:54;:::i;:::-;-1:-1:-1;;;;;13946:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;:79;;;;14084:10;;;;;14065:30;;-1:-1:-1;;;;;;;;;;;14065:30:0;;;;;:50;;14100:14;14065:50;:34;:50;:::i;:::-;14051:10;;-1:-1:-1;;;;;14051:10:0;14032:18;:30;;;-1:-1:-1;;;;;;;;;;;14032:18:0;:30;:18;:30;;:83;14150:63;14203:9;14178:22;:10;14193:6;14178:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;14150:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;;14178:34;;14150:63;:27;:63;:::i;:::-;-1:-1:-1;;;;;14124:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;:89;14252:69;14311:9;14286:22;:10;14301:6;14286:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;14252:17:0;;;;;;:6;:17;;;;;;;;14270:10;14252:29;;;;;;;;;14286:34;;14252:69;:33;:69;:::i;:::-;-1:-1:-1;;;;;14220:17:0;;;;;;;:6;:17;;;;;;;;14238:10;14220:29;;;;;;;:101;;;;-1:-1:-1;;;;;;13637:690:0:o;23898:796::-;24073:19;24095:38;24115:6;24122:10;;24095:19;:38::i;:::-;24073:60;-1:-1:-1;24168:55:0;24196:26;:6;24073:60;24196:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;24168:16:0;;;;;;;:6;:16;;;;;;;;:23;;;;;;;;;;;:55;:27;:55;:::i;:::-;-1:-1:-1;;;;;24142:16:0;;;;;;;:6;:16;;;;;;;;:23;;;;;;;;;:81;24255:54;24282:26;:6;24293:14;24282:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;24255:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;;:54;:26;:54;:::i;:::-;-1:-1:-1;;;;;24230:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;:79;;;;24368:10;;;;;24349:30;;-1:-1:-1;;;;;;;;;;;24349:30:0;;;;;:50;;24384:14;24349:50;:34;:50;:::i;:::-;24335:10;;-1:-1:-1;;;;;24335:10:0;24316:18;:30;;;-1:-1:-1;;;;;;;;;;;24316:18:0;:30;:18;:30;;:83;24434:63;24487:9;24462:22;:10;24477:6;24462:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;24434:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;;24462:34;;24434:63;:27;:63;:::i;:::-;-1:-1:-1;;;;;24408:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;:89;24531:74;24600:4;24531:64;24585:9;24560:22;:10;24575:6;24560:22;:14;:22;:::i;:::-;:34;;;;;;24531:6;:17;24538:9;-1:-1:-1;;;;;24531:17:0;-1:-1:-1;;;;;24531:17:0;;;;;;;;;;;;:24;24549:5;-1:-1:-1;;;;;24531:24:0;-1:-1:-1;;;;;24531:24:0;;;;;;;;;;;;;:28;;:64;;;;:::i;:74::-;-1:-1:-1;;;;;24504:17:0;;;;;;;:6;:17;;;;;;;;:24;;;;;;;;;;;:101;;;;24662:10;24644:29;;;;;:39;;24678:4;24644:33;:39::i;:::-;-1:-1:-1;;;;;24612:17:0;;;;;;;:6;:17;;;;;;;;24630:10;24612:29;;;;;;;:71;;;;-1:-1:-1;;;;;;;;23898:796:0:o;9320:264::-;9411:7;9454:5;9478:19;;;;9470:28;;;;;;9509:9;9521:36;9550:6;9521:24;:9;9535;9521:24;:13;:24;:::i;:::-;:28;:36;:28;:36;:::i;:::-;9509:48;9320:264;-1:-1:-1;;;;;9320:264:0:o;5118:333::-;5176:7;5275:1;5271;:5;5263:44;;;;;-1:-1:-1;;;5263:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5318:9;5334:1;5330;:5;;;;;;;5118:333;-1:-1:-1;;;;5118:333:0:o
Swarm Source
bzzr://a304766cfcc4ae47de04b84a6415dc7e606fb546004ad599cb0d5d784217b66e
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.