Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 413 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Destroy | 8435750 | 1961 days ago | IN | 0 ETH | 0.00001378 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.0001927 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.00011014 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.0002903 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.00062348 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.00135371 | ||||
Resolve Claims | 8428216 | 1962 days ago | IN | 0 ETH | 0.00268416 | ||||
Resolve Claims | 8428190 | 1962 days ago | IN | 0 ETH | 0.00327914 | ||||
Resolve Claims | 8425552 | 1963 days ago | IN | 0 ETH | 0.00632526 | ||||
Resolve Claims | 8425504 | 1963 days ago | IN | 0 ETH | 0.00658179 | ||||
Resolve Claims | 8425471 | 1963 days ago | IN | 0 ETH | 0.00683289 | ||||
Withdraw Claim | 8425216 | 1963 days ago | IN | 0 ETH | 0.00082929 | ||||
Withdraw Claim | 8425177 | 1963 days ago | IN | 0 ETH | 0.00082929 | ||||
Withdraw Claim | 8425154 | 1963 days ago | IN | 0 ETH | 0.0007617 | ||||
Withdraw Claim | 8425136 | 1963 days ago | IN | 0 ETH | 0.00080394 | ||||
Resolve Claims | 8423938 | 1963 days ago | IN | 0 ETH | 0.00688768 | ||||
Resolve Claim | 8423914 | 1963 days ago | IN | 0 ETH | 0.0003385 | ||||
Resolve Claims | 8423900 | 1963 days ago | IN | 0 ETH | 0.00632562 | ||||
Ratify Claims | 8423672 | 1963 days ago | IN | 0 ETH | 0.00022171 | ||||
Set Claim Status | 8423564 | 1963 days ago | IN | 0 ETH | 0.00014077 | ||||
Set Claim Status | 8423511 | 1963 days ago | IN | 0 ETH | 0.00048474 | ||||
Set Claim Status... | 8421334 | 1963 days ago | IN | 0 ETH | 0.00098873 | ||||
Withdraw Claim | 8417437 | 1964 days ago | IN | 0 ETH | 0.00003006 | ||||
Withdraw Claim | 8413325 | 1965 days ago | IN | 0 ETH | 0.00039078 | ||||
Withdraw Claim | 8410430 | 1965 days ago | IN | 0 ETH | 0.00003006 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
8435750 | 1961 days ago | 0 ETH | ||||
8428216 | 1962 days ago | 0.02406507 ETH | ||||
8428216 | 1962 days ago | 0.023896 ETH | ||||
8428216 | 1962 days ago | 0.77006377 ETH | ||||
8428216 | 1962 days ago | 0.77006377 ETH | ||||
8428216 | 1962 days ago | 0.02406507 ETH | ||||
8428216 | 1962 days ago | 0.023896 ETH | ||||
8428216 | 1962 days ago | 0.02397736 ETH | ||||
8428216 | 1962 days ago | 0.02368377 ETH | ||||
8428216 | 1962 days ago | 0.02368377 ETH | ||||
8428216 | 1962 days ago | 0.75788077 ETH | ||||
8428216 | 1962 days ago | 0.75788077 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 0.02390857 ETH | ||||
8428216 | 1962 days ago | 3.06029742 ETH | ||||
8428216 | 1962 days ago | 0.02399002 ETH | ||||
8428216 | 1962 days ago | 0.02406449 ETH |
Loading...
Loading
Contract Self Destruct called at Txn Hash 0x9c75c0dbc450eff6e6168a9420d0b2d0da47395c616df2d63e376f57111717fb
Contract Name:
ShortNameClaims
Compiler Version
v0.5.10+commit.5a6ea5b1
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-07-06 */ // File: @ensdomains/ens/contracts/ENS.sol pragma solidity >=0.4.24; interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; function setResolver(bytes32 node, address resolver) external; function setOwner(bytes32 node, address owner) external; function setTTL(bytes32 node, uint64 ttl) external; function owner(bytes32 node) external view returns (address); function resolver(bytes32 node) external view returns (address); function ttl(bytes32 node) external view returns (uint64); } // File: @ensdomains/ens/contracts/Deed.sol pragma solidity >=0.4.24; interface Deed { function setOwner(address payable newOwner) external; function setRegistrar(address newRegistrar) external; function setBalance(uint newValue, bool throwOnFailure) external; function closeDeed(uint refundRatio) external; function destroyDeed() external; function owner() external view returns (address); function previousOwner() external view returns (address); function value() external view returns (uint); function creationDate() external view returns (uint); } // File: @ensdomains/ens/contracts/Registrar.sol pragma solidity >=0.4.24; interface Registrar { enum Mode { Open, Auction, Owned, Forbidden, Reveal, NotYetAvailable } event AuctionStarted(bytes32 indexed hash, uint registrationDate); event NewBid(bytes32 indexed hash, address indexed bidder, uint deposit); event BidRevealed(bytes32 indexed hash, address indexed owner, uint value, uint8 status); event HashRegistered(bytes32 indexed hash, address indexed owner, uint value, uint registrationDate); event HashReleased(bytes32 indexed hash, uint value); event HashInvalidated(bytes32 indexed hash, string indexed name, uint value, uint registrationDate); function state(bytes32 _hash) external view returns (Mode); function startAuction(bytes32 _hash) external; function startAuctions(bytes32[] calldata _hashes) external; function newBid(bytes32 sealedBid) external payable; function startAuctionsAndBid(bytes32[] calldata hashes, bytes32 sealedBid) external payable; function unsealBid(bytes32 _hash, uint _value, bytes32 _salt) external; function cancelBid(address bidder, bytes32 seal) external; function finalizeAuction(bytes32 _hash) external; function transfer(bytes32 _hash, address payable newOwner) external; function releaseDeed(bytes32 _hash) external; function invalidateName(string calldata unhashedName) external; function eraseNode(bytes32[] calldata labels) external; function transferRegistrars(bytes32 _hash) external; function acceptRegistrarTransfer(bytes32 hash, Deed deed, uint registrationDate) external; function entries(bytes32 _hash) external view returns (Mode, address, uint, uint, uint); } // File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @title IERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function transferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @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 private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return 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 OwnershipTransferred(_owner, address(0)); _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/BaseRegistrar.sol pragma solidity >=0.4.24; contract BaseRegistrar is IERC721, Ownable { uint constant public GRACE_PERIOD = 90 days; event ControllerAdded(address indexed controller); event ControllerRemoved(address indexed controller); event NameMigrated(uint256 indexed id, address indexed owner, uint expires); event NameRegistered(uint256 indexed id, address indexed owner, uint expires); event NameRenewed(uint256 indexed id, uint expires); // Expiration timestamp for migrated domains. uint public transferPeriodEnds; // The ENS registry ENS public ens; // The namehash of the TLD this registrar owns (eg, .eth) bytes32 public baseNode; // The interim registrar Registrar public previousRegistrar; // A map of addresses that are authorised to register and renew names. mapping(address=>bool) public controllers; // Authorises a controller, who can register and renew domains. function addController(address controller) external; // Revoke controller permission for an address. function removeController(address controller) external; // Set the resolver for the TLD this registrar manages. function setResolver(address resolver) external; // Returns the expiration timestamp of the specified label hash. function nameExpires(uint256 id) external view returns(uint); // Returns true iff the specified name is available for registration. function available(uint256 id) public view returns(bool); /** * @dev Register a name. */ function register(uint256 id, address owner, uint duration) external returns(uint); function renew(uint256 id, uint duration) external returns(uint); /** * @dev Reclaim ownership of a name in ENS, if you own it in the registrar. */ function reclaim(uint256 id, address owner) external; /** * @dev Transfers a registration from the initial registrar. * This function is called by the initial registrar when a user calls `transferRegistrars`. */ function acceptRegistrarTransfer(bytes32 label, Deed deed, uint) external; } // File: contracts/StringUtils.sol pragma solidity >=0.4.24; library StringUtils { /** * @dev Returns the length of a given string * * @param s The string to measure the length of * @return The length of the input string */ function strlen(string memory s) internal pure returns (uint) { uint len; uint i = 0; uint bytelength = bytes(s).length; for(len = 0; i < bytelength; len++) { byte b = bytes(s)[i]; if(b < 0x80) { i += 1; } else if (b < 0xE0) { i += 2; } else if (b < 0xF0) { i += 3; } else if (b < 0xF8) { i += 4; } else if (b < 0xFC) { i += 5; } else { i += 6; } } return len; } } // File: contracts/PriceOracle.sol pragma solidity >=0.4.24; interface PriceOracle { /** * @dev Returns the price to register or renew a name. * @param name The name being registered or renewed. * @param expires When the name presently expires (0 if this is a new registration). * @param duration How long the name is being registered or extended for, in seconds. * @return The price of this renewal or registration, in wei. */ function price(string calldata name, uint expires, uint duration) external view returns(uint); } // File: @ensdomains/buffer/contracts/Buffer.sol pragma solidity >0.4.18; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { return writeInt(buf, buf.buf.length, data, len); } } // File: @ensdomains/dnssec-oracle/contracts/BytesUtils.sol pragma solidity >0.4.23; library BytesUtils { /* * @dev Returns the keccak-256 hash of a byte range. * @param self The byte string to hash. * @param offset The position to start hashing at. * @param len The number of bytes to hash. * @return The hash of the byte range. */ function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) { require(offset + len <= self.length); assembly { ret := keccak256(add(add(self, 32), offset), len) } } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. * @param self The first bytes to compare. * @param other The second bytes to compare. * @return The result of the comparison. */ function compare(bytes memory self, bytes memory other) internal pure returns (int) { return compare(self, 0, self.length, other, 0, other.length); } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first bytes to compare. * @param offset The offset of self. * @param len The length of self. * @param other The second bytes to compare. * @param otheroffset The offset of the other string. * @param otherlen The length of the other string. * @return The result of the comparison. */ function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) { uint shortest = len; if (otherlen < len) shortest = otherlen; uint selfptr; uint otherptr; assembly { selfptr := add(self, add(offset, 32)) otherptr := add(other, add(otheroffset, 32)) } for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask; if (shortest > 32) { mask = uint256(- 1); // aka 0xffffff.... } else { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(len) - int(otherlen); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @param len The number of bytes to compare * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) { return keccak(self, offset, len) == keccak(other, otherOffset, len); } /* * @dev Returns true if the two byte ranges are equal with offsets. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) { return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset); } /* * @dev Compares a range of 'self' to all of 'other' and returns True iff * they are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) { return self.length >= offset + other.length && equals(self, offset, other, 0, other.length); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, bytes memory other) internal pure returns(bool) { return self.length == other.length && equals(self, 0, other, 0, self.length); } /* * @dev Returns the 8-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 8 bits of the string, interpreted as an integer. */ function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) { return uint8(self[idx]); } /* * @dev Returns the 16-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 16 bits of the string, interpreted as an integer. */ function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) { require(idx + 2 <= self.length); assembly { ret := and(mload(add(add(self, 2), idx)), 0xFFFF) } } /* * @dev Returns the 32-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bits of the string, interpreted as an integer. */ function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) { require(idx + 4 <= self.length); assembly { ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) { require(idx + 32 <= self.length); assembly { ret := mload(add(add(self, 32), idx)) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) { require(idx + 20 <= self.length); assembly { ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000) } } /* * @dev Returns the n byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes. * @param len The number of bytes. * @return The specified 32 bytes of the string. */ function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes32 ret) { require(len <= 32); require(idx + len <= self.length); assembly { let mask := not(sub(exp(256, sub(32, len)), 1)) ret := and(mload(add(add(self, 32), idx)), mask) } } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Copies a substring into a new byte string. * @param self The byte string to copy from. * @param offset The offset to start copying at. * @param len The number of bytes to copy. */ function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) { require(offset + len <= self.length); bytes memory ret = new bytes(len); uint dest; uint src; assembly { dest := add(ret, 32) src := add(add(self, 32), offset) } memcpy(dest, src, len); return ret; } // Maps characters from 0x30 to 0x7A to their base32 values. // 0xFF represents invalid characters in that range. bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'; /** * @dev Decodes unpadded base32 data of up to one word in length. * @param self The data to decode. * @param off Offset into the string to start at. * @param len Number of characters to decode. * @return The decoded data, left aligned. */ function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) { require(len <= 52); uint ret = 0; uint8 decoded; for(uint i = 0; i < len; i++) { bytes1 char = self[off + i]; require(char >= 0x30 && char <= 0x7A); decoded = uint8(base32HexTable[uint(uint8(char)) - 0x30]); require(decoded <= 0x20); if(i == len - 1) { break; } ret = (ret << 5) | decoded; } uint bitlen = len * 5; if(len % 8 == 0) { // Multiple of 8 characters, no padding ret = (ret << 5) | decoded; } else if(len % 8 == 2) { // Two extra characters - 1 byte ret = (ret << 3) | (decoded >> 2); bitlen -= 2; } else if(len % 8 == 4) { // Four extra characters - 2 bytes ret = (ret << 1) | (decoded >> 4); bitlen -= 4; } else if(len % 8 == 5) { // Five extra characters - 3 bytes ret = (ret << 4) | (decoded >> 1); bitlen -= 1; } else if(len % 8 == 7) { // Seven extra characters - 4 bytes ret = (ret << 2) | (decoded >> 3); bitlen -= 3; } else { revert(); } return bytes32(ret << (256 - bitlen)); } } // File: openzeppelin-solidity/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } } // File: contracts/ShortNameClaims.sol pragma solidity ^0.5.0; /** * @dev ShortNameClaims is a contract that permits people to register claims * for short (3-6 character) ENS names ahead of the auction process. * * Anyone with a DNS name registered before January 1, 2019, may use this * name to support a claim for a matching ENS name. In the event that * multiple claimants request the same name, the name will be assigned to * the oldest registered DNS name. * * Claims may be submitted by calling `submitExactClaim`, * `submitCombinedClaim` or `submitPrefixClaim` as appropriate. * * Claims require lodging a deposit equivalent to 365 days' registration of * the name. If the claim is approved, this deposit is spent, and the name * is registered for the claimant for 365 days. If the claim is declined, * the deposit will be returned. */ contract ShortNameClaims { using Roles for Roles.Role; uint constant public REGISTRATION_PERIOD = 31536000; using Buffer for Buffer.buffer; using BytesUtils for bytes; using StringUtils for string; enum Phase { OPEN, REVIEW, FINAL } enum Status { PENDING, APPROVED, DECLINED, WITHDRAWN } struct Claim { bytes32 labelHash; address claimant; uint paid; Status status; } Roles.Role owners; Roles.Role ratifiers; PriceOracle public priceOracle; BaseRegistrar public registrar; mapping(bytes32=>Claim) public claims; mapping(bytes32=>bool) approvedNames; uint public pendingClaims; uint public unresolvedClaims; Phase public phase; event ClaimSubmitted(string claimed, bytes dnsname, uint paid, address claimant, string email); event ClaimStatusChanged(bytes32 indexed claimId, Status status); constructor(PriceOracle _priceOracle, BaseRegistrar _registrar, address _ratifier) public { priceOracle = _priceOracle; registrar = _registrar; phase = Phase.OPEN; owners.add(msg.sender); ratifiers.add(_ratifier); } modifier onlyOwner() { require(owners.has(msg.sender), "Caller must be an owner"); _; } modifier onlyRatifier() { require(ratifiers.has(msg.sender), "Caller must be a ratifier"); _; } modifier inPhase(Phase p) { require(phase == p, "Not in required phase"); _; } function addOwner(address owner) external onlyOwner { owners.add(owner); } function removeOwner(address owner) external onlyOwner { owners.remove(owner); } function addRatifier(address ratifier) external onlyRatifier { ratifiers.add(ratifier); } function removeRatifier(address ratifier) external onlyRatifier { ratifiers.remove(ratifier); } /** * @dev Computes the claim ID for a submitted claim, so it can be looked up * using `claims`. * @param claimed The name being claimed (eg, 'foo') * @param dnsname The DNS-encoded name supporting the claim (eg, 'foo.test') * @param claimant The address making the claim. * @return The claim ID. */ function computeClaimId(string memory claimed, bytes memory dnsname, address claimant, string memory email) public pure returns(bytes32) { return keccak256(abi.encodePacked(keccak256(bytes(claimed)), keccak256(dnsname), claimant, keccak256(bytes(email)))); } /** * @dev Returns the cost associated with placing a claim. * @param claimed The name being claimed. * @return The cost in wei for this claim. */ function getClaimCost(string memory claimed) public view returns(uint) { return priceOracle.price(claimed, 0, REGISTRATION_PERIOD); } /** * @dev Submits a claim for an exact match (eg, foo.test -> foo.eth). * Claimants must provide an amount of ether equal to 365 days' * registration cost; call `getClaimCost` to determine this amount. * Claimants should supply a little extra in case of variation in price; * any excess will be returned to the sender. * @param name The DNS-encoded name of the domain being used to support the * claim. * @param claimant The address of the claimant. * @param email An email address for correspondence regarding the claim. */ function submitExactClaim(bytes memory name, address claimant, string memory email) public payable { string memory claimed = getLabel(name, 0); handleClaim(claimed, name, claimant, email); } /** * @dev Submits a claim for match on name+tld (eg, foo.tv -> footv). * Claimants must provide an amount of ether equal to 365 days' * registration cost; call `getClaimCost` to determine this amount. * Claimants should supply a little extra in case of variation in price; * any excess will be returned to the sender. * @param name The DNS-encoded name of the domain being used to support the * claim. * @param claimant The address of the claimant. * @param email An email address for correspondence regarding the claim. */ function submitCombinedClaim(bytes memory name, address claimant, string memory email) public payable { bytes memory firstLabel = bytes(getLabel(name, 0)); bytes memory secondLabel = bytes(getLabel(name, 1)); Buffer.buffer memory buf; buf.init(firstLabel.length + secondLabel.length); buf.append(firstLabel); buf.append(secondLabel); handleClaim(string(buf.buf), name, claimant, email); } /** * @dev Submits a claim for prefix match (eg, fooeth.test -> foo.eth). * Claimants must provide an amount of ether equal to 365 days' * registration cost; call `getClaimCost` to determine this amount. * Claimants should supply a little extra in case of variation in price; * any excess will be returned to the sender. * @param name The DNS-encoded name of the domain being used to support the * claim. * @param claimant The address of the claimant. * @param email An email address for correspondence regarding the claim. */ function submitPrefixClaim(bytes memory name, address claimant, string memory email) public payable { bytes memory firstLabel = bytes(getLabel(name, 0)); require(firstLabel.equals(firstLabel.length - 3, bytes("eth"))); handleClaim(string(firstLabel.substring(0, firstLabel.length - 3)), name, claimant, email); } /** * @dev Closes the claim submission period. * Callable only by the owner. */ function closeClaims() external onlyOwner inPhase(Phase.OPEN) { phase = Phase.REVIEW; } /** * @dev Ratifies the current set of claims. * Ratification freezes the claims and their resolutions, and permits * them to be acted on. */ function ratifyClaims() external onlyRatifier inPhase(Phase.REVIEW) { // Can't ratify until all claims have a resolution. require(pendingClaims == 0); phase = Phase.FINAL; } /** * @dev Cleans up the contract, after all claims are resolved. * Callable only by the owner, and only in final state. */ function destroy() external onlyOwner inPhase(Phase.FINAL) { require(unresolvedClaims == 0); selfdestruct(toPayable(msg.sender)); } /** * @dev Sets the status of a claim to either APPROVED or DECLINED. * Callable only during the review phase, and only by the owner or * ratifier. * @param claimId The claim to set the status of. * @param approved True if the claim is approved, false if it is declined. */ function setClaimStatus(bytes32 claimId, bool approved) public inPhase(Phase.REVIEW) { // Only callable by owner or ratifier require(owners.has(msg.sender) || ratifiers.has(msg.sender)); Claim memory claim = claims[claimId]; require(claim.paid > 0, "Claim not found"); if(claim.status == Status.PENDING) { // Claim went from pending -> approved/declined; update counters pendingClaims--; unresolvedClaims++; } else if(claim.status == Status.APPROVED) { // Claim was previously approved; remove from approved map approvedNames[claim.labelHash] = false; } // Claim was just approved; check the name was not already used, and add // to approved map if(approved) { require(!approvedNames[claim.labelHash]); approvedNames[claim.labelHash] = true; } Status status = approved?Status.APPROVED:Status.DECLINED; claims[claimId].status = status; emit ClaimStatusChanged(claimId, status); } /** * @dev Sets the status of multiple claims. Callable only during the review * phase, and only by the owner or ratifier. * @param approved A list of approved claim IDs. * @param declined A list of declined claim IDs. */ function setClaimStatuses(bytes32[] calldata approved, bytes32[] calldata declined) external { for(uint i = 0; i < approved.length; i++) { setClaimStatus(approved[i], true); } for(uint i = 0; i < declined.length; i++) { setClaimStatus(declined[i], false); } } /** * @dev Resolves a claim. Callable by anyone, only in the final phase. * Resolving a claim either registers the name or refunds the claimant. * @param claimId The claim ID to resolve. */ function resolveClaim(bytes32 claimId) public inPhase(Phase.FINAL) { Claim memory claim = claims[claimId]; require(claim.paid > 0, "Claim not found"); if(claim.status == Status.APPROVED) { registrar.register(uint256(claim.labelHash), claim.claimant, REGISTRATION_PERIOD); toPayable(registrar.owner()).transfer(claim.paid); } else if(claim.status == Status.DECLINED) { toPayable(claim.claimant).transfer(claim.paid); } else { // It should not be possible to get to FINAL with claim IDs that are // not either APPROVED or DECLINED. assert(false); } unresolvedClaims--; delete claims[claimId]; } /** * @dev Resolves multiple claims. Callable by anyone, only in the final phase. * @param claimIds A list of claim IDs to resolve. */ function resolveClaims(bytes32[] calldata claimIds) external { for(uint i = 0; i < claimIds.length; i++) { resolveClaim(claimIds[i]); } } /** * @dev Withdraws a claim and refunds the claimant. * Callable only by the claimant, at any time. * @param claimId The ID of the claim to withdraw. */ function withdrawClaim(bytes32 claimId) external { Claim memory claim = claims[claimId]; // Only callable by claimant require(msg.sender == claim.claimant); if(claim.status == Status.PENDING) { pendingClaims--; } else { unresolvedClaims--; } toPayable(claim.claimant).transfer(claim.paid); emit ClaimStatusChanged(claimId, Status.WITHDRAWN); delete claims[claimId]; } function handleClaim(string memory claimed, bytes memory name, address claimant, string memory email) internal inPhase(Phase.OPEN) { uint len = claimed.strlen(); require(len >= 3 && len <= 6); bytes32 claimId = computeClaimId(claimed, name, claimant, email); require(claims[claimId].paid == 0, "Claim already submitted"); // Require that there are at most two labels (name.tld) require(bytes(getLabel(name, 2)).length == 0, "Name must be a 2LD"); uint price = getClaimCost(claimed); require(msg.value >= price, "Insufficient funds for reservation"); if(msg.value > price) { msg.sender.transfer(msg.value - price); } claims[claimId] = Claim(keccak256(bytes(claimed)), claimant, price, Status.PENDING); pendingClaims++; emit ClaimSubmitted(claimed, name, price, claimant, email); } function getLabel(bytes memory name, uint idx) internal pure returns(string memory) { // Skip the first `idx` labels uint offset = 0; for(uint i = 0; i < idx; i++) { if(offset >= name.length) return ""; offset += name.readUint8(offset) + 1; } // Read the label we care about if(offset >= name.length) return ''; uint len = name.readUint8(offset); return string(name.substring(offset + 1, len)); } function toPayable(address addr) internal pure returns(address payable) { return address(uint160(addr)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"priceOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registrar","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"ratifier","type":"address"}],"name":"removeRatifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingClaims","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"ratifier","type":"address"}],"name":"addRatifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"},{"name":"claimant","type":"address"},{"name":"email","type":"string"}],"name":"submitPrefixClaim","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"unresolvedClaims","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"claimed","type":"string"}],"name":"getClaimCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"claimId","type":"bytes32"}],"name":"withdrawClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ratifyClaims","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"claimed","type":"string"},{"name":"dnsname","type":"bytes"},{"name":"claimant","type":"address"},{"name":"email","type":"string"}],"name":"computeClaimId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"claimId","type":"bytes32"},{"name":"approved","type":"bool"}],"name":"setClaimStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"},{"name":"claimant","type":"address"},{"name":"email","type":"string"}],"name":"submitExactClaim","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"phase","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"claimId","type":"bytes32"}],"name":"resolveClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"approved","type":"bytes32[]"},{"name":"declined","type":"bytes32[]"}],"name":"setClaimStatuses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"closeClaims","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"claimIds","type":"bytes32[]"}],"name":"resolveClaims","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"REGISTRATION_PERIOD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"claims","outputs":[{"name":"labelHash","type":"bytes32"},{"name":"claimant","type":"address"},{"name":"paid","type":"uint256"},{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"bytes"},{"name":"claimant","type":"address"},{"name":"email","type":"string"}],"name":"submitCombinedClaim","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"_priceOracle","type":"address"},{"name":"_registrar","type":"address"},{"name":"_ratifier","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"claimed","type":"string"},{"indexed":false,"name":"dnsname","type":"bytes"},{"indexed":false,"name":"paid","type":"uint256"},{"indexed":false,"name":"claimant","type":"address"},{"indexed":false,"name":"email","type":"string"}],"name":"ClaimSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"claimId","type":"bytes32"},{"indexed":false,"name":"status","type":"uint8"}],"name":"ClaimStatusChanged","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620033af380380620033af833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548160ff02191690836002811115620000fe57fe5b02179055506200011e3360006200014260201b620025621790919060201c565b620001398160016200014260201b620025621790919060201c565b5050506200028b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200017d57600080fd5b6200018f8282620001f860201b60201c565b156200019a57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200023457600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613114806200029b6000396000f3fe60806040526004361061014b5760003560e01c806384fd49c9116100b6578063c9fa06631161006f578063c9fa066314610aa6578063cfee88db14610b81578063d4f6841d14610b98578063e0f5409714610c1e578063eff0f59214610c49578063fb2f72d014610ce75761014b565b806384fd49c9146106385780639d6017471461064f578063a1169b7714610879578063a8712e8c146108c0578063b1c9fe6e14610a32578063c1203cb814610a6b5761014b565b80634d4de844116101085780634d4de8441461031c5780635a41ef3a1461048e57806365e3f8fa146104b95780637065cb48146105955780637cb68aa2146105e657806383197ef0146106215761014b565b8063173825d9146101505780632630c12f146101a15780632b20e397146101f85780633e08e84d1461024f5780633e6be3d2146102a057806341e6af01146102cb575b600080fd5b34801561015c57600080fd5b5061019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e59565b005b3480156101ad57600080fd5b506101b6610ef6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561020457600080fd5b5061020d610f1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025b57600080fd5b5061029e6004803603602081101561027257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f42565b005b3480156102ac57600080fd5b506102b5610fdf565b6040518082815260200191505060405180910390f35b3480156102d757600080fd5b5061031a600480360360208110156102ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fe5565b005b61048c6004803603606081101561033257600080fd5b810190808035906020019064010000000081111561034f57600080fd5b82018360208201111561036157600080fd5b8035906020019184600183028401116401000000008311171561038357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561040657600080fd5b82018360208201111561041857600080fd5b8035906020019184600183028401116401000000008311171561043a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611082565b005b34801561049a57600080fd5b506104a3611113565b6040518082815260200191505060405180910390f35b3480156104c557600080fd5b5061057f600480360360208110156104dc57600080fd5b81019080803590602001906401000000008111156104f957600080fd5b82018360208201111561050b57600080fd5b8035906020019184600183028401116401000000008311171561052d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611119565b6040518082815260200191505060405180910390f35b3480156105a157600080fd5b506105e4600480360360208110156105b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061124a565b005b3480156105f257600080fd5b5061061f6004803603602081101561060957600080fd5b81019080803590602001909291905050506112e7565b005b34801561062d57600080fd5b50610636611534565b005b34801561064457600080fd5b5061064d611686565b005b34801561065b57600080fd5b506108636004803603608081101561067257600080fd5b810190808035906020019064010000000081111561068f57600080fd5b8201836020820111156106a157600080fd5b803590602001918460018302840111640100000000831117156106c357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072657600080fd5b82018360208201111561073857600080fd5b8035906020019184600183028401116401000000008311171561075a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506117de565b6040518082815260200191505060405180910390f35b34801561088557600080fd5b506108be6004803603604081101561089c57600080fd5b810190808035906020019092919080351515906020019092919050505061186d565b005b610a30600480360360608110156108d657600080fd5b81019080803590602001906401000000008111156108f357600080fd5b82018360208201111561090557600080fd5b8035906020019184600183028401116401000000008311171561092757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111640100000000831117156109de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c19565b005b348015610a3e57600080fd5b50610a47611c3a565b60405180826002811115610a5757fe5b60ff16815260200191505060405180910390f35b348015610a7757600080fd5b50610aa460048036036020811015610a8e57600080fd5b8101908080359060200190929190505050611c4d565b005b348015610ab257600080fd5b50610b7f60048036036040811015610ac957600080fd5b8101908080359060200190640100000000811115610ae657600080fd5b820183602082011115610af857600080fd5b80359060200191846020830284011164010000000083111715610b1a57600080fd5b909192939192939080359060200190640100000000811115610b3b57600080fd5b820183602082011115610b4d57600080fd5b80359060200191846020830284011164010000000083111715610b6f57600080fd5b909192939192939050505061213d565b005b348015610b8d57600080fd5b50610b966121bb565b005b348015610ba457600080fd5b50610c1c60048036036020811015610bbb57600080fd5b8101908080359060200190640100000000811115610bd857600080fd5b820183602082011115610bea57600080fd5b80359060200191846020830284011164010000000083111715610c0c57600080fd5b9091929391929390505050612304565b005b348015610c2a57600080fd5b50610c33612342565b6040518082815260200191505060405180910390f35b348015610c5557600080fd5b50610c8260048036036020811015610c6c57600080fd5b810190808035906020019092919050505061234a565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001826003811115610cd057fe5b60ff16815260200194505050505060405180910390f35b610e5760048036036060811015610cfd57600080fd5b8101908080359060200190640100000000811115610d1a57600080fd5b820183602082011115610d2c57600080fd5b80359060200191846001830284011164010000000083111715610d4e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd157600080fd5b820183602082011115610de357600080fd5b80359060200191846001830284011164010000000083111715610e0557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123a7565b005b610e6d33600061242590919063ffffffff16565b610edf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b610ef38160006124b790919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f5633600161242590919063ffffffff16565b610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b610fdc8160016124b790919063ffffffff16565b50565b60065481565b610ff933600161242590919063ffffffff16565b61106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b61107f81600161256290919063ffffffff16565b50565b606061108f84600061260e565b90506110df60038251036040518060400160405280600381526020017f6574680000000000000000000000000000000000000000000000000000000000815250836126cc9092919063ffffffff16565b6110e857600080fd5b61110d61110560006003845103846126f69092919063ffffffff16565b858585612769565b50505050565b60075481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350e9a7158360006301e133806040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111bc5780820151818401526020810190506111a1565b50505050905090810190601f1680156111e95780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561120857600080fd5b505afa15801561121c573d6000803e3d6000fd5b505050506040513d602081101561123257600080fd5b81019080805190602001909291905050509050919050565b61125e33600061242590919063ffffffff16565b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b6112e481600061256290919063ffffffff16565b50565b6112ef613057565b60046000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff16600381111561139557fe5b60038111156113a057fe5b815250509050806020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e257600080fd5b600060038111156113ef57fe5b816060015160038111156113ff57fe5b141561141d5760066000815480929190600190039190505550611431565b600760008154809291906001900391905055505b61143e8160200151612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f19350505050158015611487573d6000803e3d6000fd5b50817f698a3a7f5c0bc9915a6f167e9ce03ffc660392e807cf6fd57fd9ae52063dd27b6003604051808260038111156114bc57fe5b60ff16815260200191505060405180910390a2600460008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160006101000a81549060ff021916905550505050565b61154833600061242590919063ffffffff16565b6115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b60028060028111156115c857fe5b600860009054906101000a900460ff1660028111156115e357fe5b14611656576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b60006007541461166557600080fd5b61166e33612cb4565b73ffffffffffffffffffffffffffffffffffffffff16ff5b61169a33600161242590919063ffffffff16565b61170c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b600180600281111561171a57fe5b600860009054906101000a900460ff16600281111561173557fe5b146117a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b6000600654146117b757600080fd5b6002600860006101000a81548160ff021916908360028111156117d657fe5b021790555050565b600084805190602001208480519060200120848480519060200120604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001945050505050604051602081830303815290604052805190602001209050949350505050565b600180600281111561187b57fe5b600860009054906101000a900460ff16600281111561189657fe5b14611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b61191d33600061242590919063ffffffff16565b80611938575061193733600161242590919063ffffffff16565b5b61194157600080fd5b611949613057565b60046000858152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660038111156119ef57fe5b60038111156119fa57fe5b8152505090506000816040015111611a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f436c61696d206e6f7420666f756e64000000000000000000000000000000000081525060200191505060405180910390fd5b60006003811115611a8757fe5b81606001516003811115611a9757fe5b1415611ac75760066000815480929190600190039190505550600760008154809291906001019190505550611b1c565b60016003811115611ad457fe5b81606001516003811115611ae457fe5b1415611b1b576000600560008360000151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b8215611b8257600560008260000151815260200190815260200160002060009054906101000a900460ff1615611b5157600080fd5b6001600560008360000151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600083611b90576002611b93565b60015b9050806004600087815260200190815260200160002060030160006101000a81548160ff02191690836003811115611bc757fe5b0217905550847f698a3a7f5c0bc9915a6f167e9ce03ffc660392e807cf6fd57fd9ae52063dd27b8260405180826003811115611bff57fe5b60ff16815260200191505060405180910390a25050505050565b6060611c2684600061260e565b9050611c3481858585612769565b50505050565b600860009054906101000a900460ff1681565b6002806002811115611c5b57fe5b600860009054906101000a900460ff166002811115611c7657fe5b14611ce9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b611cf1613057565b60046000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff166003811115611d9757fe5b6003811115611da257fe5b8152505090506000816040015111611e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f436c61696d206e6f7420666f756e64000000000000000000000000000000000081525060200191505060405180910390fd5b60016003811115611e2f57fe5b81606001516003811115611e3f57fe5b141561203b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fca247ac826000015160001c83602001516301e133806040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d6020811015611f2f57600080fd5b810190808051906020019092919050505050611fec600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fac57600080fd5b505afa158015611fc0573d6000803e3d6000fd5b505050506040513d6020811015611fd657600080fd5b8101908080519060200190929190505050612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f19350505050158015612035573d6000803e3d6000fd5b506120c4565b6002600381111561204857fe5b8160600151600381111561205857fe5b14156120ba5761206b8160200151612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f193505050501580156120b4573d6000803e3d6000fd5b506120c3565b60006120c257fe5b5b5b60076000815480929190600190039190505550600460008481526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160006101000a81549060ff02191690555050505050565b60008090505b848490508110156121785761216b85858381811061215d57fe5b90506020020135600161186d565b8080600101915050612143565b5060008090505b828290508110156121b4576121a783838381811061219957fe5b90506020020135600061186d565b808060010191505061217f565b5050505050565b6121cf33600061242590919063ffffffff16565b612241576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b600080600281111561224f57fe5b600860009054906101000a900460ff16600281111561226a57fe5b146122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b6001600860006101000a81548160ff021916908360028111156122fc57fe5b021790555050565b60008090505b8282905081101561233d5761233083838381811061232457fe5b90506020020135611c4d565b808060010191505061230a565b505050565b6301e1338081565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16905084565b60606123b484600061260e565b905060606123c385600161260e565b90506123cd6130a3565b6123e4825184510182612cbe90919063ffffffff16565b506123f88382612d1290919063ffffffff16565b5061240c8282612d1290919063ffffffff16565b5061241d8160000151878787612769565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561246057600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f157600080fd5b6124fb8282612425565b61250457600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259c57600080fd5b6125a68282612425565b156125b057600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600080905060008090505b8381101561266e57845182106126445760405180602001604052806000815250925050506126c6565b60016126598387612d3490919063ffffffff16565b0160ff1682019150808060010191505061261b565b508351811061268f57604051806020016040528060008152509150506126c6565b60006126a48286612d3490919063ffffffff16565b60ff1690506126c16001830182876126f69092919063ffffffff16565b925050505b92915050565b6000815183018451101580156126ed57506126ec84848460008651612d58565b5b90509392505050565b60608351828401111561270857600080fd5b6060826040519080825280601f01601f19166020018201604052801561273d5781602001600182028038833980820191505090505b509050600080602083019150856020880101905061275c828287612d7c565b8293505050509392505050565b600080600281111561277757fe5b600860009054906101000a900460ff16600281111561279257fe5b14612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b600061281086612dc5565b905060038110158015612824575060068111155b61282d57600080fd5b600061283b878787876117de565b905060006004600083815260200190815260200160002060020154146128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436c61696d20616c7265616479207375626d697474656400000000000000000081525060200191505060405180910390fd5b60006128d687600261260e565b511461294a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e616d65206d757374206265206120324c44000000000000000000000000000081525060200191505060405180910390fd5b600061295588611119565b9050803410156129b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806130be6022913960400191505060405180910390fd5b80341115612a02573373ffffffffffffffffffffffffffffffffffffffff166108fc8234039081150290604051600060405180830381858888f19350505050158015612a00573d6000803e3d6000fd5b505b6040518060800160405280898051906020012081526020018773ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160006003811115612a4957fe5b815250600460008481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff02191690836003811115612ade57fe5b02179055509050506006600081548092919060010191905055507f186f55cfb37bd38b311b8d5e8a212edf83c4d92107f48dbb7a4a5c217714eab188888389896040518080602001806020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001848103845289818151815260200191508051906020019080838360005b83811015612b9e578082015181840152602081019050612b83565b50505050905090810190601f168015612bcb5780820380516001836020036101000a031916815260200191505b50848103835288818151815260200191508051906020019080838360005b83811015612c04578082015181840152602081019050612be9565b50505050905090810190601f168015612c315780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612c6a578082015181840152602081019050612c4f565b50505050905090810190601f168015612c975780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a15050505050505050565b6000819050919050565b612cc66130a3565b600060208381612cd257fe5b0614612ceb5760208281612ce257fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b612d1a6130a3565b612d2c83846000015151848551612f3b565b905092915050565b6000828281518110612d4257fe5b602001015160f81c60f81b60f81c905092915050565b6000612d65848484612ff4565b612d70878785612ff4565b14905095945050505050565b5b60208110612da05781518352602083019250602082019150602081039050612d7d565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6000806000809050600084519050600092505b80821015612f30576000858381518110612dee57fe5b602001015160f81c60f81b9050608060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612e3457600183019250612f22565b60e060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612e6d57600283019250612f21565b60f060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612ea657600383019250612f20565b60f8801b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612ede57600483019250612f1f565b60fc60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612f1757600583019250612f1e565b6006830192505b5b5b5b5b508280600101935050612dd8565b829350505050919050565b612f436130a3565b8251821115612f5157600080fd5b84602001518285011115612f7c57612f7b856002612f758860200151888701613017565b02613033565b5b600080865180518760208301019350808887011115612f9b5787860182525b60208701925050505b60208410612fc75780518252602082019150602081019050602084039350612fa4565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b60008351828401111561300657600080fd5b818360208601012090509392505050565b6000818311156130295782905061302d565b8190505b92915050565b6060826000015190506130468383612cbe565b506130518382612d12565b50505050565b604051806080016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000600381111561309d57fe5b81525090565b60405180604001604052806060815260200160008152509056fe496e73756666696369656e742066756e647320666f72207265736572766174696f6ea265627a7a723058209a419cd1bb289ec131e1647267278fa7013b2d937091e25901423b4f734f0a4064736f6c634300050a0032000000000000000000000000b9d374d0fe3d8341155663fae31b7beae0ae233a000000000000000000000000fac7bea255a6990f749363002136af6556b31e04000000000000000000000000b8c2c29ee19d8307cb7255e1cd9cbde883a267d5
Deployed Bytecode
0x60806040526004361061014b5760003560e01c806384fd49c9116100b6578063c9fa06631161006f578063c9fa066314610aa6578063cfee88db14610b81578063d4f6841d14610b98578063e0f5409714610c1e578063eff0f59214610c49578063fb2f72d014610ce75761014b565b806384fd49c9146106385780639d6017471461064f578063a1169b7714610879578063a8712e8c146108c0578063b1c9fe6e14610a32578063c1203cb814610a6b5761014b565b80634d4de844116101085780634d4de8441461031c5780635a41ef3a1461048e57806365e3f8fa146104b95780637065cb48146105955780637cb68aa2146105e657806383197ef0146106215761014b565b8063173825d9146101505780632630c12f146101a15780632b20e397146101f85780633e08e84d1461024f5780633e6be3d2146102a057806341e6af01146102cb575b600080fd5b34801561015c57600080fd5b5061019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e59565b005b3480156101ad57600080fd5b506101b6610ef6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561020457600080fd5b5061020d610f1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025b57600080fd5b5061029e6004803603602081101561027257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f42565b005b3480156102ac57600080fd5b506102b5610fdf565b6040518082815260200191505060405180910390f35b3480156102d757600080fd5b5061031a600480360360208110156102ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fe5565b005b61048c6004803603606081101561033257600080fd5b810190808035906020019064010000000081111561034f57600080fd5b82018360208201111561036157600080fd5b8035906020019184600183028401116401000000008311171561038357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561040657600080fd5b82018360208201111561041857600080fd5b8035906020019184600183028401116401000000008311171561043a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611082565b005b34801561049a57600080fd5b506104a3611113565b6040518082815260200191505060405180910390f35b3480156104c557600080fd5b5061057f600480360360208110156104dc57600080fd5b81019080803590602001906401000000008111156104f957600080fd5b82018360208201111561050b57600080fd5b8035906020019184600183028401116401000000008311171561052d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611119565b6040518082815260200191505060405180910390f35b3480156105a157600080fd5b506105e4600480360360208110156105b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061124a565b005b3480156105f257600080fd5b5061061f6004803603602081101561060957600080fd5b81019080803590602001909291905050506112e7565b005b34801561062d57600080fd5b50610636611534565b005b34801561064457600080fd5b5061064d611686565b005b34801561065b57600080fd5b506108636004803603608081101561067257600080fd5b810190808035906020019064010000000081111561068f57600080fd5b8201836020820111156106a157600080fd5b803590602001918460018302840111640100000000831117156106c357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561072657600080fd5b82018360208201111561073857600080fd5b8035906020019184600183028401116401000000008311171561075a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506117de565b6040518082815260200191505060405180910390f35b34801561088557600080fd5b506108be6004803603604081101561089c57600080fd5b810190808035906020019092919080351515906020019092919050505061186d565b005b610a30600480360360608110156108d657600080fd5b81019080803590602001906401000000008111156108f357600080fd5b82018360208201111561090557600080fd5b8035906020019184600183028401116401000000008311171561092757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111640100000000831117156109de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c19565b005b348015610a3e57600080fd5b50610a47611c3a565b60405180826002811115610a5757fe5b60ff16815260200191505060405180910390f35b348015610a7757600080fd5b50610aa460048036036020811015610a8e57600080fd5b8101908080359060200190929190505050611c4d565b005b348015610ab257600080fd5b50610b7f60048036036040811015610ac957600080fd5b8101908080359060200190640100000000811115610ae657600080fd5b820183602082011115610af857600080fd5b80359060200191846020830284011164010000000083111715610b1a57600080fd5b909192939192939080359060200190640100000000811115610b3b57600080fd5b820183602082011115610b4d57600080fd5b80359060200191846020830284011164010000000083111715610b6f57600080fd5b909192939192939050505061213d565b005b348015610b8d57600080fd5b50610b966121bb565b005b348015610ba457600080fd5b50610c1c60048036036020811015610bbb57600080fd5b8101908080359060200190640100000000811115610bd857600080fd5b820183602082011115610bea57600080fd5b80359060200191846020830284011164010000000083111715610c0c57600080fd5b9091929391929390505050612304565b005b348015610c2a57600080fd5b50610c33612342565b6040518082815260200191505060405180910390f35b348015610c5557600080fd5b50610c8260048036036020811015610c6c57600080fd5b810190808035906020019092919050505061234a565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001826003811115610cd057fe5b60ff16815260200194505050505060405180910390f35b610e5760048036036060811015610cfd57600080fd5b8101908080359060200190640100000000811115610d1a57600080fd5b820183602082011115610d2c57600080fd5b80359060200191846001830284011164010000000083111715610d4e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd157600080fd5b820183602082011115610de357600080fd5b80359060200191846001830284011164010000000083111715610e0557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506123a7565b005b610e6d33600061242590919063ffffffff16565b610edf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b610ef38160006124b790919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f5633600161242590919063ffffffff16565b610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b610fdc8160016124b790919063ffffffff16565b50565b60065481565b610ff933600161242590919063ffffffff16565b61106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b61107f81600161256290919063ffffffff16565b50565b606061108f84600061260e565b90506110df60038251036040518060400160405280600381526020017f6574680000000000000000000000000000000000000000000000000000000000815250836126cc9092919063ffffffff16565b6110e857600080fd5b61110d61110560006003845103846126f69092919063ffffffff16565b858585612769565b50505050565b60075481565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350e9a7158360006301e133806040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111bc5780820151818401526020810190506111a1565b50505050905090810190601f1680156111e95780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561120857600080fd5b505afa15801561121c573d6000803e3d6000fd5b505050506040513d602081101561123257600080fd5b81019080805190602001909291905050509050919050565b61125e33600061242590919063ffffffff16565b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b6112e481600061256290919063ffffffff16565b50565b6112ef613057565b60046000838152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff16600381111561139557fe5b60038111156113a057fe5b815250509050806020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e257600080fd5b600060038111156113ef57fe5b816060015160038111156113ff57fe5b141561141d5760066000815480929190600190039190505550611431565b600760008154809291906001900391905055505b61143e8160200151612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f19350505050158015611487573d6000803e3d6000fd5b50817f698a3a7f5c0bc9915a6f167e9ce03ffc660392e807cf6fd57fd9ae52063dd27b6003604051808260038111156114bc57fe5b60ff16815260200191505060405180910390a2600460008381526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160006101000a81549060ff021916905550505050565b61154833600061242590919063ffffffff16565b6115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b60028060028111156115c857fe5b600860009054906101000a900460ff1660028111156115e357fe5b14611656576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b60006007541461166557600080fd5b61166e33612cb4565b73ffffffffffffffffffffffffffffffffffffffff16ff5b61169a33600161242590919063ffffffff16565b61170c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616c6c6572206d75737420626520612072617469666965720000000000000081525060200191505060405180910390fd5b600180600281111561171a57fe5b600860009054906101000a900460ff16600281111561173557fe5b146117a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b6000600654146117b757600080fd5b6002600860006101000a81548160ff021916908360028111156117d657fe5b021790555050565b600084805190602001208480519060200120848480519060200120604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001945050505050604051602081830303815290604052805190602001209050949350505050565b600180600281111561187b57fe5b600860009054906101000a900460ff16600281111561189657fe5b14611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b61191d33600061242590919063ffffffff16565b80611938575061193733600161242590919063ffffffff16565b5b61194157600080fd5b611949613057565b60046000858152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff1660038111156119ef57fe5b60038111156119fa57fe5b8152505090506000816040015111611a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f436c61696d206e6f7420666f756e64000000000000000000000000000000000081525060200191505060405180910390fd5b60006003811115611a8757fe5b81606001516003811115611a9757fe5b1415611ac75760066000815480929190600190039190505550600760008154809291906001019190505550611b1c565b60016003811115611ad457fe5b81606001516003811115611ae457fe5b1415611b1b576000600560008360000151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b8215611b8257600560008260000151815260200190815260200160002060009054906101000a900460ff1615611b5157600080fd5b6001600560008360000151815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600083611b90576002611b93565b60015b9050806004600087815260200190815260200160002060030160006101000a81548160ff02191690836003811115611bc757fe5b0217905550847f698a3a7f5c0bc9915a6f167e9ce03ffc660392e807cf6fd57fd9ae52063dd27b8260405180826003811115611bff57fe5b60ff16815260200191505060405180910390a25050505050565b6060611c2684600061260e565b9050611c3481858585612769565b50505050565b600860009054906101000a900460ff1681565b6002806002811115611c5b57fe5b600860009054906101000a900460ff166002811115611c7657fe5b14611ce9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b611cf1613057565b60046000848152602001908152602001600020604051806080016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820160009054906101000a900460ff166003811115611d9757fe5b6003811115611da257fe5b8152505090506000816040015111611e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f436c61696d206e6f7420666f756e64000000000000000000000000000000000081525060200191505060405180910390fd5b60016003811115611e2f57fe5b81606001516003811115611e3f57fe5b141561203b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fca247ac826000015160001c83602001516301e133806040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d6020811015611f2f57600080fd5b810190808051906020019092919050505050611fec600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fac57600080fd5b505afa158015611fc0573d6000803e3d6000fd5b505050506040513d6020811015611fd657600080fd5b8101908080519060200190929190505050612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f19350505050158015612035573d6000803e3d6000fd5b506120c4565b6002600381111561204857fe5b8160600151600381111561205857fe5b14156120ba5761206b8160200151612cb4565b73ffffffffffffffffffffffffffffffffffffffff166108fc82604001519081150290604051600060405180830381858888f193505050501580156120b4573d6000803e3d6000fd5b506120c3565b60006120c257fe5b5b5b60076000815480929190600190039190505550600460008481526020019081526020016000206000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028201600090556003820160006101000a81549060ff02191690555050505050565b60008090505b848490508110156121785761216b85858381811061215d57fe5b90506020020135600161186d565b8080600101915050612143565b5060008090505b828290508110156121b4576121a783838381811061219957fe5b90506020020135600061186d565b808060010191505061217f565b5050505050565b6121cf33600061242590919063ffffffff16565b612241576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206d75737420626520616e206f776e657200000000000000000081525060200191505060405180910390fd5b600080600281111561224f57fe5b600860009054906101000a900460ff16600281111561226a57fe5b146122dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b6001600860006101000a81548160ff021916908360028111156122fc57fe5b021790555050565b60008090505b8282905081101561233d5761233083838381811061232457fe5b90506020020135611c4d565b808060010191505061230a565b505050565b6301e1338081565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030160009054906101000a900460ff16905084565b60606123b484600061260e565b905060606123c385600161260e565b90506123cd6130a3565b6123e4825184510182612cbe90919063ffffffff16565b506123f88382612d1290919063ffffffff16565b5061240c8282612d1290919063ffffffff16565b5061241d8160000151878787612769565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561246057600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f157600080fd5b6124fb8282612425565b61250457600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259c57600080fd5b6125a68282612425565b156125b057600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600080905060008090505b8381101561266e57845182106126445760405180602001604052806000815250925050506126c6565b60016126598387612d3490919063ffffffff16565b0160ff1682019150808060010191505061261b565b508351811061268f57604051806020016040528060008152509150506126c6565b60006126a48286612d3490919063ffffffff16565b60ff1690506126c16001830182876126f69092919063ffffffff16565b925050505b92915050565b6000815183018451101580156126ed57506126ec84848460008651612d58565b5b90509392505050565b60608351828401111561270857600080fd5b6060826040519080825280601f01601f19166020018201604052801561273d5781602001600182028038833980820191505090505b509050600080602083019150856020880101905061275c828287612d7c565b8293505050509392505050565b600080600281111561277757fe5b600860009054906101000a900460ff16600281111561279257fe5b14612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f7420696e207265717569726564207068617365000000000000000000000081525060200191505060405180910390fd5b600061281086612dc5565b905060038110158015612824575060068111155b61282d57600080fd5b600061283b878787876117de565b905060006004600083815260200190815260200160002060020154146128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436c61696d20616c7265616479207375626d697474656400000000000000000081525060200191505060405180910390fd5b60006128d687600261260e565b511461294a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e616d65206d757374206265206120324c44000000000000000000000000000081525060200191505060405180910390fd5b600061295588611119565b9050803410156129b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806130be6022913960400191505060405180910390fd5b80341115612a02573373ffffffffffffffffffffffffffffffffffffffff166108fc8234039081150290604051600060405180830381858888f19350505050158015612a00573d6000803e3d6000fd5b505b6040518060800160405280898051906020012081526020018773ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160006003811115612a4957fe5b815250600460008481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff02191690836003811115612ade57fe5b02179055509050506006600081548092919060010191905055507f186f55cfb37bd38b311b8d5e8a212edf83c4d92107f48dbb7a4a5c217714eab188888389896040518080602001806020018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001848103845289818151815260200191508051906020019080838360005b83811015612b9e578082015181840152602081019050612b83565b50505050905090810190601f168015612bcb5780820380516001836020036101000a031916815260200191505b50848103835288818151815260200191508051906020019080838360005b83811015612c04578082015181840152602081019050612be9565b50505050905090810190601f168015612c315780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612c6a578082015181840152602081019050612c4f565b50505050905090810190601f168015612c975780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a15050505050505050565b6000819050919050565b612cc66130a3565b600060208381612cd257fe5b0614612ceb5760208281612ce257fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b612d1a6130a3565b612d2c83846000015151848551612f3b565b905092915050565b6000828281518110612d4257fe5b602001015160f81c60f81b60f81c905092915050565b6000612d65848484612ff4565b612d70878785612ff4565b14905095945050505050565b5b60208110612da05781518352602083019250602082019150602081039050612d7d565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6000806000809050600084519050600092505b80821015612f30576000858381518110612dee57fe5b602001015160f81c60f81b9050608060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612e3457600183019250612f22565b60e060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612e6d57600283019250612f21565b60f060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612ea657600383019250612f20565b60f8801b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612ede57600483019250612f1f565b60fc60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612f1757600583019250612f1e565b6006830192505b5b5b5b5b508280600101935050612dd8565b829350505050919050565b612f436130a3565b8251821115612f5157600080fd5b84602001518285011115612f7c57612f7b856002612f758860200151888701613017565b02613033565b5b600080865180518760208301019350808887011115612f9b5787860182525b60208701925050505b60208410612fc75780518252602082019150602081019050602084039350612fa4565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b60008351828401111561300657600080fd5b818360208601012090509392505050565b6000818311156130295782905061302d565b8190505b92915050565b6060826000015190506130468383612cbe565b506130518382612d12565b50505050565b604051806080016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000600381111561309d57fe5b81525090565b60405180604001604052806060815260200160008152509056fe496e73756666696369656e742066756e647320666f72207265736572766174696f6ea265627a7a723058209a419cd1bb289ec131e1647267278fa7013b2d937091e25901423b4f734f0a4064736f6c634300050a0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b9d374d0fe3d8341155663fae31b7beae0ae233a000000000000000000000000fac7bea255a6990f749363002136af6556b31e04000000000000000000000000b8c2c29ee19d8307cb7255e1cd9cbde883a267d5
-----Decoded View---------------
Arg [0] : _priceOracle (address): 0xB9d374d0fE3D8341155663FaE31b7BeAe0aE233A
Arg [1] : _registrar (address): 0xFaC7BEA255a6990f749363002136aF6556b31e04
Arg [2] : _ratifier (address): 0xb8c2C29ee19D8307cb7255e1Cd9CbDE883A267d5
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b9d374d0fe3d8341155663fae31b7beae0ae233a
Arg [1] : 000000000000000000000000fac7bea255a6990f749363002136af6556b31e04
Arg [2] : 000000000000000000000000b8c2c29ee19d8307cb7255e1cd9cbde883a267d5
Deployed Bytecode Sourcemap
35604:12459:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37349:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37349:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37349:94:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36196:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36196:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36233;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36233:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37562:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37562:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37562:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36357:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36357:25:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37451:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37451:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37451:103:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;41198:344;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41198:344:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;41198:344:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41198:344:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41198:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;41198:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;41198:344:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41198:344:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41198:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;41198:344:0;;;;;;;;;;;;;;;:::i;:::-;;36389:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36389:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38487:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38487:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38487:147:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38487:147:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38487:147:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38487:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38487:147:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37253:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37253:88:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37253:88:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;46008:485;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46008:485:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46008:485:0;;;;;;;;;;;;;;;;;:::i;:::-;;42313:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42313:154:0;;;:::i;:::-;;41948:205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41948:205:0;;;:::i;:::-;;38031:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38031:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;38031:272:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38031:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38031:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38031:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38031:272:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38031:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38031:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38031:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38031:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38031:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38031:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38031:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38031:272:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42800:1094;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42800:1094:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42800:1094:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39265:213;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39265:213:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39265:213:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39265:213:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39265:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39265:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39265:213:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39265:213:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39265:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39265:213:0;;;;;;;;;;;;;;;:::i;:::-;;36424:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36424:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44722:751;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44722:751:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44722:751:0;;;;;;;;;;;;;;;;;:::i;:::-;;44164:326;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44164:326:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44164:326:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;44164:326:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44164:326:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44164:326:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;44164:326:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44164:326:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44164:326:0;;;;;;;;;;;;:::i;:::-;;41658:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41658:101:0;;;:::i;:::-;;45639:173;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45639:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45639:173:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;45639:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45639:173:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45639:173:0;;;;;;;;;;;;:::i;:::-;;35671:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35671:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36270:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36270:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36270:37:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40108:458;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40108:458:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40108:458:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40108:458:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40108:458:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40108:458:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40108:458:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40108:458:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40108:458:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40108:458:0;;;;;;;;;;;;;;;:::i;:::-;;37349:94;36940:22;36951:10;36940:6;:10;;:22;;;;:::i;:::-;36932:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37415:20;37429:5;37415:6;:13;;:20;;;;:::i;:::-;37349:94;:::o;36196:30::-;;;;;;;;;;;;;:::o;36233:::-;;;;;;;;;;;;;:::o;37562:109::-;37061:25;37075:10;37061:9;:13;;:25;;;;:::i;:::-;37053:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37637:26;37654:8;37637:9;:16;;:26;;;;:::i;:::-;37562:109;:::o;36357:25::-;;;;:::o;37451:103::-;37061:25;37075:10;37061:9;:13;;:25;;;;:::i;:::-;37053:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37523:23;37537:8;37523:9;:13;;:23;;;;:::i;:::-;37451:103;:::o;41198:344::-;41309:23;41341:17;41350:4;41356:1;41341:8;:17::i;:::-;41309:50;;41378:54;41416:1;41396:10;:17;:21;41419:12;;;;;;;;;;;;;;;;;41378:10;:17;;:54;;;;;:::i;:::-;41370:63;;;;;;41444:90;41463:46;41484:1;41507;41487:10;:17;:21;41463:10;:20;;:46;;;;;:::i;:::-;41512:4;41518:8;41528:5;41444:11;:90::i;:::-;41198:344;;;;:::o;36389:28::-;;;;:::o;38487:147::-;38552:4;38576:11;;;;;;;;;;;:17;;;38594:7;38603:1;35714:8;38576:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;38576:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38576:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38576:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38576:50:0;;;;;;;;;;;;;;;;38569:57;;38487:147;;;:::o;37253:88::-;36940:22;36951:10;36940:6;:10;;:22;;;;:::i;:::-;36932:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37316:17;37327:5;37316:6;:10;;:17;;;;:::i;:::-;37253:88;:::o;46008:485::-;46068:18;;:::i;:::-;46089:6;:15;46096:7;46089:15;;;;;;;;;;;46068:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46177:5;:14;;;46163:28;;:10;:28;;;46155:37;;;;;;46224:14;46208:30;;;;;;;;:5;:12;;;:30;;;;;;;;;46205:128;;;46255:13;;:15;;;;;;;;;;;;;;46205:128;;;46303:16;;:18;;;;;;;;;;;;;;46205:128;46345:25;46355:5;:14;;;46345:9;:25::i;:::-;:34;;:46;46380:5;:10;;;46345:46;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46345:46:0;46426:7;46407:45;46435:16;46407:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;46470:6;:15;46477:7;46470:15;;;;;;;;;;;;46463:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46008:485;;:::o;42313:154::-;36940:22;36951:10;36940:6;:10;;:22;;;;:::i;:::-;36932:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42359:11;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:1;42391:16;;:21;42383:30;;;;;;42437:21;42447:10;42437:9;:21::i;:::-;42424:35;;;41948:205;37061:25;37075:10;37061:9;:13;;:25;;;;:::i;:::-;37053:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42002:12;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42113:1;42096:13;;:18;42088:27;;;;;;42134:11;42126:5;;:19;;;;;;;;;;;;;;;;;;;;;;;;37127:1;41948:205::o;38031:272::-;38159:7;38229;38213:25;;;;;;38250:7;38240:18;;;;;;38260:8;38286:5;38270:23;;;;;;38196:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;38196:98:0;;;38186:109;;;;;;38179:116;;38031:272;;;;;;:::o;42800:1094::-;42871:12;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42951:22;42962:10;42951:6;:10;;:22;;;;:::i;:::-;:51;;;;42977:25;42991:10;42977:9;:13;;:25;;;;:::i;:::-;42951:51;42943:60;;;;;;43016:18;;:::i;:::-;43037:6;:15;43044:7;43037:15;;;;;;;;;;;43016:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43084:1;43071:5;:10;;;:14;43063:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43137:14;43121:30;;;;;;;;:5;:12;;;:30;;;;;;;;;43118:357;;;43242:13;;:15;;;;;;;;;;;;;;43270:16;;:18;;;;;;;;;;;;;43118:357;;;43325:15;43309:31;;;;;;;;:5;:12;;;:31;;;;;;;;;43306:169;;;43458:5;43425:13;:30;43439:5;:15;;;43425:30;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;43306:169;43118:357;43600:8;43597:128;;;43632:13;:30;43646:5;:15;;;43632:30;;;;;;;;;;;;;;;;;;;;;43631:31;43623:40;;;;;;43709:4;43676:13;:30;43690:5;:15;;;43676:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43597:128;43737:13;43753:8;:40;;43778:15;43753:40;;;43762:15;43753:40;43737:56;;43829:6;43804;:15;43811:7;43804:15;;;;;;;;;;;:22;;;:31;;;;;;;;;;;;;;;;;;;;;;;;43870:7;43851:35;43879:6;43851:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;37236:1;;42800:1094;;;:::o;39265:213::-;39375:21;39399:17;39408:4;39414:1;39399:8;:17::i;:::-;39375:41;;39427:43;39439:7;39448:4;39454:8;39464:5;39427:11;:43::i;:::-;39265:213;;;;:::o;36424:18::-;;;;;;;;;;;;;:::o;44722:751::-;44776:11;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44800:18;;:::i;:::-;44821:6;:15;44828:7;44821:15;;;;;;;;;;;44800:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44868:1;44855:5;:10;;;:14;44847:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44921:15;44905:31;;;;;;;;:5;:12;;;:31;;;;;;;;;44902:500;;;44953:9;;;;;;;;;;;:18;;;44980:5;:15;;;44972:24;;44998:5;:14;;;35714:8;44953:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44953:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44953:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44953:81:0;;;;;;;;;;;;;;;;;45049:28;45059:9;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45059:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45059:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45059:17:0;;;;;;;;;;;;;;;;45049:9;:28::i;:::-;:37;;:49;45087:5;:10;;;45049:49;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45049:49:0;44902:500;;;45135:15;45119:31;;;;;;;;:5;:12;;;:31;;;;;;;;;45116:286;;;45167:25;45177:5;:14;;;45167:9;:25::i;:::-;:34;;:46;45202:5;:10;;;45167:46;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45167:46:0;45116:286;;;45384:5;45377:13;;;;45116:286;44902:500;45414:16;;:18;;;;;;;;;;;;;;45450:6;:15;45457:7;45450:15;;;;;;;;;;;;45443:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37236:1;44722:751;;:::o;44164:326::-;44272:6;44281:1;44272:10;;44268:102;44288:8;;:15;;44284:1;:19;44268:102;;;44325:33;44340:8;;44349:1;44340:11;;;;;;;;;;;;;44353:4;44325:14;:33::i;:::-;44305:3;;;;;;;44268:102;;;;44384:6;44393:1;44384:10;;44380:103;44400:8;;:15;;44396:1;:19;44380:103;;;44437:34;44452:8;;44461:1;44452:11;;;;;;;;;;;;;44465:5;44437:14;:34::i;:::-;44417:3;;;;;;;44380:103;;;;44164:326;;;;:::o;41658:101::-;36940:22;36951:10;36940:6;:10;;:22;;;;:::i;:::-;36932:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41708:10;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41739:12;41731:5;;:20;;;;;;;;;;;;;;;;;;;;;;;;37001:1;41658:101::o;45639:173::-;45715:6;45724:1;45715:10;;45711:94;45731:8;;:15;;45727:1;:19;45711:94;;;45768:25;45781:8;;45790:1;45781:11;;;;;;;;;;;;;45768:12;:25::i;:::-;45748:3;;;;;;;45711:94;;;;45639:173;;:::o;35671:51::-;35714:8;35671:51;:::o;36270:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40108:458::-;40221:23;40253:17;40262:4;40268:1;40253:8;:17::i;:::-;40221:50;;40282:24;40315:17;40324:4;40330:1;40315:8;:17::i;:::-;40282:51;;40344:24;;:::i;:::-;40379:48;40408:11;:18;40388:10;:17;:38;40379:3;:8;;:48;;;;:::i;:::-;;40438:22;40449:10;40438:3;:10;;:22;;;;:::i;:::-;;40471:23;40482:11;40471:3;:10;;:23;;;;:::i;:::-;;40507:51;40526:3;:7;;;40536:4;40542:8;40552:5;40507:11;:51::i;:::-;40108:458;;;;;;:::o;34483:165::-;34555:4;34599:1;34580:21;;:7;:21;;;;34572:30;;;;;;34620:4;:11;;:20;34632:7;34620:20;;;;;;;;;;;;;;;;;;;;;;;;;34613:27;;34483:165;;;;:::o;34200:189::-;34299:1;34280:21;;:7;:21;;;;34272:30;;;;;;34321:18;34325:4;34331:7;34321:3;:18::i;:::-;34313:27;;;;;;34376:5;34353:4;:11;;:20;34365:7;34353:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;34200:189;;:::o;33935:186::-;34031:1;34012:21;;:7;:21;;;;34004:30;;;;;;34054:18;34058:4;34064:7;34054:3;:18::i;:::-;34053:19;34045:28;;;;;;34109:4;34086;:11;;:20;34098:7;34086:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;33935:186;;:::o;47431:501::-;47500:13;47566:11;47580:1;47566:15;;47596:6;47605:1;47596:10;;47592:143;47612:3;47608:1;:7;47592:143;;;47650:4;:11;47640:6;:21;47637:35;;47663:9;;;;;;;;;;;;;;;;;;47637:35;47722:1;47697:22;47712:6;47697:4;:14;;:22;;;;:::i;:::-;:26;47687:36;;;;;;47617:3;;;;;;;47592:143;;;;47801:4;:11;47791:6;:21;47788:35;;47814:9;;;;;;;;;;;;;;;;;47788:35;47834:8;47845:22;47860:6;47845:4;:14;;:22;;;;:::i;:::-;47834:33;;;;47892:31;47916:1;47907:6;:10;47919:3;47892:4;:14;;:31;;;;;:::i;:::-;47878:46;;;;47431:501;;;;;:::o;26805:207::-;26896:4;26944:5;:12;26935:6;:21;26920:4;:11;:36;;:84;;;;;26960:44;26967:4;26973:6;26981:5;26988:1;26991:5;:12;26960:6;:44::i;:::-;26920:84;26913:91;;26805:207;;;;;:::o;31145:407::-;31228:12;31277:4;:11;31270:3;31261:6;:12;:27;;31253:36;;;;;;31302:16;31331:3;31321:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;31321:14:0;;;;31302:33;;31346:9;31366:8;31428:2;31423:3;31419:12;31411:20;;31471:6;31466:2;31460:4;31456:13;31452:26;31445:33;;31499:22;31506:4;31512:3;31517;31499:6;:22::i;:::-;31541:3;31534:10;;;;;31145:407;;;;;:::o;46501:922::-;46620:10;37198:1;37189:10;;;;;;;;:5;;;;;;;;;;;:10;;;;;;;;;37181:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46643:8;46654:16;:7;:14;:16::i;:::-;46643:27;;46696:1;46689:3;:8;;:20;;;;;46708:1;46701:3;:8;;46689:20;46681:29;;;;;;46723:15;46741:46;46756:7;46765:4;46771:8;46781:5;46741:14;:46::i;:::-;46723:64;;46830:1;46806:6;:15;46813:7;46806:15;;;;;;;;;;;:20;;;:25;46798:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46980:1;46951:17;46960:4;46966:1;46951:8;:17::i;:::-;46945:31;:36;46937:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47017:10;47030:21;47043:7;47030:12;:21::i;:::-;47017:34;;47083:5;47070:9;:18;;47062:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47153:5;47141:9;:17;47138:87;;;47175:10;:19;;:38;47207:5;47195:9;:17;47175:38;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47175:38:0;47138:87;47255:65;;;;;;;;47277:7;47261:25;;;;;;47255:65;;;;47288:8;47255:65;;;;;;47298:5;47255:65;;;;47305:14;47255:65;;;;;;;;;;;47237:6;:15;47244:7;47237:15;;;;;;;;;;;:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47331:13;;:15;;;;;;;;;;;;;47362:53;47377:7;47386:4;47392:5;47399:8;47409:5;47362:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;47362: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;47362: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;47362:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37236:1;;;46501:922;;;;;:::o;47940:120::-;47995:15;48046:4;48023:29;;47940:120;;;:::o;12310:468::-;12380:13;;:::i;:::-;12427:1;12421:2;12410:8;:13;;;;;;:18;12406:83;;12474:2;12463:8;:13;;;;;;12457:2;:20;12445:32;;;;12406:83;12561:8;12546:3;:12;;:23;;;;;12621:4;12615:11;12652:3;12647;12640:16;12682:1;12677:3;12670:14;12728:8;12723:3;12719:18;12715:2;12711:27;12705:4;12698:41;12589:161;12767:3;12760:10;;12310:468;;;;:::o;16403:163::-;16480:13;;:::i;:::-;16513:45;16519:3;16524;:7;;;:14;16540:4;16546;:11;16513:5;:45::i;:::-;16506:52;;16403:163;;;;:::o;27696:124::-;27767:9;27802:4;27807:3;27802:9;;;;;;;;;;;;;;;;27796:16;;27789:23;;27696:124;;;;:::o;25598:211::-;25717:4;25770:31;25777:5;25784:11;25797:3;25770:6;:31::i;:::-;25741:25;25748:4;25754:6;25762:3;25741:6;:25::i;:::-;:60;25734:67;;25598:211;;;;;;;:::o;30351:566::-;30473:171;30487:2;30480:3;:9;30473:171;;30564:3;30558:10;30552:4;30545:24;30606:2;30598:10;;;;30630:2;30623:9;;;;30498:2;30491:9;;;;30473:171;;;30689:9;30721:1;30714:3;30709:2;:8;30701:3;:17;:21;30689:33;;30792:4;30788:9;30782:3;30776:10;30772:26;30845:4;30838;30832:11;30828:22;30890:7;30880:8;30877:21;30871:4;30864:35;30742:168;;;;;;:::o;10038:627::-;10094:4;10111:8;10130:6;10139:1;10130:10;;10151:15;10175:1;10169:15;10151:33;;10205:1;10199:7;;10195:442;10212:10;10208:1;:14;10195:442;;;10246:6;10261:1;10264;10255:11;;;;;;;;;;;;;;;;10246:20;;10288:4;10284:8;;:1;:8;;;;10281:345;;;10318:1;10313:6;;;;10281:345;;;10349:4;10345:8;;:1;:8;;;;10341:285;;;10379:1;10374:6;;;;10341:285;;;10410:4;10406:8;;:1;:8;;;;10402:224;;;10440:1;10435:6;;;;10402:224;;;10471:4;10467:8;;:1;:8;;;;10463:163;;;10501:1;10496:6;;;;10463:163;;;10532:4;10528:8;;:1;:8;;;;10524:102;;;10562:1;10557:6;;;;10524:102;;;10609:1;10604:6;;;;10524:102;10463:163;10402:224;10341:285;10281:345;10195:442;10224:5;;;;;;;10195:442;;;10654:3;10647:10;;;;;10038:627;;;:::o;14270:1367::-;14365:13;;:::i;:::-;14406:4;:11;14399:3;:18;;14391:27;;;;;;14447:3;:12;;;14441:3;14435;:9;:24;14431:102;;;14476:45;14483:3;14519:1;14488:28;14492:3;:12;;;14512:3;14506;:9;14488:3;:28::i;:::-;:32;14476:6;:45::i;:::-;14431:102;14545:9;14565:8;14678:3;14672:10;14763:6;14757:13;14893:3;14888:2;14880:6;14876:15;14872:25;14864:33;;14991:6;14985:3;14980;14976:13;14973:25;14970:2;;;15042:3;15037;15033:13;15025:6;15018:29;14970:2;15093;15087:4;15083:13;15076:20;;14593:514;;15170:171;15184:2;15177:3;:9;15170:171;;15261:3;15255:10;15249:4;15242:24;15303:2;15295:10;;;;15327:2;15320:9;;;;15195:2;15188:9;;;;15170:171;;;15386:9;15418:1;15411:3;15406:2;:8;15398:3;:17;:21;15386:33;;15489:4;15485:9;15479:3;15473:10;15469:26;15542:4;15535;15529:11;15525:22;15587:7;15577:8;15574:21;15568:4;15561:35;15439:168;;15626:3;15619:10;;;;;14270:1367;;;;;;:::o;22547:243::-;22628:11;22676:4;:11;22669:3;22660:6;:12;:27;;22652:36;;;;;;22768:3;22759:6;22754:2;22748:4;22744:13;22740:26;22730:42;22723:49;;22708:75;;;;;:::o;13401:139::-;13451:4;13476:1;13472;:5;13468:46;;;13501:1;13494:8;;;;13468:46;13531:1;13524:8;;13401:139;;;;;:::o;13222:171::-;13296:19;13318:3;:7;;;13296:29;;13336:19;13341:3;13346:8;13336:4;:19::i;:::-;;13366;13373:3;13378:6;13366;:19::i;:::-;;13222:171;;;:::o;35604:12459::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://9a419cd1bb289ec131e1647267278fa7013b2d937091e25901423b4f734f0a40
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.