Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Stablecoin
Overview
Max Total Supply
1,000,249.55162043 SLVT
Holders
248 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Balance
10.75932962 SLVTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SilverToken
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-09-07 */ // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol pragma solidity ^0.4.24; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * See https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting '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; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // File: openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol pragma solidity ^0.4.24; /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) internal balances; uint256 internal totalSupply_; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev Transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol pragma solidity ^0.4.24; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol pragma solidity ^0.4.24; /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://github.com/ethereum/EIPs/issues/20 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance( address _owner, address _spender ) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.4.24; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: contracts/base/MintableToken.sol pragma solidity ^0.4.24; /** * @title Mintable token * @dev Simple ERC20 Token example, with mintable token creation * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol */ contract MintableToken is StandardToken, Ownable { event Mint(address indexed to, uint256 amount); event MintFinished(); bool public mintingFinished = false; modifier canMint() { require(!mintingFinished); _; } modifier hasMintPermission() { require(msg.sender == owner); _; } /** * @dev Function to mint tokens * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function mint( address _to, uint256 _amount ) public hasMintPermission canMint returns (bool) { return _mint(_to, _amount); } /** * @dev Internal Function to mint tokens * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function _mint( address _to, uint256 _amount ) internal returns (bool) { totalSupply_ = totalSupply_.add(_amount); balances[_to] = balances[_to].add(_amount); emit Mint(_to, _amount); emit Transfer(address(0), _to, _amount); return true; } /** * @dev Function to stop minting new tokens. * @return True if the operation was successful. */ function finishMinting() public onlyOwner canMint returns (bool) { mintingFinished = true; emit MintFinished(); return true; } } // File: openzeppelin-solidity/contracts/lifecycle/Destructible.sol pragma solidity ^0.4.24; /** * @title Destructible * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner. */ contract Destructible is Ownable { /** * @dev Transfers the current balance to the owner and terminates the contract. */ function destroy() public onlyOwner { selfdestruct(owner); } function destroyAndSend(address _recipient) public onlyOwner { selfdestruct(_recipient); } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol pragma solidity ^0.4.24; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } // File: openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol pragma solidity ^0.4.24; /** * @title Burnable Token * @dev Token that can be irreversibly burned (destroyed). */ contract BurnableToken is BasicToken { event Burn(address indexed burner, uint256 value); /** * @dev Burns a specific amount of tokens. * @param _value The amount of token to be burned. */ function burn(uint256 _value) public { _burn(msg.sender, _value); } function _burn(address _who, uint256 _value) internal { require(_value <= balances[_who]); // no need to require value <= totalSupply, since that would imply the // sender's balance is greater than the totalSupply, which *should* be an assertion failure balances[_who] = balances[_who].sub(_value); totalSupply_ = totalSupply_.sub(_value); emit Burn(_who, _value); emit Transfer(_who, address(0), _value); } } // File: openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol pragma solidity ^0.4.24; /** * @title DetailedERC20 token * @dev The decimals are only for visualization purposes. * All the operations are done using the smallest and indivisible token unit, * just as on Ethereum all the operations are done in wei. */ contract DetailedERC20 is ERC20 { string public name; string public symbol; uint8 public decimals; constructor(string _name, string _symbol, uint8 _decimals) public { name = _name; symbol = _symbol; decimals = _decimals; } } // File: openzeppelin-solidity/contracts/access/rbac/Roles.sol pragma solidity ^0.4.24; /** * @title Roles * @author Francisco Giordano (@frangio) * @dev Library for managing addresses assigned to a Role. * See RBAC.sol for example usage. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an address access to this role */ function add(Role storage _role, address _addr) internal { _role.bearer[_addr] = true; } /** * @dev remove an address' access to this role */ function remove(Role storage _role, address _addr) internal { _role.bearer[_addr] = false; } /** * @dev check if an address has this role * // reverts */ function check(Role storage _role, address _addr) internal view { require(has(_role, _addr)); } /** * @dev check if an address has this role * @return bool */ function has(Role storage _role, address _addr) internal view returns (bool) { return _role.bearer[_addr]; } } // File: openzeppelin-solidity/contracts/access/rbac/RBAC.sol pragma solidity ^0.4.24; /** * @title RBAC (Role-Based Access Control) * @author Matt Condon (@Shrugs) * @dev Stores and provides setters and getters for roles and addresses. * Supports unlimited numbers of roles and addresses. * See //contracts/mocks/RBACMock.sol for an example of usage. * This RBAC method uses strings to key roles. It may be beneficial * for you to write your own implementation of this interface using Enums or similar. */ contract RBAC { using Roles for Roles.Role; mapping (string => Roles.Role) private roles; event RoleAdded(address indexed operator, string role); event RoleRemoved(address indexed operator, string role); /** * @dev reverts if addr does not have role * @param _operator address * @param _role the name of the role * // reverts */ function checkRole(address _operator, string _role) public view { roles[_role].check(_operator); } /** * @dev determine if addr has role * @param _operator address * @param _role the name of the role * @return bool */ function hasRole(address _operator, string _role) public view returns (bool) { return roles[_role].has(_operator); } /** * @dev add a role to an address * @param _operator address * @param _role the name of the role */ function addRole(address _operator, string _role) internal { roles[_role].add(_operator); emit RoleAdded(_operator, _role); } /** * @dev remove a role from an address * @param _operator address * @param _role the name of the role */ function removeRole(address _operator, string _role) internal { roles[_role].remove(_operator); emit RoleRemoved(_operator, _role); } /** * @dev modifier to scope access to a single role (uses msg.sender as addr) * @param _role the name of the role * // reverts */ modifier onlyRole(string _role) { checkRole(msg.sender, _role); _; } /** * @dev modifier to scope access to a set of roles (uses msg.sender as addr) * @param _roles the names of the roles to scope access to * // reverts * * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this * see: https://github.com/ethereum/solidity/issues/2467 */ // modifier onlyRoles(string[] _roles) { // bool hasAnyRole = false; // for (uint8 i = 0; i < _roles.length; i++) { // if (hasRole(msg.sender, _roles[i])) { // hasAnyRole = true; // break; // } // } // require(hasAnyRole); // _; // } } // File: openzeppelin-solidity/contracts/access/Whitelist.sol pragma solidity ^0.4.24; /** * @title Whitelist * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions. * This simplifies the implementation of "user permissions". */ contract Whitelist is Ownable, RBAC { string public constant ROLE_WHITELISTED = "whitelist"; /** * @dev Throws if operator is not whitelisted. * @param _operator address */ modifier onlyIfWhitelisted(address _operator) { checkRole(_operator, ROLE_WHITELISTED); _; } /** * @dev add an address to the whitelist * @param _operator address * @return true if the address was added to the whitelist, false if the address was already in the whitelist */ function addAddressToWhitelist(address _operator) public onlyOwner { addRole(_operator, ROLE_WHITELISTED); } /** * @dev getter to determine if address is in whitelist */ function whitelist(address _operator) public view returns (bool) { return hasRole(_operator, ROLE_WHITELISTED); } /** * @dev add addresses to the whitelist * @param _operators addresses * @return true if at least one address was added to the whitelist, * false if all addresses were already in the whitelist */ function addAddressesToWhitelist(address[] _operators) public onlyOwner { for (uint256 i = 0; i < _operators.length; i++) { addAddressToWhitelist(_operators[i]); } } /** * @dev remove an address from the whitelist * @param _operator address * @return true if the address was removed from the whitelist, * false if the address wasn't in the whitelist in the first place */ function removeAddressFromWhitelist(address _operator) public onlyOwner { removeRole(_operator, ROLE_WHITELISTED); } /** * @dev remove addresses from the whitelist * @param _operators addresses * @return true if at least one address was removed from the whitelist, * false if all addresses weren't in the whitelist in the first place */ function removeAddressesFromWhitelist(address[] _operators) public onlyOwner { for (uint256 i = 0; i < _operators.length; i++) { removeAddressFromWhitelist(_operators[i]); } } } // File: openzeppelin-solidity/contracts/ECRecovery.sol pragma solidity ^0.4.24; /** * @title Elliptic curve signature operations * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d * TODO Remove this library once solidity supports passing a signature to ecrecover. * See https://github.com/ethereum/solidity/issues/864 */ library ECRecovery { /** * @dev Recover signer address from a message by using their signature * @param _hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param _sig bytes signature, the signature is generated using web3.eth.sign() */ function recover(bytes32 _hash, bytes _sig) internal pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Check the signature length if (_sig.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solium-disable-next-line security/no-inline-assembly assembly { r := mload(add(_sig, 32)) s := mload(add(_sig, 64)) v := byte(0, mload(add(_sig, 96))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } else { // solium-disable-next-line arg-overflow return ecrecover(_hash, v, r, s); } } /** * toEthSignedMessageHash * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:" * and hash the result */ function toEthSignedMessageHash(bytes32 _hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash) ); } } // File: contracts/SilverToken.sol pragma solidity ^0.4.24; interface ASilverDollar { function purchaseWithSilverToken(address, uint256) external returns(bool); } contract SilverToken is Destructible, Pausable, MintableToken, BurnableToken, DetailedERC20("Silvertoken", "SLVT", 8), Whitelist { using SafeMath for uint256; using ECRecovery for bytes32; uint256 public transferFee = 10;//1% uint256 public transferDiscountFee = 8;//0.8% uint256 public redemptionFee = 40;//4% uint256 public convertFee = 10;//1% address public feeReturnAddress = 0xE34f13B2dadC938f44eCbC38A8dBe94B8bdB2109; uint256 public transferFreeAmount; uint256 public transferDiscountAmount; address public silverDollarAddress; address public SLVTReserve = 0x900122447a2Eaeb1655C99A91E20f506D509711B; bool public canPurchase = true; bool public canConvert = true; // Internal features uint256 internal multiplier; uint256 internal percentage = 1000; //ce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f event TokenRedeemed(address from, uint256 amount); //3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617 event TokenPurchased(address addr, uint256 amount, uint256 tokens); //5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52 event FeeApplied(string name, address addr, uint256 amount); event Converted(address indexed sender, uint256 amountSLVT, uint256 amountSLVD, uint256 amountFee); modifier purchasable() { require(canPurchase == true, "can't purchase"); _; } modifier onlySilverDollar() { require(msg.sender == silverDollarAddress, "not silverDollar"); _; } modifier isConvertible() { require(canConvert == true, "SLVT conversion disabled"); _; } constructor () public { multiplier = 10 ** uint256(decimals); transferFreeAmount = 2 * multiplier; transferDiscountAmount = 500 * multiplier; owner = msg.sender; super.mint(msg.sender, 1 * 1000 * 1000 * multiplier); } // Settings begin function setTransferFreeAmount(uint256 value) public onlyOwner { transferFreeAmount = value; } function setTransferDiscountAmount(uint256 value) public onlyOwner { transferDiscountAmount = value; } function setRedemptionFee(uint256 value) public onlyOwner { redemptionFee = value; } function setFeeReturnAddress(address value) public onlyOwner { feeReturnAddress = value; } function setCanPurchase(bool value) public onlyOwner { canPurchase = value; } function setSilverDollarAddress(address value) public onlyOwner { silverDollarAddress = value; } function setCanConvert(bool value) public onlyOwner { canConvert = value; } function setConvertFee(uint256 value) public onlyOwner { convertFee = value; } function increaseTotalSupply(uint256 value) public onlyOwner returns (uint256) { super.mint(owner, value); return totalSupply_; } // Settings end // ERC20 re-implementation methods begin function transfer(address to, uint256 amount) public whenNotPaused returns (bool) { uint256 feesPaid = payFees(address(0), to, amount); require(super.transfer(to, amount.sub(feesPaid)), "failed transfer"); return true; } function transferFrom(address from, address to, uint256 amount) public whenNotPaused returns (bool) { uint256 feesPaid = payFees(from, to, amount); require(super.transferFrom(from, to, amount.sub(feesPaid)), "failed transferFrom"); return true; } // ERC20 re-implementation methods end // Silvertoken methods end function payFees(address from, address to, uint256 amount) private returns (uint256 fees) { if (msg.sender == owner || hasRole(from, ROLE_WHITELISTED) || hasRole(msg.sender, ROLE_WHITELISTED) || hasRole(to, ROLE_WHITELISTED)) return 0; fees = getTransferFee(amount); if (from == address(0)) { require(super.transfer(feeReturnAddress, fees), "transfer fee payment failed"); } else { require(super.transferFrom(from, feeReturnAddress, fees), "transferFrom fee payment failed"); } emit FeeApplied("Transfer", to, fees); } function getTransferFee(uint256 amount) internal view returns(uint256) { if (transferFreeAmount > 0 && amount <= transferFreeAmount) return 0; if (transferDiscountAmount > 0 && amount >= transferDiscountAmount) return amount.mul(transferDiscountFee).div(percentage); return amount.mul(transferFee).div(percentage); } function transferTokens(address from, address to, uint256 amount) internal returns (bool) { require(balances[from] >= amount, "balance insufficient"); balances[from] = balances[from].sub(amount); balances[to] = balances[to].add(amount); emit Transfer(from, to, amount); return true; } function purchase(uint256 tokens, uint256 fee, uint256 timestamp, bytes signature) public payable purchasable whenNotPaused { require( isSignatureValid( msg.sender, msg.value, tokens, fee, timestamp, signature ), "invalid signature" ); require(tokens > 0, "invalid number of tokens"); emit TokenPurchased(msg.sender, msg.value, tokens); transferTokens(owner, msg.sender, tokens); feeReturnAddress.transfer(msg.value); if (fee > 0) { emit FeeApplied("Purchase", msg.sender, fee); } } function purchasedSilverDollar(uint256 amount) public onlySilverDollar purchasable whenNotPaused returns (bool) { require(super._mint(SLVTReserve, amount), "minting of slvT failed"); return true; } function purchaseWithSilverDollar(address to, uint256 amount) public onlySilverDollar purchasable whenNotPaused returns (bool) { require(transferTokens(SLVTReserve, to, amount), "failed transfer of slvT from reserve"); return true; } function redeem(uint256 tokens) public whenNotPaused { require(tokens > 0, "amount of tokens redeemed must be > 0"); uint256 fee = tokens.mul(redemptionFee).div(percentage); _burn(msg.sender, tokens.sub(fee)); if (fee > 0) { require(super.transfer(feeReturnAddress, fee), "token transfer failed"); emit FeeApplied("Redeem", msg.sender, fee); } emit TokenRedeemed(msg.sender, tokens); } function isSignatureValid( address sender, uint256 amount, uint256 tokens, uint256 fee, uint256 timestamp, bytes signature ) public view returns (bool) { if (block.timestamp > timestamp + 10 minutes) return false; bytes32 hash = keccak256( abi.encodePacked( address(this), sender, amount, tokens, fee, timestamp ) ); return hash.toEthSignedMessageHash().recover(signature) == owner; } function isConvertSignatureValid( address sender, uint256 amountSLVT, uint256 amountSLVD, uint256 timestamp, bytes signature ) public view returns (bool) { if (block.timestamp > timestamp + 10 minutes) return false; bytes32 hash = keccak256( abi.encodePacked( address(this), sender, amountSLVT, amountSLVD, timestamp ) ); return hash.toEthSignedMessageHash().recover(signature) == owner; } function convertToSLVD( uint256 amountSLVT, uint256 amountSLVD, uint256 timestamp, bytes signature ) public isConvertible whenNotPaused returns (bool) { require( isConvertSignatureValid( msg.sender, amountSLVT, amountSLVD, timestamp, signature ), "convert failed, invalid signature" ); uint256 fees = amountSLVT.mul(convertFee).div(percentage); if (whitelist(msg.sender) && Whitelist(silverDollarAddress).whitelist(msg.sender)) fees = 0; super.transfer(SLVTReserve, amountSLVT.sub(fees)); require(super.transfer(feeReturnAddress, fees), "transfer fee payment failed"); require( ASilverDollar(silverDollarAddress).purchaseWithSilverToken(msg.sender, amountSLVD), "failed purchase of silverdollar with silvertoken" ); emit Converted(msg.sender, amountSLVD, amountSLVD, fees); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_WHITELISTED","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"increaseTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"hasRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setCanConvert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"convertFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"redemptionFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canConvert","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"address"}],"name":"setFeeReturnAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"silverDollarAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"purchaseWithSilverDollar","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferDiscountFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SLVTReserve","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"purchasedSilverDollar","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"addAddressToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setRedemptionFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setConvertFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setTransferDiscountAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"address"}],"name":"setSilverDollarAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"amountSLVT","type":"uint256"},{"name":"amountSLVD","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"isConvertSignatureValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setTransferFreeAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"amount","type":"uint256"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"isSignatureValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amountSLVT","type":"uint256"},{"name":"amountSLVD","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"convertToSLVD","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeReturnAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferDiscountAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferFreeAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setCanPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"FeeApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amountSLVT","type":"uint256"},{"indexed":false,"name":"amountSLVD","type":"uint256"},{"indexed":false,"name":"amountFee","type":"uint256"}],"name":"Converted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
Contract Creation Code
60806040526000600360146101000a81548160ff0219169083151502179055506000600360156101000a81548160ff021916908315150217905550600a60085560086009556028600a55600a600b5573e34f13b2dadc938f44ecbc38a8dbe94b8bdb2109600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073900122447a2eaeb1655c99a91e20f506d509711b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601060146101000a81548160ff0219169083151502179055506001601060156101000a81548160ff0219169083151502179055506103e86012553480156200014157600080fd5b506040805190810160405280600b81526020017f53696c766572746f6b656e0000000000000000000000000000000000000000008152506040805190810160405280600481526020017f534c565400000000000000000000000000000000000000000000000000000000815250600833600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260049080519060200190620002099291906200052f565b508160059080519060200190620002229291906200052f565b5080600660006101000a81548160ff021916908360ff160217905550505050600660009054906101000a900460ff1660ff16600a0a601181905550601154600202600d819055506011546101f402600e8190555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002de33601154620f424002620002e56401000000000262001b7d176401000000009004565b50620005de565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200034457600080fd5b600360159054906101000a900460ff161515156200036157600080fd5b6200037c838362000384640100000000026401000000009004565b905092915050565b6000620003ab82600154620005126401000000000262005384179091906401000000009004565b60018190555062000412826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620005126401000000000262005384179091906401000000009004565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600081830190508281101515156200052657fe5b80905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057257805160ff1916838001178555620005a3565b82800160010185558215620005a3579182015b82811115620005a257825182559160200191906001019062000585565b5b509050620005b29190620005b6565b5090565b620005db91905b80821115620005d7576000816000905550600101620005bd565b5090565b90565b61562180620005ee6000396000f3006080604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146102b957806306fdde03146102e8578063095ea7b3146103785780630988ca8c146103dd57806318160ddd1461046657806318b919e9146104915780631d43cc9814610521578063217fe6c61461056257806323b872dd1461060357806324953eaa14610688578063286dd3f5146106ee5780632b45bfde146107315780632fd1db2514610760578063313ce5671461078b57806334a6d832146107bc5780633f4ba83a146107eb57806340c10f191461080257806342966c6814610867578063458f5815146108945780634b68bb9a146108bf5780634c474434146108ee57806352ae7cd5146109685780635c975abb146109ab578063611d48f2146109da5780636291556414610a3157806364df1a9314610a965780636618846314610ac157806369ae54fc14610b265780636aca22bf14610b7d57806370a0823114610bc2578063715018a614610c195780637b9417c814610c305780637d64bcb414610c735780637dbc1df014610ca257806383197ef014610ccf5780638456cb5914610ce65780638da5cb5b14610cfd57806390caaeaf14610d545780639121d9b514610d8157806395d89b4114610dae5780639b19251a14610e3e578063a9059cbb14610e99578063acb2ad6f14610efe578063b0a8faaa14610f29578063b60c5b2c14610f6c578063bb1f3e3a1461102b578063bd22250914611058578063c405637a14611121578063c7801cc1146111c0578063d73dd62314611217578063db006a751461127c578063dd62ed3e146112a9578063debe16f914611320578063e1ef1ebe1461134b578063e2ec6ec314611376578063f2fde38b146113dc578063f5074f411461141f578063fa398ddd14611462575b600080fd5b3480156102c557600080fd5b506102ce611491565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd6114a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033d578082015181840152602081019050610322565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506103c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b604051808215151515815260200191505060405180910390f35b3480156103e957600080fd5b50610464600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611634565b005b34801561047257600080fd5b5061047b6116b5565b6040518082815260200191505060405180910390f35b34801561049d57600080fd5b506104a66116bf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104e65780820151818401526020810190506104cb565b50505050905090810190601f1680156105135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052d57600080fd5b5061054c600480360381019080803590602001909291905050506116f8565b6040518082815260200191505060405180910390f35b34801561056e57600080fd5b506105e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061178d565b604051808215151515815260200191505060405180910390f35b34801561060f57600080fd5b5061066e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611814565b604051808215151515815260200191505060405180910390f35b34801561069457600080fd5b506106ec600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192905050506118dd565b005b3480156106fa57600080fd5b5061072f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197a565b005b34801561073d57600080fd5b5061075e600480360381019080803515159060200190929190505050611a18565b005b34801561076c57600080fd5b50610775611a91565b6040518082815260200191505060405180910390f35b34801561079757600080fd5b506107a0611a97565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107c857600080fd5b506107d1611aaa565b604051808215151515815260200191505060405180910390f35b3480156107f757600080fd5b50610800611abd565b005b34801561080e57600080fd5b5061084d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7d565b604051808215151515815260200191505060405180910390f35b34801561087357600080fd5b5061089260048036038101908080359060200190929190505050611c09565b005b3480156108a057600080fd5b506108a9611c16565b6040518082815260200191505060405180910390f35b3480156108cb57600080fd5b506108d4611c1c565b604051808215151515815260200191505060405180910390f35b610966600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611c2f565b005b34801561097457600080fd5b506109a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f8e565b005b3480156109b757600080fd5b506109c061202e565b604051808215151515815260200191505060405180910390f35b3480156109e657600080fd5b506109ef612041565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3d57600080fd5b50610a7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612067565b604051808215151515815260200191505060405180910390f35b348015610aa257600080fd5b50610aab6122a6565b6040518082815260200191505060405180910390f35b348015610acd57600080fd5b50610b0c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ac565b604051808215151515815260200191505060405180910390f35b348015610b3257600080fd5b50610b3b61253e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8957600080fd5b50610ba860048036038101908080359060200190929190505050612564565b604051808215151515815260200191505060405180910390f35b348015610bce57600080fd5b50610c03600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061277b565b6040518082815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e6127c3565b005b348015610c3c57600080fd5b50610c71600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c8565b005b348015610c7f57600080fd5b50610c88612966565b604051808215151515815260200191505060405180910390f35b348015610cae57600080fd5b50610ccd60048036038101908080359060200190929190505050612a2e565b005b348015610cdb57600080fd5b50610ce4612a94565b005b348015610cf257600080fd5b50610cfb612b2b565b005b348015610d0957600080fd5b50610d12612bec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6057600080fd5b50610d7f60048036038101908080359060200190929190505050612c12565b005b348015610d8d57600080fd5b50610dac60048036038101908080359060200190929190505050612c78565b005b348015610dba57600080fd5b50610dc3612cde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e03578082015181840152602081019050610de8565b50505050905090810190601f168015610e305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e4a57600080fd5b50610e7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7c565b604051808215151515815260200191505060405180910390f35b348015610ea557600080fd5b50610ee4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dc4565b604051808215151515815260200191505060405180910390f35b348015610f0a57600080fd5b50610f13612e8c565b6040518082815260200191505060405180910390f35b348015610f3557600080fd5b50610f6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e92565b005b348015610f7857600080fd5b50611011600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f32565b604051808215151515815260200191505060405180910390f35b34801561103757600080fd5b50611056600480360381019080803590602001909291905050506130e4565b005b34801561106457600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061314a565b604051808215151515815260200191505060405180910390f35b34801561112d57600080fd5b506111a6600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613305565b604051808215151515815260200191505060405180910390f35b3480156111cc57600080fd5b506111d5613878565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561122357600080fd5b50611262600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061389e565b604051808215151515815260200191505060405180910390f35b34801561128857600080fd5b506112a760048036038101908080359060200190929190505050613a9a565b005b3480156112b557600080fd5b5061130a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d5a565b6040518082815260200191505060405180910390f35b34801561132c57600080fd5b50611335613de1565b6040518082815260200191505060405180910390f35b34801561135757600080fd5b50611360613de7565b6040518082815260200191505060405180910390f35b34801561138257600080fd5b506113da60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613ded565b005b3480156113e857600080fd5b5061141d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e8a565b005b34801561142b57600080fd5b50611460600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ef2565b005b34801561146e57600080fd5b5061148f600480360381019080803515159060200190929190505050613f67565b005b600360159054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153a5780601f1061150f5761010080835404028352916020019161153a565b820191906000526020600020905b81548152906001019060200180831161151d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6116b1826007836040518082805190602001908083835b602083101515611670578051825260208201915060208101905060208303925061164b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613fe090919063ffffffff16565b5050565b6000600154905090565b6040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561175657600080fd5b611782600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611b7d565b506001549050919050565b600061180c836007846040518082805190602001908083835b6020831015156117cb57805182526020820191506020810190506020830392506117a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613ff990919063ffffffff16565b905092915050565b600080600360149054906101000a900460ff1615151561183357600080fd5b61183e858585614052565b905061185d858561185884876143b890919063ffffffff16565b6143d1565b15156118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6661696c6564207472616e7366657246726f6d0000000000000000000000000081525060200191505060405180910390fd5b60019150509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193b57600080fd5b600090505b815181101561197657611969828281518110151561195a57fe5b9060200190602002015161197a565b8080600101915050611940565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d657600080fd5b611a15816040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061478c565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a7457600080fd5b80601060156101000a81548160ff02191690831515021790555050565b600b5481565b600660009054906101000a900460ff1681565b601060149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1957600080fd5b600360149054906101000a900460ff161515611b3457600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bdb57600080fd5b600360159054906101000a900460ff16151515611bf757600080fd5b611c0183836148c0565b905092915050565b611c133382614a2e565b50565b600a5481565b601060159054906101000a900460ff1681565b60011515601060149054906101000a900460ff161515141515611cba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611cd657600080fd5b611ce433348686868661314a565b1515611d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b600084111515611dd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206e756d626572206f6620746f6b656e73000000000000000081525060200191505060405180910390fd5b7f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617333486604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611e70600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614be1565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ed9573d6000803e3d6000fd5b506000831115611f88577f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338460405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5075726368617365000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fea57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360149054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156121d557600080fd5b612202601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484614be1565b151561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f6661696c6564207472616e73666572206f6620736c76542066726f6d2072657381526020017f657276650000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001905092915050565b60095481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831015156123be576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612452565b6123d183826143b890919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561262b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156126d257600080fd5b6126fe601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836148c0565b1515612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d696e74696e67206f6620736c7654206661696c65640000000000000000000081525060200191505060405180910390fd5b60019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561281f57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b612963816040805190810160405280600981526020017f77686974656c6973740000000000000000000000000000000000000000000000815250614e2f565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129c457600080fd5b600360159054906101000a900460ff161515156129e057600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a8a57600080fd5b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612af057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b8757600080fd5b600360149054906101000a900460ff16151515612ba357600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c6e57600080fd5b80600b8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd457600080fd5b80600e8190555050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d745780601f10612d4957610100808354040283529160200191612d74565b820191906000526020600020905b815481529060010190602001808311612d5757829003601f168201915b505050505081565b6000612dbd826040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b9050919050565b600080600360149054906101000a900460ff16151515612de357600080fd5b612def60008585614052565b9050612e0d84612e0883866143b890919063ffffffff16565b614f63565b1515612e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6661696c6564207472616e73666572000000000000000000000000000000000081525060200191505060405180910390fd5b600191505092915050565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612eee57600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806102588401421115612f4a57600091506130da565b3087878787604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401848152602001838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156130355780518252602082019150602081019050602083039250613010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130c0846130ae8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b5095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314057600080fd5b80600d8190555050565b600080610258840142111561316257600091506132fa565b308888888888604051602001808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156132555780518252602082019150602081019050602083039250613230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132e0846132ce8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b509695505050505050565b60008060011515601060159054906101000a900460ff161515141515613393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f534c565420636f6e76657273696f6e2064697361626c6564000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156133af57600080fd5b6133bc3387878787612f32565b1515613456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f636f6e76657274206661696c65642c20696e76616c6964207369676e6174757281526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61347f601254613471600b548961533690919063ffffffff16565b61536e90919063ffffffff16565b905061348a33612d7c565b801561358a5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b19251a336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b81019080805190602001909291905050505b1561359457600090505b6135d2601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135cd83896143b890919063ffffffff16565b614f63565b506135ff600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa8e518e33876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561373857600080fd5b505af115801561374c573d6000803e3d6000fd5b505050506040513d602081101561376257600080fd5b8101908080519060200190929190505050151561380d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f6661696c6564207075726368617365206f662073696c766572646f6c6c61722081526020017f776974682073696c766572746f6b656e0000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe8e327a81bf019d3af2e7baa0c6f3dcb5231127e9a5f3448d9819d7faef21f9d86878460405180848152602001838152602001828152602001935050505060405180910390a26001915050949350505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061392f82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600360149054906101000a900460ff16151515613ab857600080fd5b600082111515613b56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f616d6f756e74206f6620746f6b656e732072656465656d6564206d757374206281526020017f65203e203000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613b7f601254613b71600a548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050613b9d33613b9883856143b890919063ffffffff16565b614a2e565b6000811115613ceb57613bd2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260068152602001807f52656465656d0000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f3383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b600d5481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e4b57600080fd5b600090505b8151811015613e8657613e798282815181101515613e6a57fe5b906020019060200201516128c8565b8080600101915050613e50565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ee657600080fd5b613eef816153a0565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc357600080fd5b80601060146101000a81548160ff02191690831515021790555050565b613fea8282613ff9565b1515613ff557600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806140eb57506140ea846040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141315750614130336040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141775750614176836040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b1561418557600090506143b1565b61418e8261549c565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561426a576141f1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b61430c565b61429784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836143d1565b151561430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7472616e7366657246726f6d20666565207061796d656e74206661696c65640081525060200191505060405180910390fd5b5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52838260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5472616e73666572000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b9392505050565b60008282111515156143c657fe5b818303905092915050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561442057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144ab57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144e757600080fd5b614538826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145cb826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061469c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614809826007836040518082805190602001908083835b6020831015156147c857805182526020820191506020810190506020830392506147a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061553990919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614882578082015181840152602081019050614867565b50505050905090810190601f1680156148af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60006148d78260015461538490919063ffffffff16565b60018190555061492e826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515614a7b57600080fd5b614acc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b23816001546143b890919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515614c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f62616c616e636520696e73756666696369656e7400000000000000000000000081525060200191505060405180910390fd5b614cea826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d7d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614eac826007836040518082805190602001908083835b602083101515614e6b5780518252602082019150602081019050602083039250614e46565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061559790919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614f25578082015181840152602081019050614f0a565b50505050905090810190601f168015614f525780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fb257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fee57600080fd5b61503f826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561520a57805182526020820191506020810190506020830392506151e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b60008060008060418551141515615258576000935061532d565b6020850151925060408501519150606085015160001a9050601b8160ff16101561528357601b810190505b601b8160ff161415801561529b5750601c8160ff1614155b156152a9576000935061532d565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015615320573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b6000808314156153495760009050615368565b818302905081838281151561535a57fe5b0414151561536457fe5b8090505b92915050565b6000818381151561537b57fe5b04905092915050565b6000818301905082811015151561539757fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153dc57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600d541180156154b15750600d548211155b156154bf5760009050615534565b6000600e541180156154d35750600e548210155b15615508576155016012546154f36009548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050615534565b6155316012546155236008548561533690919063ffffffff16565b61536e90919063ffffffff16565b90505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505600a165627a7a723058202b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc480029
Deployed Bytecode
0x6080604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146102b957806306fdde03146102e8578063095ea7b3146103785780630988ca8c146103dd57806318160ddd1461046657806318b919e9146104915780631d43cc9814610521578063217fe6c61461056257806323b872dd1461060357806324953eaa14610688578063286dd3f5146106ee5780632b45bfde146107315780632fd1db2514610760578063313ce5671461078b57806334a6d832146107bc5780633f4ba83a146107eb57806340c10f191461080257806342966c6814610867578063458f5815146108945780634b68bb9a146108bf5780634c474434146108ee57806352ae7cd5146109685780635c975abb146109ab578063611d48f2146109da5780636291556414610a3157806364df1a9314610a965780636618846314610ac157806369ae54fc14610b265780636aca22bf14610b7d57806370a0823114610bc2578063715018a614610c195780637b9417c814610c305780637d64bcb414610c735780637dbc1df014610ca257806383197ef014610ccf5780638456cb5914610ce65780638da5cb5b14610cfd57806390caaeaf14610d545780639121d9b514610d8157806395d89b4114610dae5780639b19251a14610e3e578063a9059cbb14610e99578063acb2ad6f14610efe578063b0a8faaa14610f29578063b60c5b2c14610f6c578063bb1f3e3a1461102b578063bd22250914611058578063c405637a14611121578063c7801cc1146111c0578063d73dd62314611217578063db006a751461127c578063dd62ed3e146112a9578063debe16f914611320578063e1ef1ebe1461134b578063e2ec6ec314611376578063f2fde38b146113dc578063f5074f411461141f578063fa398ddd14611462575b600080fd5b3480156102c557600080fd5b506102ce611491565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd6114a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033d578082015181840152602081019050610322565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506103c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b604051808215151515815260200191505060405180910390f35b3480156103e957600080fd5b50610464600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611634565b005b34801561047257600080fd5b5061047b6116b5565b6040518082815260200191505060405180910390f35b34801561049d57600080fd5b506104a66116bf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104e65780820151818401526020810190506104cb565b50505050905090810190601f1680156105135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052d57600080fd5b5061054c600480360381019080803590602001909291905050506116f8565b6040518082815260200191505060405180910390f35b34801561056e57600080fd5b506105e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061178d565b604051808215151515815260200191505060405180910390f35b34801561060f57600080fd5b5061066e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611814565b604051808215151515815260200191505060405180910390f35b34801561069457600080fd5b506106ec600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192905050506118dd565b005b3480156106fa57600080fd5b5061072f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197a565b005b34801561073d57600080fd5b5061075e600480360381019080803515159060200190929190505050611a18565b005b34801561076c57600080fd5b50610775611a91565b6040518082815260200191505060405180910390f35b34801561079757600080fd5b506107a0611a97565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107c857600080fd5b506107d1611aaa565b604051808215151515815260200191505060405180910390f35b3480156107f757600080fd5b50610800611abd565b005b34801561080e57600080fd5b5061084d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7d565b604051808215151515815260200191505060405180910390f35b34801561087357600080fd5b5061089260048036038101908080359060200190929190505050611c09565b005b3480156108a057600080fd5b506108a9611c16565b6040518082815260200191505060405180910390f35b3480156108cb57600080fd5b506108d4611c1c565b604051808215151515815260200191505060405180910390f35b610966600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611c2f565b005b34801561097457600080fd5b506109a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f8e565b005b3480156109b757600080fd5b506109c061202e565b604051808215151515815260200191505060405180910390f35b3480156109e657600080fd5b506109ef612041565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3d57600080fd5b50610a7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612067565b604051808215151515815260200191505060405180910390f35b348015610aa257600080fd5b50610aab6122a6565b6040518082815260200191505060405180910390f35b348015610acd57600080fd5b50610b0c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ac565b604051808215151515815260200191505060405180910390f35b348015610b3257600080fd5b50610b3b61253e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8957600080fd5b50610ba860048036038101908080359060200190929190505050612564565b604051808215151515815260200191505060405180910390f35b348015610bce57600080fd5b50610c03600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061277b565b6040518082815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e6127c3565b005b348015610c3c57600080fd5b50610c71600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c8565b005b348015610c7f57600080fd5b50610c88612966565b604051808215151515815260200191505060405180910390f35b348015610cae57600080fd5b50610ccd60048036038101908080359060200190929190505050612a2e565b005b348015610cdb57600080fd5b50610ce4612a94565b005b348015610cf257600080fd5b50610cfb612b2b565b005b348015610d0957600080fd5b50610d12612bec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6057600080fd5b50610d7f60048036038101908080359060200190929190505050612c12565b005b348015610d8d57600080fd5b50610dac60048036038101908080359060200190929190505050612c78565b005b348015610dba57600080fd5b50610dc3612cde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e03578082015181840152602081019050610de8565b50505050905090810190601f168015610e305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e4a57600080fd5b50610e7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7c565b604051808215151515815260200191505060405180910390f35b348015610ea557600080fd5b50610ee4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dc4565b604051808215151515815260200191505060405180910390f35b348015610f0a57600080fd5b50610f13612e8c565b6040518082815260200191505060405180910390f35b348015610f3557600080fd5b50610f6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e92565b005b348015610f7857600080fd5b50611011600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f32565b604051808215151515815260200191505060405180910390f35b34801561103757600080fd5b50611056600480360381019080803590602001909291905050506130e4565b005b34801561106457600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061314a565b604051808215151515815260200191505060405180910390f35b34801561112d57600080fd5b506111a6600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613305565b604051808215151515815260200191505060405180910390f35b3480156111cc57600080fd5b506111d5613878565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561122357600080fd5b50611262600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061389e565b604051808215151515815260200191505060405180910390f35b34801561128857600080fd5b506112a760048036038101908080359060200190929190505050613a9a565b005b3480156112b557600080fd5b5061130a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d5a565b6040518082815260200191505060405180910390f35b34801561132c57600080fd5b50611335613de1565b6040518082815260200191505060405180910390f35b34801561135757600080fd5b50611360613de7565b6040518082815260200191505060405180910390f35b34801561138257600080fd5b506113da60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613ded565b005b3480156113e857600080fd5b5061141d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e8a565b005b34801561142b57600080fd5b50611460600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ef2565b005b34801561146e57600080fd5b5061148f600480360381019080803515159060200190929190505050613f67565b005b600360159054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153a5780601f1061150f5761010080835404028352916020019161153a565b820191906000526020600020905b81548152906001019060200180831161151d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6116b1826007836040518082805190602001908083835b602083101515611670578051825260208201915060208101905060208303925061164b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613fe090919063ffffffff16565b5050565b6000600154905090565b6040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561175657600080fd5b611782600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611b7d565b506001549050919050565b600061180c836007846040518082805190602001908083835b6020831015156117cb57805182526020820191506020810190506020830392506117a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613ff990919063ffffffff16565b905092915050565b600080600360149054906101000a900460ff1615151561183357600080fd5b61183e858585614052565b905061185d858561185884876143b890919063ffffffff16565b6143d1565b15156118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6661696c6564207472616e7366657246726f6d0000000000000000000000000081525060200191505060405180910390fd5b60019150509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193b57600080fd5b600090505b815181101561197657611969828281518110151561195a57fe5b9060200190602002015161197a565b8080600101915050611940565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d657600080fd5b611a15816040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061478c565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a7457600080fd5b80601060156101000a81548160ff02191690831515021790555050565b600b5481565b600660009054906101000a900460ff1681565b601060149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1957600080fd5b600360149054906101000a900460ff161515611b3457600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bdb57600080fd5b600360159054906101000a900460ff16151515611bf757600080fd5b611c0183836148c0565b905092915050565b611c133382614a2e565b50565b600a5481565b601060159054906101000a900460ff1681565b60011515601060149054906101000a900460ff161515141515611cba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611cd657600080fd5b611ce433348686868661314a565b1515611d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b600084111515611dd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206e756d626572206f6620746f6b656e73000000000000000081525060200191505060405180910390fd5b7f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617333486604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611e70600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614be1565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ed9573d6000803e3d6000fd5b506000831115611f88577f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338460405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5075726368617365000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fea57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360149054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156121d557600080fd5b612202601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484614be1565b151561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f6661696c6564207472616e73666572206f6620736c76542066726f6d2072657381526020017f657276650000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001905092915050565b60095481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831015156123be576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612452565b6123d183826143b890919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561262b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156126d257600080fd5b6126fe601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836148c0565b1515612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d696e74696e67206f6620736c7654206661696c65640000000000000000000081525060200191505060405180910390fd5b60019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561281f57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b612963816040805190810160405280600981526020017f77686974656c6973740000000000000000000000000000000000000000000000815250614e2f565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129c457600080fd5b600360159054906101000a900460ff161515156129e057600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a8a57600080fd5b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612af057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b8757600080fd5b600360149054906101000a900460ff16151515612ba357600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c6e57600080fd5b80600b8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd457600080fd5b80600e8190555050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d745780601f10612d4957610100808354040283529160200191612d74565b820191906000526020600020905b815481529060010190602001808311612d5757829003601f168201915b505050505081565b6000612dbd826040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b9050919050565b600080600360149054906101000a900460ff16151515612de357600080fd5b612def60008585614052565b9050612e0d84612e0883866143b890919063ffffffff16565b614f63565b1515612e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6661696c6564207472616e73666572000000000000000000000000000000000081525060200191505060405180910390fd5b600191505092915050565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612eee57600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806102588401421115612f4a57600091506130da565b3087878787604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401848152602001838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156130355780518252602082019150602081019050602083039250613010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130c0846130ae8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b5095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314057600080fd5b80600d8190555050565b600080610258840142111561316257600091506132fa565b308888888888604051602001808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156132555780518252602082019150602081019050602083039250613230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132e0846132ce8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b509695505050505050565b60008060011515601060159054906101000a900460ff161515141515613393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f534c565420636f6e76657273696f6e2064697361626c6564000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156133af57600080fd5b6133bc3387878787612f32565b1515613456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f636f6e76657274206661696c65642c20696e76616c6964207369676e6174757281526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61347f601254613471600b548961533690919063ffffffff16565b61536e90919063ffffffff16565b905061348a33612d7c565b801561358a5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b19251a336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b81019080805190602001909291905050505b1561359457600090505b6135d2601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135cd83896143b890919063ffffffff16565b614f63565b506135ff600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa8e518e33876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561373857600080fd5b505af115801561374c573d6000803e3d6000fd5b505050506040513d602081101561376257600080fd5b8101908080519060200190929190505050151561380d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f6661696c6564207075726368617365206f662073696c766572646f6c6c61722081526020017f776974682073696c766572746f6b656e0000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe8e327a81bf019d3af2e7baa0c6f3dcb5231127e9a5f3448d9819d7faef21f9d86878460405180848152602001838152602001828152602001935050505060405180910390a26001915050949350505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061392f82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600360149054906101000a900460ff16151515613ab857600080fd5b600082111515613b56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f616d6f756e74206f6620746f6b656e732072656465656d6564206d757374206281526020017f65203e203000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613b7f601254613b71600a548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050613b9d33613b9883856143b890919063ffffffff16565b614a2e565b6000811115613ceb57613bd2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260068152602001807f52656465656d0000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f3383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b600d5481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e4b57600080fd5b600090505b8151811015613e8657613e798282815181101515613e6a57fe5b906020019060200201516128c8565b8080600101915050613e50565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ee657600080fd5b613eef816153a0565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc357600080fd5b80601060146101000a81548160ff02191690831515021790555050565b613fea8282613ff9565b1515613ff557600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806140eb57506140ea846040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141315750614130336040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141775750614176836040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b1561418557600090506143b1565b61418e8261549c565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561426a576141f1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b61430c565b61429784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836143d1565b151561430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7472616e7366657246726f6d20666565207061796d656e74206661696c65640081525060200191505060405180910390fd5b5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52838260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5472616e73666572000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b9392505050565b60008282111515156143c657fe5b818303905092915050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561442057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144ab57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144e757600080fd5b614538826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145cb826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061469c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614809826007836040518082805190602001908083835b6020831015156147c857805182526020820191506020810190506020830392506147a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061553990919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614882578082015181840152602081019050614867565b50505050905090810190601f1680156148af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60006148d78260015461538490919063ffffffff16565b60018190555061492e826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515614a7b57600080fd5b614acc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b23816001546143b890919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515614c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f62616c616e636520696e73756666696369656e7400000000000000000000000081525060200191505060405180910390fd5b614cea826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d7d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614eac826007836040518082805190602001908083835b602083101515614e6b5780518252602082019150602081019050602083039250614e46565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061559790919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614f25578082015181840152602081019050614f0a565b50505050905090810190601f168015614f525780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fb257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fee57600080fd5b61503f826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561520a57805182526020820191506020810190506020830392506151e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b60008060008060418551141515615258576000935061532d565b6020850151925060408501519150606085015160001a9050601b8160ff16101561528357601b810190505b601b8160ff161415801561529b5750601c8160ff1614155b156152a9576000935061532d565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015615320573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b6000808314156153495760009050615368565b818302905081838281151561535a57fe5b0414151561536457fe5b8090505b92915050565b6000818381151561537b57fe5b04905092915050565b6000818301905082811015151561539757fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153dc57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600d541180156154b15750600d548211155b156154bf5760009050615534565b6000600e541180156154d35750600e548210155b15615508576155016012546154f36009548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050615534565b6155316012546155236008548561533690919063ffffffff16565b61536e90919063ffffffff16565b90505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505600a165627a7a723058202b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc480029
Deployed Bytecode Sourcemap
23588:8214:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10437:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10437:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14764:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14764:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14764:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5818:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17004:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17004:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2433:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2433:85:0;;;;;;;;;;;;;;;;;;;;;;;19231:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19231:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19231:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26315:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26315:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17271:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26776:266;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26776:266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21088:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21088:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20702:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20702:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26121:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26121:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23919:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23919:30:0;;;;;;;;;;;;;;;;;;;;;;;14812:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14812:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24234:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24234:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13329:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13329:95:0;;;;;;10874:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10874:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13847:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13847:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;23877:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23877:33:0;;;;;;;;;;;;;;;;;;;;;;;24272:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28373:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25820:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25820:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12708:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12708:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24119:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24119:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29178:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29178:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23828:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23828:38:0;;;;;;;;;;;;;;;;;;;;;;;7737:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7737:447:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24158:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24158:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28956:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28956:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3217:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3217:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9301:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9301:114:0;;;;;;19697:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19697:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11712:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11712:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25722:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25722:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;12239:68;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12239:68:0;;;;;;13149:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13149:93:0;;;;;;8506:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8506:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26216:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26216:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;25615:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25615:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;14787:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14787:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14787:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19904:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19904:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26530:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26530:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23788:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23788:31:0;;;;;;;;;;;;;;;;;;;;;;;26017:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26017:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30375:491;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30375:491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25512:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25512:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;29874:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29874:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30872:927;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30872:927:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23958:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23958:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6962:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6962:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29432:436;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29432:436:0;;;;;;;;;;;;;;;;;;;;;;;;;;6337:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6337:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24077:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24077:37:0;;;;;;;;;;;;;;;;;;;;;;;24039:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24039:33:0;;;;;;;;;;;;;;;;;;;;;;;20269:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20269:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9583:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9583:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12313:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12313:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25921:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25921:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10437:35;;;;;;;;;;;;;:::o;14764:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5818:192::-;5885:4;5930:6;5898:7;:19;5906:10;5898:19;;;;;;;;;;;;;;;:29;5918:8;5898:29;;;;;;;;;;;;;;;:38;;;;5969:8;5948:38;;5957:10;5948:38;;;5979:6;5948:38;;;;;;;;;;;;;;;;;;6000:4;5993:11;;5818:192;;;;:::o;17004:119::-;17088:29;17107:9;17088:5;17094;17088:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17088:12:0;;;;;;;;;;;;;;;;;;;;;:18;;:29;;;;:::i;:::-;17004:119;;:::o;2433:85::-;2477:7;2500:12;;2493:19;;2433:85;:::o;19231:53::-;;;;;;;;;;;;;;;;;;;;:::o;26315:142::-;26385:7;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26401:24;26412:5;;;;;;;;;;;26419;26401:10;:24::i;:::-;;26439:12;;26432:19;;26315:142;;;:::o;17271:::-;17357:4;17380:27;17397:9;17380:5;17386;17380:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17380:12:0;;;;;;;;;;;;;;;;;;;;;:16;;:27;;;;:::i;:::-;17373:34;;17271:142;;;;:::o;26776:266::-;26870:4;26883:16;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;26902:25;26910:4;26916:2;26920:6;26902:7;:25::i;:::-;26883:44;;26942:50;26961:4;26967:2;26971:20;26982:8;26971:6;:10;;:20;;;;:::i;:::-;26942:18;:50::i;:::-;26934:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27032:4;27025:11;;26776:266;;;;;;:::o;21088:208::-;21190:9;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;21202:1;21190:13;;21185:106;21209:10;:17;21205:1;:21;21185:106;;;21242:41;21269:10;21280:1;21269:13;;;;;;;;;;;;;;;;;;21242:26;:41::i;:::-;21228:3;;;;;;;21185:106;;;21088:208;;:::o;20702:137::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;20794:39;20805:9;20816:16;;;;;;;;;;;;;;;;;;20794:10;:39::i;:::-;20702:137;:::o;26121:91::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26204:5;26191:10;;:18;;;;;;;;;;;;;;;;;;26121:91;:::o;23919:30::-;;;;:::o;14812:21::-;;;;;;;;;;;;;:::o;24234:33::-;;;;;;;;;;;;;:::o;13329:95::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;13044:6;;;;;;;;;;;13036:15;;;;;;;;13392:5;13383:6;;:14;;;;;;;;;;;;;;;;;;13409:9;;;;;;;;;;13329:95::o;10874:169::-;10995:4;10610:5;;;;;;;;;;;10596:19;;:10;:19;;;10588:28;;;;;;;;10516:15;;;;;;;;;;;10515:16;10507:25;;;;;;;;11018:19;11024:3;11029:7;11018:5;:19::i;:::-;11011:26;;10874:169;;;;:::o;13847:75::-;13891:25;13897:10;13909:6;13891:5;:25::i;:::-;13847:75;:::o;23877:33::-;;;;:::o;24272:32::-;;;;;;;;;;;;;:::o;28373:577::-;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;28520:92;28547:10;28559:9;28570:6;28578:3;28583:9;28594;28520:16;:92::i;:::-;28504:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28671:1;28662:6;:10;28654:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28719:45;28734:10;28746:9;28757:6;28719:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:41;28786:5;;;;;;;;;;;28793:10;28805:6;28771:14;:41::i;:::-;;28821:16;;;;;;;;;;;:25;;:36;28847:9;28821:36;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28821:36:0;28874:1;28868:3;:7;28864:74;;;28891:39;28914:10;28926:3;28891:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28864:74;28373:577;;;;:::o;25820:97::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25909:5;25890:16;;:24;;;;;;;;;;;;;;;;;;25820:97;:::o;12708:26::-;;;;;;;;;;;;;:::o;24119:34::-;;;;;;;;;;;;;:::o;29178:248::-;29299:4;25067:19;;;;;;;;;;;25053:33;;:10;:33;;;25045:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29320:39;29335:11;;;;;;;;;;;29348:2;29352:6;29320:14;:39::i;:::-;29312:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29416:4;29409:11;;29178:248;;;;:::o;23828:38::-;;;;:::o;7737:447::-;7848:4;7864:16;7883:7;:19;7891:10;7883:19;;;;;;;;;;;;;;;:29;7903:8;7883:29;;;;;;;;;;;;;;;;7864:48;;7943:8;7923:16;:28;;7919:169;;;7994:1;7962:7;:19;7970:10;7962:19;;;;;;;;;;;;;;;:29;7982:8;7962:29;;;;;;;;;;;;;;;:33;;;;7919:169;;;8050:30;8063:16;8050:8;:12;;:30;;;;:::i;:::-;8018:7;:19;8026:10;8018:19;;;;;;;;;;;;;;;:29;8038:8;8018:29;;;;;;;;;;;;;;;:62;;;;7919:169;8120:8;8099:61;;8108:10;8099:61;;;8130:7;:19;8138:10;8130:19;;;;;;;;;;;;;;;:29;8150:8;8130:29;;;;;;;;;;;;;;;;8099:61;;;;;;;;;;;;;;;;;;8174:4;8167:11;;7737:447;;;;;:::o;24158:71::-;;;;;;;;;;;;;:::o;28956:216::-;29062:4;25067:19;;;;;;;;;;;25053:33;;:10;:33;;;25045:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29083:32;29095:11;;;;;;;;;;;29108:6;29083:11;:32::i;:::-;29075:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29162:4;29155:11;;28956:216;;;:::o;3217:101::-;3273:7;3296:8;:16;3305:6;3296:16;;;;;;;;;;;;;;;;3289:23;;3217:101;;;:::o;9301:114::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;9378:5;;;;;;;;;;;9359:25;;;;;;;;;;;;9407:1;9391:5;;:18;;;;;;;;;;;;;;;;;;9301:114::o;19697:129::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;19784:36;19792:9;19803:16;;;;;;;;;;;;;;;;;;19784:7;:36::i;:::-;19697:129;:::o;11712:144::-;11771:4;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;10516:15;;;;;;;;;;;10515:16;10507:25;;;;;;;;11802:4;11784:15;;:22;;;;;;;;;;;;;;;;;;11818:14;;;;;;;;;;11846:4;11839:11;;11712:144;:::o;25722:94::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25808:5;25792:13;:21;;;;25722:94;:::o;12239:68::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12295:5;;;;;;;;;;;12282:19;;;13149:93;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;13213:4;13204:6;;:13;;;;;;;;;;;;;;;;;;13229:7;;;;;;;;;;13149:93::o;8506:20::-;;;;;;;;;;;;;:::o;26216:91::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26299:5;26286:10;:18;;;;26216:91;:::o;25615:103::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25710:5;25685:22;:30;;;;25615:103;:::o;14787:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19904:139::-;19978:4;20001:36;20009:9;20020:16;;;;;;;;;;;;;;;;;;20001:7;:36::i;:::-;19994:43;;19904:139;;;:::o;26530:240::-;26606:4;26619:16;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;26638:31;26654:1;26658:2;26662:6;26638:7;:31::i;:::-;26619:50;;26684:40;26699:2;26703:20;26714:8;26703:6;:10;;:20;;;;:::i;:::-;26684:14;:40::i;:::-;26676:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26760:4;26753:11;;26530:240;;;;;:::o;23788:31::-;;;;:::o;26017:100::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26109:5;26087:19;;:27;;;;;;;;;;;;;;;;;;26017:100;:::o;30375:491::-;30537:4;30619:12;30588:10;30576:9;:22;30558:15;:40;30554:58;;;30607:5;30600:12;;;;30554:58;30687:4;30703:6;30721:10;30743;30764:9;30652:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30652:130:0;;;30634:155;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30634:155:0;;;;;;;;;;;;;;;;30619:170;;30855:5;;;;;;;;;;;30803:57;;:48;30841:9;30803:29;:4;:27;;;;:29::i;:::-;:37;;;;;:48;;;;:::i;:::-;:57;;;30796:64;;30375:491;;;;;;;;;:::o;25512:99::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25603:5;25582:18;:26;;;;25512:99;:::o;29874:495::-;30034:4;30116:12;30085:10;30073:9;:22;30055:15;:40;30051:58;;;30104:5;30097:12;;;;30051:58;30184:4;30200:6;30218;30236;30253:3;30267:9;30149:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30149:136:0;;;30131:161;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30131:161:0;;;;;;;;;;;;;;;;30116:176;;30358:5;;;;;;;;;;;30306:57;;:48;30344:9;30306:29;:4;:27;;;;:29::i;:::-;:37;;;;;:48;;;;:::i;:::-;:57;;;30299:64;;29874:495;;;;;;;;;;:::o;30872:927::-;31030:4;31229:12;25183:4;25169:18;;:10;;;;;;;;;;;:18;;;25161:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;31059:109;31093:10;31105;31127;31139:9;31150;31059:23;:109::i;:::-;31043:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31244:42;31275:10;;31244:26;31259:10;;31244;:14;;:26;;;;:::i;:::-;:30;;:42;;;;:::i;:::-;31229:57;;31297:21;31307:10;31297:9;:21::i;:::-;:77;;;;;31332:19;;;;;;;;;;;31322:40;;;31363:10;31322:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31322:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31322:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31322:52:0;;;;;;;;;;;;;;;;31297:77;31293:98;;;31390:1;31383:8;;31293:98;31400:49;31415:11;;;;;;;;;;;31428:20;31443:4;31428:10;:14;;:20;;;;:::i;:::-;31400:14;:49::i;:::-;;31464:38;31479:16;;;;;;;;;;;31497:4;31464:14;:38::i;:::-;31456:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31571:19;;;;;;;;;;;31557:58;;;31616:10;31628;31557:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31557:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31557:82:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31557:82:0;;;;;;;;;;;;;;;;31541:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31734:10;31724:51;;;31746:10;31758;31770:4;31724:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:4;31782:11;;30872:927;;;;;;;:::o;23958:76::-;;;;;;;;;;;;;:::o;6962:307::-;7068:4;7125:46;7159:11;7125:7;:19;7133:10;7125:19;;;;;;;;;;;;;;;:29;7145:8;7125:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;7084:7;:19;7092:10;7084:19;;;;;;;;;;;;;;;:29;7104:8;7084:29;;;;;;;;;;;;;;;:88;;;;7205:8;7184:61;;7193:10;7184:61;;;7215:7;:19;7223:10;7215:19;;;;;;;;;;;;;;;:29;7235:8;7215:29;;;;;;;;;;;;;;;;7184:61;;;;;;;;;;;;;;;;;;7259:4;7252:11;;6962:307;;;;:::o;29432:436::-;29561:11;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29509:1;29500:6;:10;29492:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29575:41;29605:10;;29575:25;29586:13;;29575:6;:10;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;29561:55;;29625:34;29631:10;29643:15;29654:3;29643:6;:10;;:15;;;;:::i;:::-;29625:5;:34::i;:::-;29676:1;29670:3;:7;29666:152;;;29696:37;29711:16;;;;;;;;;;;29729:3;29696:14;:37::i;:::-;29688:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29773:37;29794:10;29806:3;29773:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29666:152;29829:33;29843:10;29855:6;29829:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;29432:436;;:::o;6337:162::-;6442:7;6468;:15;6476:6;6468:15;;;;;;;;;;;;;;;:25;6484:8;6468:25;;;;;;;;;;;;;;;;6461:32;;6337:162;;;;:::o;24077:37::-;;;;:::o;24039:33::-;;;;:::o;20269:198::-;20366:9;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;20378:1;20366:13;;20361:101;20385:10;:17;20381:1;:21;20361:101;;;20418:36;20440:10;20451:1;20440:13;;;;;;;;;;;;;;;;;;20418:21;:36::i;:::-;20404:3;;;;;;;20361:101;;;20269:198;;:::o;9583:105::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;9653:29;9672:9;9653:18;:29::i;:::-;9583:105;:::o;12313:98::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12394:10;12381:24;;;25921:92;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26005:5;25991:11;;:19;;;;;;;;;;;;;;;;;;25921:92;:::o;15756:116::-;15848:17;15852:5;15859;15848:3;:17::i;:::-;15840:26;;;;;;;;15756:116;;:::o;15956:134::-;16042:4;16065:5;:12;;:19;16078:5;16065:19;;;;;;;;;;;;;;;;;;;;;;;;;16058:26;;15956:134;;;;:::o;27124:579::-;27200:12;27239:5;;;;;;;;;;;27225:19;;:10;:19;;;:54;;;;27248:31;27256:4;27262:16;;;;;;;;;;;;;;;;;;27248:7;:31::i;:::-;27225:54;:95;;;;27283:37;27291:10;27303:16;;;;;;;;;;;;;;;;;;27283:7;:37::i;:::-;27225:95;:128;;;;27324:29;27332:2;27336:16;;;;;;;;;;;;;;;;;;27324:7;:29::i;:::-;27225:128;27221:151;;;27371:1;27364:8;;;;27221:151;27386:22;27401:6;27386:14;:22::i;:::-;27379:29;;27435:1;27419:18;;:4;:18;;;27415:239;;;27456:38;27471:16;;;;;;;;;;;27489:4;27456:14;:38::i;:::-;27448:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27415:239;;;27562:48;27581:4;27587:16;;;;;;;;;;;27605:4;27562:18;:48::i;:::-;27554:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27415:239;27665:32;27688:2;27692:4;27665:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27124:579;;;;;;:::o;1690:119::-;1750:7;1779:2;1773;:8;;1766:16;;;;;;1801:2;1796;:7;1789:14;;1690:119;;;;:::o;4702:487::-;4814:4;4848:8;:15;4857:5;4848:15;;;;;;;;;;;;;;;;4838:6;:25;;4830:34;;;;;;;;4889:7;:14;4897:5;4889:14;;;;;;;;;;;;;;;:26;4904:10;4889:26;;;;;;;;;;;;;;;;4879:6;:36;;4871:45;;;;;;;;4946:1;4931:17;;:3;:17;;;;4923:26;;;;;;;;4976:27;4996:6;4976:8;:15;4985:5;4976:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;4958:8;:15;4967:5;4958:15;;;;;;;;;;;;;;;:45;;;;5026:25;5044:6;5026:8;:13;5035:3;5026:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;5010:8;:13;5019:3;5010:13;;;;;;;;;;;;;;;:41;;;;5087:38;5118:6;5087:7;:14;5095:5;5087:14;;;;;;;;;;;;;;;:26;5102:10;5087:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;5058:7;:14;5066:5;5058:14;;;;;;;;;;;;;;;:26;5073:10;5058:26;;;;;;;;;;;;;;;:67;;;;5153:3;5137:28;;5146:5;5137:28;;;5158:6;5137:28;;;;;;;;;;;;;;;;;;5179:4;5172:11;;4702:487;;;;;:::o;17818:154::-;17895:30;17915:9;17895:5;17901;17895:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17895:12:0;;;;;;;;;;;;;;;;;;;;;:19;;:30;;;;:::i;:::-;17949:9;17937:29;;;17960:5;17937:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17937:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17818:154;;:::o;11297:295::-;11386:4;11418:25;11435:7;11418:12;;:16;;:25;;;;:::i;:::-;11403:12;:40;;;;11466:26;11484:7;11466:8;:13;11475:3;11466:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;11450:8;:13;11459:3;11450:13;;;;;;;;;;;;;;;:42;;;;11509:3;11504:18;;;11514:7;11504:18;;;;;;;;;;;;;;;;;;11555:3;11534:34;;11551:1;11534:34;;;11560:7;11534:34;;;;;;;;;;;;;;;;;;11582:4;11575:11;;11297:295;;;;:::o;13928:447::-;14007:8;:14;14016:4;14007:14;;;;;;;;;;;;;;;;13997:6;:24;;13989:33;;;;;;;;14221:26;14240:6;14221:8;:14;14230:4;14221:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;14204:8;:14;14213:4;14204:14;;;;;;;;;;;;;;;:43;;;;14269:24;14286:6;14269:12;;:16;;:24;;;;:::i;:::-;14254:12;:39;;;;14310:4;14305:18;;;14316:6;14305:18;;;;;;;;;;;;;;;;;;14358:1;14335:34;;14344:4;14335:34;;;14362:6;14335:34;;;;;;;;;;;;;;;;;;13928:447;;:::o;28049:318::-;28133:4;28172:6;28154:8;:14;28163:4;28154:14;;;;;;;;;;;;;;;;:24;;28146:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28229:26;28248:6;28229:8;:14;28238:4;28229:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;28212:8;:14;28221:4;28212:14;;;;;;;;;;;;;;;:43;;;;28277:24;28294:6;28277:8;:12;28286:2;28277:12;;;;;;;;;;;;;;;;:16;;:24;;;;:::i;:::-;28262:8;:12;28271:2;28262:12;;;;;;;;;;;;;;;:39;;;;28330:2;28315:26;;28324:4;28315:26;;;28334:6;28315:26;;;;;;;;;;;;;;;;;;28357:4;28350:11;;28049:318;;;;;:::o;17540:146::-;17614:27;17631:9;17614:5;17620;17614:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17614:12:0;;;;;;;;;;;;;;;;;;;;;:16;;:27;;;;:::i;:::-;17663:9;17653:27;;;17674:5;17653:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17653:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17540:146;;:::o;2679:329::-;2742:4;2773:8;:20;2782:10;2773:20;;;;;;;;;;;;;;;;2763:6;:30;;2755:39;;;;;;;;2824:1;2809:17;;:3;:17;;;;2801:26;;;;;;;;2859:32;2884:6;2859:8;:20;2868:10;2859:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;2836:8;:20;2845:10;2836:20;;;;;;;;;;;;;;;:55;;;;2914:25;2932:6;2914:8;:13;2923:3;2914:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;2898:8;:13;2907:3;2898:13;;;;;;;;;;;;;;;:41;;;;2972:3;2951:33;;2960:10;2951:33;;;2977:6;2951:33;;;;;;;;;;;;;;;;;;2998:4;2991:11;;2679:329;;;;:::o;23102:289::-;23187:7;23372:5;23319:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23319:59:0;;;23301:84;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23301:84:0;;;;;;;;;;;;;;;;23294:91;;23102:289;;;:::o;21982:975::-;22064:7;22083:9;22099;22115:7;22185:2;22170:4;:11;:17;;22166:59;;;22214:1;22198:19;;;;22166:59;22503:2;22497:4;22493:13;22487:20;22482:25;;22536:2;22530:4;22526:13;22520:20;22515:25;;22577:2;22571:4;22567:13;22561:20;22558:1;22553:29;22548:34;;22693:2;22689:1;:6;;;22685:36;;;22711:2;22706:7;;;;22685:36;22798:2;22793:1;:7;;;;:18;;;;;22809:2;22804:1;:7;;;;22793:18;22789:163;;;22838:1;22822:19;;;;22789:163;22919:25;22929:5;22936:1;22939;22942;22919:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22919:25:0;;;;;;;;22912:32;;21982:975;;;;;;;;:::o;807:391::-;867:9;1103:1;1097:2;:7;1093:38;;;1122:1;1115:8;;;;1093:38;1148:2;1143;:7;1139:11;;1174:2;1168;1164:1;:6;;;;;;;;:12;1157:20;;;;;;1191:1;1184:8;;807:391;;;;;:::o;1285:288::-;1345:7;1565:2;1560;:7;;;;;;;;1553:14;;1285:288;;;;:::o;1876:132::-;1936:9;1963:2;1958;:7;1954:11;;1984:2;1979:1;:7;;1972:15;;;;;;2001:1;1994:8;;1876:132;;;;:::o;9829:175::-;9921:1;9900:23;;:9;:23;;;;9892:32;;;;;;;;9964:9;9936:38;;9957:5;;;;;;;;;;;9936:38;;;;;;;;;;;;9989:9;9981:5;;:17;;;;;;;;;;;;;;;;;;9829:175;:::o;27709:334::-;27771:7;27812:1;27791:18;;:22;:54;;;;;27827:18;;27817:6;:28;;27791:54;27787:68;;;27854:1;27847:8;;;;27787:68;27891:1;27866:22;;:26;:62;;;;;27906:22;;27896:6;:32;;27866:62;27862:122;;;27937:47;27973:10;;27937:31;27948:19;;27937:6;:10;;:31;;;;:::i;:::-;:35;;:47;;;;:::i;:::-;27930:54;;;;27862:122;27998:39;28026:10;;27998:23;28009:11;;27998:6;:10;;:23;;;;:::i;:::-;:27;;:39;;;;:::i;:::-;27991:46;;27709:334;;;;:::o;15566:108::-;15663:5;15641;:12;;:19;15654:5;15641:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;15566:108;;:::o;15392:104::-;15486:4;15464:5;:12;;:19;15477:5;15464:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;15392:104;;:::o
Swarm Source
bzzr://2b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc48
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.