Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
52 PAGE
Holders
31
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 PAGELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Page
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-09 */ // SPDX-License-Identifier: MIT /*** * ************************************************************************************************************* * ************************██╗███╗**█████╗*████████╗██╗███████╗████████╗*█████╗********************************* * ************************██║══██╗██╔══██╗╚══██╔══╝██║██╔════╝╚══██╔══╝██╔══██╗******************************** * ************************██║███╔╝███████║***██║***██║███████╗***██║***███████║******************************** * ************************██║══██╗██╔══██║***██║***██║╚════██║***██║***██╔══██║******************************** * ************************██║███╔╝██║**██║***██║***██║███████║***██║***██║**██║******************************** * ************************╚═╝═══╝*╚═╝**╚═╝***╚═╝***╚═╝╚══════╝***╚═╝***╚═╝**╚═╝******************************** * **********██████╗*███╗***██╗****████████╗██╗**██╗███████╗****██████╗*███████╗*█████╗*████████╗*************** * *********██╔═══██╗████╗**██║****╚══██╔══╝██║**██║██╔════╝****██╔══██╗██╔════╝██╔══██╗╚══██╔══╝*************** * *********██║***██║██╔██╗*██║*******██║***███████║█████╗******██████╔╝█████╗**███████║***██║****************** * *********██║***██║██║╚██╗██║*******██║***██╔══██║██╔══╝******██╔══██╗██╔══╝**██╔══██║***██║****************** * *********╚██████╔╝██║*╚████║*******██║***██║**██║███████╗****██████╔╝███████╗██║**██║***██║****************** * **********╚═════╝*╚═╝**╚═══╝*******╚═╝***╚═╝**╚═╝╚══════╝****╚═════╝*╚══════╝╚═╝**╚═╝***╚═╝****************** * *********************** ╔══════════════════════════════════════════════════╗ ******************************** * *********************** ║ INDEPENDENT PRODUCER GIVES BACK TO HIS COMMUNITY ║ ******************************** * *********************** ╚══════════════════════════════════════════════════╝ ******************************** * **************██╗*██████╗**██████╗*****██████╗**█████╗**██████╗*███████╗███████╗***************************** * *************███║██╔═████╗██╔═████╗****██╔══██╗██╔══██╗██╔════╝*██╔════╝██╔════╝*********▐▓▄**,▄▓▄**▄▓▌****** * *************╚██║██║██╔██║██║██╔██║****██████╔╝███████║██║**███╗█████╗**███████╗*********▐▓▓▓▓▓▀▀▓▓▓▓▓▌****** * **************██║████╔╝██║████╔╝██║****██╔═══╝*██╔══██║██║***██║██╔══╝**╚════██║*********j▓▓*,▓▓▓▓⌐*▓▓∩****** * **************██║╚██████╔╝╚██████╔╝****██║*****██║**██║╚██████╔╝███████╗███████║*********j▓▓▄▓▀*▓▓▄,▓▓▌****** * **************╚═╝*╚═════╝**╚═════╝*****╚═╝*****╚═╝**╚═╝*╚═════╝*╚══════╝╚══════╝*********j▓▓▓▓▄*▓▓▀▀▓▓▌****** * ****** ╔══════════════════════════════════════════════════════════════════════════════╗ *j▓▓*▀▓▓▓▓═*▓▓▌****** * ****** ║ 100 PAGES, 5 CHAPTERS OF 20 PAGES, 100 TOKENS PER PAGE = 10000 TOTAL TOKENS ║ **▀▓▓▓▄,*▄▄▓▓▀"****** * ****** ║ A PAGE TOKEN ALLOWS YOU TO BE A PART OF BATISTA's COMMUNITY AND RECEIVE ANY ║ ****'▀▀▓▓▀▀"********* * ****** ║ GIVEAWAYS DONATION THAT BATISTA GIFTS BACK TO HIS COMMUNITY PERIODICALLY. ║ ********************* * ****** ║ MORE INFO AT HTTPS://BATISTAONTHEBEAT.COM/100PAGES ║ ********************* * ****** ╚══════════════════════════════════════════════════════════════════════════════╝ ********************* * ************************************************************************************************************* */ // File: contracts/@rarible/royalties/contracts/LibRoyaltiesV2.sol pragma solidity ^0.8.0; library LibRoyaltiesV2 { /* * bytes4(keccak256('getRoyalties(LibAsset.AssetType)')) == 0x44c74bcc */ bytes4 constant _INTERFACE_ID_ROYALTIES = 0x44c74bcc; } // File: contracts/@rarible/royalties/contracts/LibPart.sol pragma solidity ^0.8.0; library LibPart { bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)"); struct Part { address payable account; uint96 value; } function hash(Part memory part) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, part.account, part.value)); } } // File: contracts/@rarible/royalties/contracts/RoyaltiesV2.sol pragma solidity ^0.8.0; interface RoyaltiesV2 { event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties); function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory); } // File: contracts/@rarible/royalties/contracts/impl/AbstractRoyalties.sol pragma solidity ^0.8.0; abstract contract AbstractRoyalties { mapping (uint256 => LibPart.Part[]) public royalties; function _saveRoyalties(uint256 _id, LibPart.Part[] memory _royalties) internal { for (uint i = 0; i < _royalties.length; i++) { require(_royalties[i].account != address(0x0), "Recipient should be present"); require(_royalties[i].value != 0, "Royalty value should be positive"); royalties[_id].push(_royalties[i]); } _onRoyaltiesSet(_id, _royalties); } function _updateAccount(uint256 _id, address _from, address _to) internal { uint length = royalties[_id].length; for(uint i = 0; i < length; i++) { if (royalties[_id][i].account == _from) { royalties[_id][i].account = payable(address(uint160(_to))); } } } function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) virtual internal; } // File: contracts/@rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol pragma solidity ^0.8.0; contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2 { function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) { return royalties[id]; } function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) override internal { emit RoyaltiesSet(_id, _royalties); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/100-Pages-Token.sol pragma solidity ^0.8.2; contract Page is ERC721, ERC721Enumerable, Ownable, RoyaltiesV2Impl { event CollaboratorsChanged(address[] fromCollaboratorsAddress, address[] toCollaboratorsAddress, uint[] fromCollaboratorsSplit, uint[] toCollaboratorsSplit); event CollectorChanged(address from, address to, uint256 tokenId); event GiveawayReleased(address to, uint256 amount); event GiveawayReceived(address from, uint256 amount); using Counters for Counters.Counter; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; uint256 private _mintingPrice = 0.42 ether; uint256 private _totalReleased; string private _currentBaseURI; uint private _maxSupply; mapping(uint256 => uint256) private _released; mapping(uint => Counters.Counter) private _timesMinted; mapping(uint => bool) private _chapterOpenForMinting; address[] private _collaboratorsAddress = [0xDF5529D9AC4F342387a525B8495712967FD9dB83, 0x0AA457e8914618a5Fc26b4bc36B7B34385725883, 0x110920f43E2e4ff3F3dbcb839b70734d66bde8F2, address(this)]; uint[] private _collaboratorsSplit = [ // This is the initial split 21, // Token Collaborator 1 21, // Token Collaborator 2 42, // Artist 16 // Token Holder Community ]; CollaboratorsPaymentSplitter private _collaboratorsPaymentSplitter; constructor() ERC721("100 Pages", "PAGE") { _currentBaseURI = "https://batistaonthebeat.com/100pages/token/"; _collaboratorsPaymentSplitter = new CollaboratorsPaymentSplitter(_collaboratorsAddress, _collaboratorsSplit); } function mintPage(uint8 page) external payable { require(address(_collaboratorsPaymentSplitter) != address(0), "PagesToken: CollectorPaymentSplitter not set"); require(msg.value == _mintingPrice, "PagesToken: incorrect minting prince"); require(1 <= page && page <= 100, "PagesToken: page must be between 1 and 100"); uint chapter = getChapter(page); require(_chapterOpenForMinting[chapter] == true, "PagesToken: chapter is not opened for minting"); uint nOfHundred = _timesMinted[page].current(); require(nOfHundred < 100, "PagesToken: each page can only be minted 100 times"); uint256 tokenId = id(page, nOfHundred+1); safeMint(msg.sender, tokenId); _timesMinted[page].increment(); payable(_collaboratorsPaymentSplitter).transfer(_mintingPrice); // auto release to collaborators on mint _collaboratorsPaymentSplitter.release(payable(address(this))); } function safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId); _setRoyalties(tokenId, payable(_collaboratorsPaymentSplitter), 1000); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); if (from != address(0) && _pendingGiveaway(tokenId) > 0){ changeCollector(from, to, tokenId); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit GiveawayReceived(_msgSender(), msg.value); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { if(interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) { return true; } if(interfaceId == _INTERFACE_ID_ERC2981) { return true; } return super.supportsInterface(interfaceId); } function setBaseURI(string memory baseURI) public onlyOwner { _currentBaseURI = baseURI; } function setMintingPrice(uint256 newPrice) public onlyOwner { _mintingPrice = newPrice; } function getMintingPrice() public view returns (uint) { return _mintingPrice; } function _baseURI() internal view virtual override returns (string memory) { return _currentBaseURI; } function getChapter(uint page) public pure returns (uint) { require(1 <= page && page <= 100, "PagesToken: page must be between 1 and 100"); return (uint(page-1)/20) + 1; } /** * @dev Change Collector for a tokenID. */ function changeCollector(address from, address to, uint256 tokenId) internal { // this is to skip on minting if (from != address(0)){ require(ownerOf(tokenId) == from, "CollectorsGiveawaySplitter: from account is not the owner for tokenId"); // if tokenId has balance, pay it out then emit CollectorChanged if (_pendingGiveaway(tokenId) != 0){ release(tokenId); } } emit CollectorChanged(from, to, tokenId); } function ReleaseMyGiveaway() public virtual { release(payable(_msgSender())); } function release(address payable account) public virtual { uint256 _ownedTokens = balanceOf(account); require(_ownedTokens > 0, "CollectorsGiveawaySplitter: account has no tokens"); uint256 totalGiveaway = _pendingGiveaway(account); require(totalGiveaway > 0, "GiveawaySplitter: account is not due giveaway"); Address.sendValue(account, totalGiveaway); _totalReleased += totalGiveaway; for (uint256 i = 0; i < (_ownedTokens ); i++) { uint currentToken = tokenOfOwnerByIndex(account, i); uint256 giveawayForToken = _pendingGiveaway(currentToken); _released[currentToken] += giveawayForToken; } emit GiveawayReleased(account, totalGiveaway); } function release(uint256 tokenId) public virtual { address tokenOwner = ownerOf(tokenId); require(tokenOwner != address(0), "CollectorsGiveawaySplitter: tokenId owner is the zero address"); uint256 _tokenPendingGiveaways = _pendingGiveaway(tokenId); require(_tokenPendingGiveaways > 0, "CollectorsGiveawaySplitter: tokenId is not due any giveaways"); Address.sendValue(payable(tokenOwner), _tokenPendingGiveaways); _totalReleased += _tokenPendingGiveaways; _released[tokenId]+= _tokenPendingGiveaways; emit GiveawayReleased(tokenOwner, _tokenPendingGiveaways); } function _pendingGiveaway(uint256 tokenId) private view returns (uint256) { return (address(this).balance + totalReleased()) / maxSupply() - _released[tokenId]; } function PendingGiveaway() public view returns (uint256) { uint256 _ownedTokens = balanceOf(_msgSender()); require(_ownedTokens > 0, "CollectorsGiveawaySplitter: account has no tokens"); return _pendingGiveaway(_msgSender()); } function _pendingGiveaway(address account) private view returns (uint256) { uint256 _ownedTokens = balanceOf(account); uint256 totalGiveaway = 0; for (uint256 i = 0; i < (_ownedTokens); i++) { uint currentToken = tokenOfOwnerByIndex(account, i); uint256 giveawayForToken = _pendingGiveaway(currentToken); totalGiveaway += giveawayForToken; } return totalGiveaway; } function totalReleased() public view returns (uint256) { return _totalReleased; } function setCollaboratorsPaymentSplitter(address[] memory collaboratorsAddress, uint[] memory collaboratorsSplit) public onlyOwner () { _collaboratorsPaymentSplitter = new CollaboratorsPaymentSplitter(_collaboratorsAddress, _collaboratorsSplit); emit CollaboratorsChanged(_collaboratorsAddress, collaboratorsAddress, _collaboratorsSplit, collaboratorsSplit); _collaboratorsAddress = collaboratorsAddress; _collaboratorsSplit = collaboratorsSplit; } function getCollaboratorsPaymentSplitter() public view returns (address) { return address(_collaboratorsPaymentSplitter); } function id(uint page, uint nOfHundred) internal pure returns (uint) { require(1 <= page && page <= 100 && nOfHundred > 0 && nOfHundred < 101, "PagesToken: page must be between 1 and 100 and nOfHundred 1-100"); return (uint((page * 100) - (100 - nOfHundred))); } function ownerOf(uint page, uint nOfHundred) public view returns (address) { require(1 <= page && page <= 100 && nOfHundred > 0 && nOfHundred < 101, "PagesToken: page must be between 1 and 100 and nOfHundred 1-100"); return ownerOf(id(page, nOfHundred)); } function openChapterForMinting(uint chapter) public onlyOwner { require(1 <= chapter && chapter <= 5 , "PagesToken: chapter must be between 1 and 5"); require(_chapterOpenForMinting[chapter] == false , "PagesToken: chapter is already opened"); if (chapter > 1 ){ require(_chapterOpenForMinting[chapter-1] == true , "PagesToken: previous chapter is not opened"); } _chapterOpenForMinting[chapter] = true; _maxSupply = chapter * 2000; } function maxSupply() public view returns (uint) { return _maxSupply; } function canMintPage(uint page) public view returns (bool) { require(1 <= page && page <= 100, "PagesToken: page must be between 1 and 100"); return _chapterOpenForMinting[getChapter(page)] && (timesMinted(page) < 100); } function timesMinted(uint page) public view returns (uint) { require(1 <= page && page <= 100, "page must be between 1 and 100"); return _timesMinted[page].current(); } function _setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) internal { LibPart.Part[] memory _royalties = new LibPart.Part[](1); _royalties[0].value = _percentageBasisPoints; _royalties[0].account = _royaltiesReceipientAddress; _saveRoyalties(_tokenId, _royalties); } function setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public onlyOwner { _setRoyalties(_tokenId, _royaltiesReceipientAddress, _percentageBasisPoints); } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { LibPart.Part[] memory _royalties = royalties[_tokenId]; if(_royalties.length > 0) { return (_royalties[0].account, (_salePrice * _royalties[0].value)/10000); } return (address(0), 0); } } contract CollaboratorsPaymentSplitter is PaymentSplitter { constructor (address[] memory _payees, uint256[] memory _shares) PaymentSplitter(_payees, _shares) payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"fromCollaboratorsAddress","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"toCollaboratorsAddress","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"fromCollaboratorsSplit","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"toCollaboratorsSplit","type":"uint256[]"}],"name":"CollaboratorsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"CollectorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GiveawayReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GiveawayReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PendingGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ReleaseMyGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"page","type":"uint256"}],"name":"canMintPage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"page","type":"uint256"}],"name":"getChapter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCollaboratorsPaymentSplitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"page","type":"uint8"}],"name":"mintPage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chapter","type":"uint256"}],"name":"openChapterForMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"page","type":"uint256"},{"internalType":"uint256","name":"nOfHundred","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"royalties","outputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collaboratorsAddress","type":"address[]"},{"internalType":"uint256[]","name":"collaboratorsSplit","type":"uint256[]"}],"name":"setCollaboratorsPaymentSplitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_royaltiesReceipientAddress","type":"address"},{"internalType":"uint96","name":"_percentageBasisPoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"page","type":"uint256"}],"name":"timesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6705d423c655aa0000600c5561010060405273df5529d9ac4f342387a525b8495712967fd9db836080908152730aa457e8914618a5fc26b4bc36b7b3438572588360a05273110920f43e2e4ff3f3dbcb839b70734d66bde8f260c0523060e0526200006f9060139060046200021d565b506040805160808101825260158082526020820152602a9181019190915260106060820152620000a490601490600462000287565b50348015620000b257600080fd5b50604080518082018252600981526831303020506167657360b81b6020808301918252835180850190945260048452635041474560e01b9084015281519192916200010091600091620002ca565b50805162000116906001906020840190620002ca565b505050620001336200012d620001c760201b60201c565b620001cb565b6040518060600160405280602c8152602001620062d0602c913980516200016391600e91602090910190620002ca565b5060136014604051620001769062000347565b620001839291906200036c565b604051809103906000f080158015620001a0573d6000803e3d6000fd5b50601580546001600160a01b0319166001600160a01b03929092169190911790556200043c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000275579160200282015b828111156200027557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200023e565b506200028392915062000355565b5090565b82805482825590600052602060002090810192821562000275579160200282015b8281111562000275578251829060ff16905591602001919060010190620002a8565b828054620002d890620003ff565b90600052602060002090601f016020900481019282620002fc576000855562000275565b82601f106200031757805160ff191683800117855562000275565b8280016001018555821562000275579182015b82811115620002755782518255916020019190600101906200032a565b611173806200515d83390190565b5b8082111562000283576000815560010162000356565b60006040820160408352808554808352606085019150600092508683526020808420845b83811015620003b75781546001600160a01b03168552938201936001918201910162000390565b505085830381870152865480845287855281852093820192505b80851015620003f257835483526001948501949093019291810191620003d1565b5090979650505050505050565b600181811c908216806200041457607f821691505b602082108114156200043657634e487b7160e01b600052602260045260246000fd5b50919050565b614d11806200044c6000396000f3fe6080604052600436106200026f5760003560e01c80637b577a641162000147578063accc898a11620000b9578063d9dad80d1162000078578063d9dad80d14620007ea578063d9e0058b146200080f578063e33b7de31462000834578063e985e9c5146200084b578063f2fde38b146200089857600080fd5b8063accc898a1462000730578063b88d4fde1462000755578063c87b56dd146200077a578063cad96cca146200079f578063d5abeb0114620007d357600080fd5b80638da5cb5b11620001065780638da5cb5b1462000696578063922d5f4114620006b657806395d89b4114620006ce57806399f7b56714620006e6578063a22cb465146200070b57600080fd5b80637b577a6414620005d05780638058575314620005f55780638417b47f146200060d578063861e188f14620006325780638924af74146200064957600080fd5b80632f745c5911620001e157806355f804b311620001a057806355f804b314620005325780636352211e146200055757806370a08231146200057c578063715018a614620005a157806377d2476214620005b957600080fd5b80632f745c59146200047957806337bdc99b146200049e57806342842e0e14620004c357806346d1c28c14620004e85780634f6ccce7146200050d57600080fd5b806318160ddd116200022e57806318160ddd14620003a95780631916558714620003ca578063196080cd14620003ef57806323b872dd146200040f5780632a55205a146200043457600080fd5b806301ffc9a714620002be57806306fdde0314620002f8578063081812fc146200031f578063095ea7b3146200035d578063143094db146200038457600080fd5b36620002b9577fbb70354ec8a6a6478922d1c659ccae98b8fcb68bc9e25d388b6339bfbbd231f333604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b348015620002cb57600080fd5b50620002e3620002dd366004620033b5565b620008bd565b60405190151581526020015b60405180910390f35b3480156200030557600080fd5b506200031062000914565b604051620002ef919062003763565b3480156200032c57600080fd5b50620003446200033e36600462003443565b620009ae565b6040516001600160a01b039091168152602001620002ef565b3480156200036a57600080fd5b50620003826200037c366004620032af565b62000a49565b005b3480156200039157600080fd5b5062000382620003a33660046200345d565b62000b6a565b348015620003b657600080fd5b506008545b604051908152602001620002ef565b348015620003d757600080fd5b5062000382620003e93660046200314b565b62000ba4565b348015620003fc57600080fd5b506015546001600160a01b031662000344565b3480156200041c57600080fd5b50620003826200042e366004620031a9565b62000d2b565b3480156200044157600080fd5b506200045962000453366004620034af565b62000d63565b604080516001600160a01b039093168352602083019190915201620002ef565b3480156200048657600080fd5b50620003bb62000498366004620032af565b62000e77565b348015620004ab57600080fd5b5062000382620004bd36600462003443565b62000f11565b348015620004d057600080fd5b5062000382620004e2366004620031a9565b620010af565b348015620004f557600080fd5b506200038262000507366004620032de565b620010cc565b3480156200051a57600080fd5b50620003bb6200052c36600462003443565b620011c3565b3480156200053f57600080fd5b506200038262000551366004620033f5565b6200125c565b3480156200056457600080fd5b50620003446200057636600462003443565b620012a2565b3480156200058957600080fd5b50620003bb6200059b3660046200314b565b6200131b565b348015620005ae57600080fd5b5062000382620013a4565b348015620005c657600080fd5b50600c54620003bb565b348015620005dd57600080fd5b50620002e3620005ef36600462003443565b620013df565b3480156200060257600080fd5b50620003bb62001452565b3480156200061a57600080fd5b50620003826200062c36600462003443565b62001496565b6200038262000643366004620034d2565b620014c8565b3480156200065657600080fd5b506200066e62000668366004620034af565b620017c3565b604080516001600160a01b0390931683526001600160601b03909116602083015201620002ef565b348015620006a357600080fd5b50600a546001600160a01b031662000344565b348015620006c357600080fd5b50620003826200180d565b348015620006db57600080fd5b506200031062001818565b348015620006f357600080fd5b50620003bb6200070536600462003443565b62001829565b3480156200071857600080fd5b50620003826200072a36600462003278565b62001885565b3480156200073d57600080fd5b50620003bb6200074f36600462003443565b62001892565b3480156200076257600080fd5b506200038262000774366004620031ef565b6200190a565b3480156200078757600080fd5b50620003106200079936600462003443565b62001949565b348015620007ac57600080fd5b50620007c4620007be36600462003443565b62001a2e565b604051620002ef91906200374e565b348015620007e057600080fd5b50600f54620003bb565b348015620007f757600080fd5b506200034462000809366004620034af565b62001abf565b3480156200081c57600080fd5b50620003826200082e36600462003443565b62001b1d565b3480156200084157600080fd5b50600d54620003bb565b3480156200085857600080fd5b50620002e36200086a3660046200316b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015620008a557600080fd5b5062000382620008b73660046200314b565b62001cf0565b60006001600160e01b03198216631131d2f360e21b1415620008e157506001919050565b6001600160e01b0319821663152a902d60e11b14156200090357506001919050565b6200090e8262001d92565b92915050565b606060008054620009259062003a5b565b80601f0160208091040260200160405190810160405280929190818152602001828054620009539062003a5b565b8015620009a45780601f106200097857610100808354040283529160200191620009a4565b820191906000526020600020905b8154815290600101906020018083116200098657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031662000a2d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600062000a5682620012a2565b9050806001600160a01b0316836001600160a01b0316141562000ac65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840162000a24565b336001600160a01b038216148062000ae5575062000ae581336200086a565b62000b595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840162000a24565b62000b65838362001dba565b505050565b600a546001600160a01b0316331462000b975760405162461bcd60e51b815260040162000a2490620037ca565b62000b6583838362001e2a565b600062000bb1826200131b565b90506000811162000bd65760405162461bcd60e51b815260040162000a2490620038f7565b600062000be38362001ee1565b90506000811162000c4d5760405162461bcd60e51b815260206004820152602d60248201527f476976656177617953706c69747465723a206163636f756e74206973206e6f7460448201526c2064756520676976656177617960981b606482015260840162000a24565b62000c59838262001f4b565b80600d600082825462000c6d9190620039be565b90915550600090505b8281101562000ce257600062000c8d858362000e77565b9050600062000c9c826200206a565b90508060106000848152602001908152602001600020600082825462000cc39190620039be565b925050819055505050808062000cd99062003a98565b91505062000c76565b50604080516001600160a01b0385168152602081018390527fb75f306491f3f6778f6a8e259b0a2c215c669d0fe82dfdb68dacf2d409c3928191015b60405180910390a1505050565b62000d373382620020a3565b62000d565760405162461bcd60e51b815260040162000a2490620038a6565b62000b65838383620021a2565b6000828152600b60209081526040808320805482518185028101850190935280835284938493929190849084015b8282101562000de257600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910162000d91565b50505050905060008151111562000e67578060008151811062000e095762000e0962003b0f565b6020026020010151600001516127108260008151811062000e2e5762000e2e62003b0f565b6020026020010151602001516001600160601b03168662000e509190620039f0565b62000e5c9190620039d9565b925092505062000e70565b60008092509250505b9250929050565b600062000e84836200131b565b821062000ee85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840162000a24565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600062000f1e82620012a2565b90506001600160a01b03811662000f9e5760405162461bcd60e51b815260206004820152603d60248201527f436f6c6c6563746f7273476976656177617953706c69747465723a20746f6b6560448201527f6e4964206f776e657220697320746865207a65726f2061646472657373000000606482015260840162000a24565b600062000fab836200206a565b905060008111620010255760405162461bcd60e51b815260206004820152603c60248201527f436f6c6c6563746f7273476976656177617953706c69747465723a20746f6b6560448201527f6e4964206973206e6f742064756520616e792067697665617761797300000000606482015260840162000a24565b62001031828262001f4b565b80600d6000828254620010459190620039be565b9091555050600083815260106020526040812080548392906200106a908490620039be565b9091555050604080516001600160a01b0384168152602081018390527fb75f306491f3f6778f6a8e259b0a2c215c669d0fe82dfdb68dacf2d409c39281910162000d1e565b62000b65838383604051806020016040528060008152506200190a565b600a546001600160a01b03163314620010f95760405162461bcd60e51b815260040162000a2490620037ca565b601360146040516200110b9062002f2a565b620011189291906200371c565b604051809103906000f08015801562001135573d6000803e3d6000fd5b50601580546001600160a01b0319166001600160a01b03929092169190911790556040517f2c112c677a78e6466a0d32f8923c4d4b64c808165cab5361f6b7ad660575e3619062001190906013908590601490869062003668565b60405180910390a18151620011ad90601390602085019062002f38565b50805162000b6590601490602084019062002fa2565b6000620011cf60085490565b8210620012345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840162000a24565b600882815481106200124a576200124a62003b0f565b90600052602060002001549050919050565b600a546001600160a01b03163314620012895760405162461bcd60e51b815260040162000a2490620037ca565b80516200129e90600e90602084019062002fe0565b5050565b6000818152600260205260408120546001600160a01b0316806200090e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840162000a24565b60006001600160a01b038216620013885760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840162000a24565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314620013d15760405162461bcd60e51b815260040162000a2490620037ca565b620013dd60006200235b565b565b600081600111158015620013f4575060648211155b620014135760405162461bcd60e51b815260040162000a24906200385c565b60126000620014228462001829565b815260208101919091526040016000205460ff1680156200090e575060646200144b8362001892565b1092915050565b60008062001460336200131b565b905060008111620014855760405162461bcd60e51b815260040162000a2490620038f7565b620014903362001ee1565b91505090565b600a546001600160a01b03163314620014c35760405162461bcd60e51b815260040162000a2490620037ca565b600c55565b6015546001600160a01b0316620015375760405162461bcd60e51b815260206004820152602c60248201527f5061676573546f6b656e3a20436f6c6c6563746f725061796d656e7453706c6960448201526b1d1d195c881b9bdd081cd95d60a21b606482015260840162000a24565b600c543414620015965760405162461bcd60e51b8152602060048201526024808201527f5061676573546f6b656e3a20696e636f7272656374206d696e74696e67207072604482015263696e636560e01b606482015260840162000a24565b8060ff16600111158015620015af575060648160ff1611155b620015ce5760405162461bcd60e51b815260040162000a24906200385c565b6000620015de8260ff1662001829565b60008181526012602052604090205490915060ff1615156001146200165c5760405162461bcd60e51b815260206004820152602d60248201527f5061676573546f6b656e3a2063686170746572206973206e6f74206f70656e6560448201526c6420666f72206d696e74696e6760981b606482015260840162000a24565b60ff821660009081526011602052604090205460648110620016dc5760405162461bcd60e51b815260206004820152603260248201527f5061676573546f6b656e3a206561636820706167652063616e206f6e6c79206260448201527165206d696e746564203130302074696d657360701b606482015260840162000a24565b6000620016f960ff8516620016f3846001620039be565b620023ad565b905062001707338262002421565b60ff8416600090815260116020526040902080546001019055601554600c546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156200175d573d6000803e3d6000fd5b50601554604051631916558760e01b81523060048201526001600160a01b0390911690631916558790602401600060405180830381600087803b158015620017a457600080fd5b505af1158015620017b9573d6000803e3d6000fd5b5050505050505050565b600b6020528160005260406000208181548110620017e057600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b620013dd3362000ba4565b606060018054620009259062003a5b565b6000816001111580156200183e575060648211155b6200185d5760405162461bcd60e51b815260040162000a24906200385c565b60146200186c60018462003a12565b620018789190620039d9565b6200090e906001620039be565b6200129e33838362002449565b600081600111158015620018a7575060648211155b620018f55760405162461bcd60e51b815260206004820152601e60248201527f70616765206d757374206265206265747765656e203120616e64203130300000604482015260640162000a24565b6000828152601160205260409020546200090e565b620019163383620020a3565b620019355760405162461bcd60e51b815260040162000a2490620038a6565b62001943848484846200251a565b50505050565b6000818152600260205260409020546060906001600160a01b0316620019ca5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840162000a24565b6000620019d662002554565b90506000815111620019f8576040518060200160405280600081525062001a27565b8062001a048462002565565b60405160200162001a17929190620035f6565b6040516020818303038152906040525b9392505050565b6060600b6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101562001ab457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910162001a63565b505050509050919050565b60008260011115801562001ad4575060648311155b801562001ae15750600082115b801562001aee5750606582105b62001b0d5760405162461bcd60e51b815260040162000a2490620037ff565b62001a27620005768484620023ad565b600a546001600160a01b0316331462001b4a5760405162461bcd60e51b815260040162000a2490620037ca565b8060011115801562001b5d575060058111155b62001bbf5760405162461bcd60e51b815260206004820152602b60248201527f5061676573546f6b656e3a2063686170746572206d757374206265206265747760448201526a65656e203120616e64203560a81b606482015260840162000a24565b60008181526012602052604090205460ff161562001c2e5760405162461bcd60e51b815260206004820152602560248201527f5061676573546f6b656e3a206368617074657220697320616c7265616479206f6044820152641c195b995960da1b606482015260840162000a24565b600181111562001cc3576012600062001c4960018462003a12565b815260208101919091526040016000205460ff16151560011462001cc35760405162461bcd60e51b815260206004820152602a60248201527f5061676573546f6b656e3a2070726576696f75732063686170746572206973206044820152691b9bdd081bdc195b995960b21b606482015260840162000a24565b6000818152601260205260409020805460ff1916600117905562001cea816107d0620039f0565b600f5550565b600a546001600160a01b0316331462001d1d5760405162461bcd60e51b815260040162000a2490620037ca565b6001600160a01b03811662001d845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000a24565b62001d8f816200235b565b50565b60006001600160e01b0319821663780e9d6360e01b14806200090e57506200090e826200267b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819062001df182620012a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908162001e41579050509050818160008151811062001e825762001e8262003b0f565b6020026020010151602001906001600160601b031690816001600160601b031681525050828160008151811062001ebd5762001ebd62003b0f565b60209081029190910101516001600160a01b039091169052620019438482620026ce565b60008062001eef836200131b565b90506000805b8281101562001f4357600062001f0c868362000e77565b9050600062001f1b826200206a565b905062001f298185620039be565b93505050808062001f3a9062003a98565b91505062001ef5565b509392505050565b8047101562001f9d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640162000a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811462001fec576040519150601f19603f3d011682016040523d82523d6000602084013e62001ff1565b606091505b505090508062000b655760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840162000a24565b600081815260106020526040812054600f54600d546200208b9047620039be565b620020979190620039d9565b6200090e919062003a12565b6000818152600260205260408120546001600160a01b03166200211e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840162000a24565b60006200212b83620012a2565b9050806001600160a01b0316846001600160a01b03161480620021695750836001600160a01b03166200215e84620009ae565b6001600160a01b0316145b806200219a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316620021b782620012a2565b6001600160a01b031614620022215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840162000a24565b6001600160a01b038216620022855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840162000a24565b6200229283838362002865565b6200229f60008262001dba565b6001600160a01b0383166000908152600360205260408120805460019290620022ca90849062003a12565b90915550506001600160a01b0382166000908152600360205260408120805460019290620022fa908490620039be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082600111158015620023c2575060648311155b8015620023cf5750600082115b8015620023dc5750606582105b620023fb5760405162461bcd60e51b815260040162000a2490620037ff565b6200240882606462003a12565b62002415846064620039f0565b62001a27919062003a12565b6200242d8282620028a8565b6015546200129e9082906001600160a01b03166103e862001e2a565b816001600160a01b0316836001600160a01b03161415620024ad5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640162000a24565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b62002527848484620021a2565b6200253584848484620028c4565b620019435760405162461bcd60e51b815260040162000a249062003778565b6060600e8054620009259062003a5b565b6060816200258a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620025ba5780620025a18162003a98565b9150620025b29050600a83620039d9565b91506200258e565b60008167ffffffffffffffff811115620025d857620025d862003b25565b6040519080825280601f01601f19166020018201604052801562002603576020820181803683370190505b5090505b84156200219a576200261b60018362003a12565b91506200262a600a8662003ab6565b62002637906030620039be565b60f81b8183815181106200264f576200264f62003b0f565b60200101906001600160f81b031916908160001a90535062002673600a86620039d9565b945062002607565b60006001600160e01b031982166380ac58cd60e01b1480620026ad57506001600160e01b03198216635b5e139f60e01b145b806200090e57506301ffc9a760e01b6001600160e01b03198316146200090e565b60005b8151811015620028585760006001600160a01b0316828281518110620026fb57620026fb62003b0f565b6020026020010151600001516001600160a01b03161415620027605760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640162000a24565b81818151811062002775576200277562003b0f565b6020026020010151602001516001600160601b031660001415620027dc5760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640162000a24565b6000838152600b60205260409020825183908390811062002801576200280162003b0f565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806200284f8162003a98565b915050620026d1565b506200129e8282620029df565b6200287283838362002a1e565b6001600160a01b03831615801590620028955750600062002893826200206a565b115b1562000b655762000b6583838362002ae2565b6200129e82826040518060200160405280600081525062002bf8565b60006001600160a01b0384163b15620029d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200290b90339089908890889060040162003629565b602060405180830381600087803b1580156200292657600080fd5b505af192505050801562002959575060408051601f3d908101601f191682019092526200295691810190620033d5565b60015b620029b9573d8080156200298a576040519150601f19603f3d011682016040523d82523d6000602084013e6200298f565b606091505b508051620029b15760405162461bcd60e51b815260040162000a249062003778565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200219a565b506001949350505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df828260405162002a1292919062003948565b60405180910390a15050565b6001600160a01b03831662002a7c5762002a7681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62002aa2565b816001600160a01b0316836001600160a01b03161462002aa25762002aa2838262002c32565b6001600160a01b03821662002abc5762000b658162002cd4565b826001600160a01b0316826001600160a01b03161462000b655762000b65828262002d8e565b6001600160a01b0383161562002baf57826001600160a01b031662002b0782620012a2565b6001600160a01b03161462002b935760405162461bcd60e51b815260206004820152604560248201527f436f6c6c6563746f7273476976656177617953706c69747465723a2066726f6d60448201527f206163636f756e74206973206e6f7420746865206f776e657220666f7220746f6064820152641ad95b925960da1b608482015260a40162000a24565b62002b9e816200206a565b1562002baf5762002baf8162000f11565b604080516001600160a01b038086168252841660208201529081018290527f7acf16d9d7a4867d547b0daadb246d2506611f4b0c47c2237dbe2f23fa35d94a9060600162000d1e565b62002c04838362002dd4565b62002c136000848484620028c4565b62000b655760405162461bcd60e51b815260040162000a249062003778565b6000600162002c41846200131b565b62002c4d919062003a12565b60008381526007602052604090205490915080821462002ca1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062002ce89060019062003a12565b6000838152600960205260408120546008805493945090928490811062002d135762002d1362003b0f565b90600052602060002001549050806008838154811062002d375762002d3762003b0f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062002d725762002d7262003af9565b6001900381819060005260206000200160009055905550505050565b600062002d9b836200131b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821662002e2c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000a24565b6000818152600260205260409020546001600160a01b03161562002e935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000a24565b62002ea16000838362002865565b6001600160a01b038216600090815260036020526040812080546001929062002ecc908490620039be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6111738062003b6983390190565b82805482825590600052602060002090810192821562002f90579160200282015b8281111562002f9057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062002f59565b5062002f9e9291506200305c565b5090565b82805482825590600052602060002090810192821562002f90579160200282015b8281111562002f9057825182559160200191906001019062002fc3565b82805462002fee9062003a5b565b90600052602060002090601f01602090048101928262003012576000855562002f90565b82601f106200302d57805160ff191683800117855562002f90565b8280016001018555821562002f90579182018281111562002f9057825182559160200191906001019062002fc3565b5b8082111562002f9e57600081556001016200305d565b600067ffffffffffffffff83111562003090576200309062003b25565b620030a5601f8401601f191660200162003963565b9050828152838383011115620030ba57600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030e357600080fd5b81356020620030fc620030f68362003997565b62003963565b80838252828201915082860187848660051b89010111156200311d57600080fd5b60005b858110156200313e5781358452928401929084019060010162003120565b5090979650505050505050565b6000602082840312156200315e57600080fd5b813562001a278162003b3b565b600080604083850312156200317f57600080fd5b82356200318c8162003b3b565b915060208301356200319e8162003b3b565b809150509250929050565b600080600060608486031215620031bf57600080fd5b8335620031cc8162003b3b565b92506020840135620031de8162003b3b565b929592945050506040919091013590565b600080600080608085870312156200320657600080fd5b8435620032138162003b3b565b93506020850135620032258162003b3b565b925060408501359150606085013567ffffffffffffffff8111156200324957600080fd5b8501601f810187136200325b57600080fd5b6200326c8782356020840162003073565b91505092959194509250565b600080604083850312156200328c57600080fd5b8235620032998162003b3b565b9150602083013580151581146200319e57600080fd5b60008060408385031215620032c357600080fd5b8235620032d08162003b3b565b946020939093013593505050565b60008060408385031215620032f257600080fd5b823567ffffffffffffffff808211156200330b57600080fd5b818501915085601f8301126200332057600080fd5b8135602062003333620030f68362003997565b8083825282820191508286018a848660051b89010111156200335457600080fd5b600096505b84871015620033845780356200336f8162003b3b565b83526001969096019591830191830162003359565b50965050860135925050808211156200339c57600080fd5b50620033ab85828601620030d1565b9150509250929050565b600060208284031215620033c857600080fd5b813562001a278162003b51565b600060208284031215620033e857600080fd5b815162001a278162003b51565b6000602082840312156200340857600080fd5b813567ffffffffffffffff8111156200342057600080fd5b8201601f810184136200343257600080fd5b6200219a8482356020840162003073565b6000602082840312156200345657600080fd5b5035919050565b6000806000606084860312156200347357600080fd5b833592506020840135620034878162003b3b565b915060408401356001600160601b0381168114620034a457600080fd5b809150509250925092565b60008060408385031215620034c357600080fd5b50508035926020909101359150565b600060208284031215620034e557600080fd5b813560ff8116811462001a2757600080fd5b6000815480845260208085019450836000528060002060005b83811015620035375781546001600160a01b03168752958201956001918201910162003510565b509495945050505050565b600081518084526020808501945080840160005b838110156200353757815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010162003556565b6000815480845260208085019450836000528060002060005b838110156200353757815487529582019560019182019101620035aa565b60008151808452620035e281602086016020860162003a2c565b601f01601f19169290920160200192915050565b600083516200360a81846020880162003a2c565b8351908301906200362081836020880162003a2c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906200365e90830184620035c8565b9695505050505050565b6080815260006200367d6080830187620034f7565b82810360208481019190915286518083528782019282019060005b81811015620036bf5784516001600160a01b03168352938301939183019160010162003698565b50508481036040860152620036d5818862003591565b858103606087015286518082528388019450908301915060005b818110156200370d57845183529383019391830191600101620036ef565b50909998505050505050505050565b604081526000620037316040830185620034f7565b828103602084015262003745818562003591565b95945050505050565b60208152600062001a27602083018462003542565b60208152600062001a276020830184620035c8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603f908201527f5061676573546f6b656e3a2070616765206d757374206265206265747765656e60408201527f203120616e642031303020616e64206e4f6648756e6472656420312d31303000606082015260800190565b6020808252602a908201527f5061676573546f6b656e3a2070616765206d757374206265206265747765656e6040820152690203120616e64203130360b41b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526031908201527f436f6c6c6563746f7273476976656177617953706c69747465723a206163636f604082015270756e7420686173206e6f20746f6b656e7360781b606082015260800190565b8281526040602082015260006200219a604083018462003542565b604051601f8201601f1916810167ffffffffffffffff811182821017156200398f576200398f62003b25565b604052919050565b600067ffffffffffffffff821115620039b457620039b462003b25565b5060051b60200190565b60008219821115620039d457620039d462003acd565b500190565b600082620039eb57620039eb62003ae3565b500490565b600081600019048311821515161562003a0d5762003a0d62003acd565b500290565b60008282101562003a275762003a2762003acd565b500390565b60005b8381101562003a4957818101518382015260200162003a2f565b83811115620019435750506000910152565b600181811c9082168062003a7057607f821691505b6020821081141562003a9257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562003aaf5762003aaf62003acd565b5060010190565b60008262003ac85762003ac862003ae3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462001d8f57600080fd5b6001600160e01b03198116811462001d8f57600080fdfe608060405260405162001173380380620011738339810160408190526200002691620003ca565b818180518251146200009a5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620000ed5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000091565b60005b825181101562000159576200014483828151811062000113576200011362000556565b602002602001015183838151811062000130576200013062000556565b60200260200101516200016460201b60201c565b80620001508162000522565b915050620000f0565b505050505062000582565b6001600160a01b038216620001d15760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000091565b60008111620002235760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000091565b6001600160a01b038216600090815260026020526040902054156200029f5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000091565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600260205260408120829055546200030790829062000507565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600082601f8301126200036257600080fd5b815160206200037b6200037583620004e1565b620004ae565b80838252828201915082860187848660051b89010111156200039c57600080fd5b60005b85811015620003bd578151845292840192908401906001016200039f565b5090979650505050505050565b60008060408385031215620003de57600080fd5b82516001600160401b0380821115620003f657600080fd5b818501915085601f8301126200040b57600080fd5b815160206200041e6200037583620004e1565b8083825282820191508286018a848660051b89010111156200043f57600080fd5b600096505b848710156200047a5780516001600160a01b03811681146200046557600080fd5b83526001969096019591830191830162000444565b50918801519196509093505050808211156200049557600080fd5b50620004a48582860162000350565b9150509250929050565b604051601f8201601f191681016001600160401b0381118282101715620004d957620004d96200056c565b604052919050565b60006001600160401b03821115620004fd57620004fd6200056c565b5060051b60200190565b600082198211156200051d576200051d62000540565b500190565b600060001982141562000539576200053962000540565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b610be180620005926000396000f3fe60806040526004361061008a5760003560e01c80638b83209b116100595780638b83209b146101845780639852595c146101bc578063ce7c2ac2146101f2578063d79779b214610228578063e33b7de31461025e57600080fd5b806319165587146100d85780633a98ef39146100fa578063406072a91461011e57806348b750441461016457600080fd5b366100d3577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156100e457600080fd5b506100f86100f336600461093d565b610273565b005b34801561010657600080fd5b506000545b6040519081526020015b60405180910390f35b34801561012a57600080fd5b5061010b61013936600461097c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561017057600080fd5b506100f861017f36600461097c565b6103aa565b34801561019057600080fd5b506101a461019f3660046109b5565b610592565b6040516001600160a01b039091168152602001610115565b3480156101c857600080fd5b5061010b6101d736600461093d565b6001600160a01b031660009081526003602052604090205490565b3480156101fe57600080fd5b5061010b61020d36600461093d565b6001600160a01b031660009081526002602052604090205490565b34801561023457600080fd5b5061010b61024336600461093d565b6001600160a01b031660009081526005602052604090205490565b34801561026a57600080fd5b5060015461010b565b6001600160a01b0381166000908152600260205260409020546102b15760405162461bcd60e51b81526004016102a890610a36565b60405180910390fd5b60006102bc60015490565b6102c69047610ac7565b905060006102f383836102ee866001600160a01b031660009081526003602052604090205490565b6105c2565b9050806103125760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b0383166000908152600360205260408120805483929061033a908490610ac7565b9250508190555080600160008282546103539190610ac7565b9091555061036390508382610607565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0381166000908152600260205260409020546103df5760405162461bcd60e51b81526004016102a890610a36565b6001600160a01b0382166000908152600560205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561043757600080fd5b505afa15801561044b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046f91906109ce565b6104799190610ac7565b905060006104b283836102ee87876001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b9050806104d15760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290610508908490610ac7565b90915550506001600160a01b03841660009081526005602052604081208054839290610535908490610ac7565b909155506105469050848483610725565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000600482815481106105a7576105a7610b7d565b6000918252602090912001546001600160a01b031692915050565b600080546001600160a01b0385168252600260205260408220548391906105e99086610b01565b6105f39190610adf565b6105fd9190610b20565b90505b9392505050565b804710156106575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102a8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146106a4576040519150601f19603f3d011682016040523d82523d6000602084013e6106a9565b606091505b50509050806107205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102a8565b505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610720928692916000916107b5918516908490610832565b80519091501561072057808060200190518101906107d3919061095a565b6107205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102a8565b60606105fd848460008585843b61088b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a8565b600080866001600160a01b031685876040516108a791906109e7565b60006040518083038185875af1925050503d80600081146108e4576040519150601f19603f3d011682016040523d82523d6000602084013e6108e9565b606091505b50915091506108f9828286610904565b979650505050505050565b60608315610913575081610600565b8251156109235782518084602001fd5b8160405162461bcd60e51b81526004016102a89190610a03565b60006020828403121561094f57600080fd5b813561060081610b93565b60006020828403121561096c57600080fd5b8151801515811461060057600080fd5b6000806040838503121561098f57600080fd5b823561099a81610b93565b915060208301356109aa81610b93565b809150509250929050565b6000602082840312156109c757600080fd5b5035919050565b6000602082840312156109e057600080fd5b5051919050565b600082516109f9818460208701610b37565b9190910192915050565b6020815260008251806020840152610a22816040850160208701610b37565b601f01601f19169190910160400192915050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60008219821115610ada57610ada610b67565b500190565b600082610afc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610b1b57610b1b610b67565b500290565b600082821015610b3257610b32610b67565b500390565b60005b83811015610b52578181015183820152602001610b3a565b83811115610b61576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610ba857600080fd5b5056fea264697066735822122039dfdc757a4cd5453dfa186a8180ec5bde68022f20047284e50732e5f40404a564736f6c63430008070033a2646970667358221220e00fe904d9eebc4b1a6a4d1c396c4bd344cf48af30a8e05949ba04231756a5b264736f6c63430008070033608060405260405162001173380380620011738339810160408190526200002691620003ca565b818180518251146200009a5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620000ed5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000091565b60005b825181101562000159576200014483828151811062000113576200011362000556565b602002602001015183838151811062000130576200013062000556565b60200260200101516200016460201b60201c565b80620001508162000522565b915050620000f0565b505050505062000582565b6001600160a01b038216620001d15760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000091565b60008111620002235760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000091565b6001600160a01b038216600090815260026020526040902054156200029f5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000091565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600260205260408120829055546200030790829062000507565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600082601f8301126200036257600080fd5b815160206200037b6200037583620004e1565b620004ae565b80838252828201915082860187848660051b89010111156200039c57600080fd5b60005b85811015620003bd578151845292840192908401906001016200039f565b5090979650505050505050565b60008060408385031215620003de57600080fd5b82516001600160401b0380821115620003f657600080fd5b818501915085601f8301126200040b57600080fd5b815160206200041e6200037583620004e1565b8083825282820191508286018a848660051b89010111156200043f57600080fd5b600096505b848710156200047a5780516001600160a01b03811681146200046557600080fd5b83526001969096019591830191830162000444565b50918801519196509093505050808211156200049557600080fd5b50620004a48582860162000350565b9150509250929050565b604051601f8201601f191681016001600160401b0381118282101715620004d957620004d96200056c565b604052919050565b60006001600160401b03821115620004fd57620004fd6200056c565b5060051b60200190565b600082198211156200051d576200051d62000540565b500190565b600060001982141562000539576200053962000540565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b610be180620005926000396000f3fe60806040526004361061008a5760003560e01c80638b83209b116100595780638b83209b146101845780639852595c146101bc578063ce7c2ac2146101f2578063d79779b214610228578063e33b7de31461025e57600080fd5b806319165587146100d85780633a98ef39146100fa578063406072a91461011e57806348b750441461016457600080fd5b366100d3577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156100e457600080fd5b506100f86100f336600461093d565b610273565b005b34801561010657600080fd5b506000545b6040519081526020015b60405180910390f35b34801561012a57600080fd5b5061010b61013936600461097c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561017057600080fd5b506100f861017f36600461097c565b6103aa565b34801561019057600080fd5b506101a461019f3660046109b5565b610592565b6040516001600160a01b039091168152602001610115565b3480156101c857600080fd5b5061010b6101d736600461093d565b6001600160a01b031660009081526003602052604090205490565b3480156101fe57600080fd5b5061010b61020d36600461093d565b6001600160a01b031660009081526002602052604090205490565b34801561023457600080fd5b5061010b61024336600461093d565b6001600160a01b031660009081526005602052604090205490565b34801561026a57600080fd5b5060015461010b565b6001600160a01b0381166000908152600260205260409020546102b15760405162461bcd60e51b81526004016102a890610a36565b60405180910390fd5b60006102bc60015490565b6102c69047610ac7565b905060006102f383836102ee866001600160a01b031660009081526003602052604090205490565b6105c2565b9050806103125760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b0383166000908152600360205260408120805483929061033a908490610ac7565b9250508190555080600160008282546103539190610ac7565b9091555061036390508382610607565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0381166000908152600260205260409020546103df5760405162461bcd60e51b81526004016102a890610a36565b6001600160a01b0382166000908152600560205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561043757600080fd5b505afa15801561044b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046f91906109ce565b6104799190610ac7565b905060006104b283836102ee87876001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b9050806104d15760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290610508908490610ac7565b90915550506001600160a01b03841660009081526005602052604081208054839290610535908490610ac7565b909155506105469050848483610725565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000600482815481106105a7576105a7610b7d565b6000918252602090912001546001600160a01b031692915050565b600080546001600160a01b0385168252600260205260408220548391906105e99086610b01565b6105f39190610adf565b6105fd9190610b20565b90505b9392505050565b804710156106575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102a8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146106a4576040519150601f19603f3d011682016040523d82523d6000602084013e6106a9565b606091505b50509050806107205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102a8565b505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610720928692916000916107b5918516908490610832565b80519091501561072057808060200190518101906107d3919061095a565b6107205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102a8565b60606105fd848460008585843b61088b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a8565b600080866001600160a01b031685876040516108a791906109e7565b60006040518083038185875af1925050503d80600081146108e4576040519150601f19603f3d011682016040523d82523d6000602084013e6108e9565b606091505b50915091506108f9828286610904565b979650505050505050565b60608315610913575081610600565b8251156109235782518084602001fd5b8160405162461bcd60e51b81526004016102a89190610a03565b60006020828403121561094f57600080fd5b813561060081610b93565b60006020828403121561096c57600080fd5b8151801515811461060057600080fd5b6000806040838503121561098f57600080fd5b823561099a81610b93565b915060208301356109aa81610b93565b809150509250929050565b6000602082840312156109c757600080fd5b5035919050565b6000602082840312156109e057600080fd5b5051919050565b600082516109f9818460208701610b37565b9190910192915050565b6020815260008251806020840152610a22816040850160208701610b37565b601f01601f19169190910160400192915050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60008219821115610ada57610ada610b67565b500190565b600082610afc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610b1b57610b1b610b67565b500290565b600082821015610b3257610b32610b67565b500390565b60005b83811015610b52578181015183820152602001610b3a565b83811115610b61576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610ba857600080fd5b5056fea264697066735822122039dfdc757a4cd5453dfa186a8180ec5bde68022f20047284e50732e5f40404a564736f6c6343000807003368747470733a2f2f626174697374616f6e746865626561742e636f6d2f31303070616765732f746f6b656e2f
Deployed Bytecode
0x6080604052600436106200026f5760003560e01c80637b577a641162000147578063accc898a11620000b9578063d9dad80d1162000078578063d9dad80d14620007ea578063d9e0058b146200080f578063e33b7de31462000834578063e985e9c5146200084b578063f2fde38b146200089857600080fd5b8063accc898a1462000730578063b88d4fde1462000755578063c87b56dd146200077a578063cad96cca146200079f578063d5abeb0114620007d357600080fd5b80638da5cb5b11620001065780638da5cb5b1462000696578063922d5f4114620006b657806395d89b4114620006ce57806399f7b56714620006e6578063a22cb465146200070b57600080fd5b80637b577a6414620005d05780638058575314620005f55780638417b47f146200060d578063861e188f14620006325780638924af74146200064957600080fd5b80632f745c5911620001e157806355f804b311620001a057806355f804b314620005325780636352211e146200055757806370a08231146200057c578063715018a614620005a157806377d2476214620005b957600080fd5b80632f745c59146200047957806337bdc99b146200049e57806342842e0e14620004c357806346d1c28c14620004e85780634f6ccce7146200050d57600080fd5b806318160ddd116200022e57806318160ddd14620003a95780631916558714620003ca578063196080cd14620003ef57806323b872dd146200040f5780632a55205a146200043457600080fd5b806301ffc9a714620002be57806306fdde0314620002f8578063081812fc146200031f578063095ea7b3146200035d578063143094db146200038457600080fd5b36620002b9577fbb70354ec8a6a6478922d1c659ccae98b8fcb68bc9e25d388b6339bfbbd231f333604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b348015620002cb57600080fd5b50620002e3620002dd366004620033b5565b620008bd565b60405190151581526020015b60405180910390f35b3480156200030557600080fd5b506200031062000914565b604051620002ef919062003763565b3480156200032c57600080fd5b50620003446200033e36600462003443565b620009ae565b6040516001600160a01b039091168152602001620002ef565b3480156200036a57600080fd5b50620003826200037c366004620032af565b62000a49565b005b3480156200039157600080fd5b5062000382620003a33660046200345d565b62000b6a565b348015620003b657600080fd5b506008545b604051908152602001620002ef565b348015620003d757600080fd5b5062000382620003e93660046200314b565b62000ba4565b348015620003fc57600080fd5b506015546001600160a01b031662000344565b3480156200041c57600080fd5b50620003826200042e366004620031a9565b62000d2b565b3480156200044157600080fd5b506200045962000453366004620034af565b62000d63565b604080516001600160a01b039093168352602083019190915201620002ef565b3480156200048657600080fd5b50620003bb62000498366004620032af565b62000e77565b348015620004ab57600080fd5b5062000382620004bd36600462003443565b62000f11565b348015620004d057600080fd5b5062000382620004e2366004620031a9565b620010af565b348015620004f557600080fd5b506200038262000507366004620032de565b620010cc565b3480156200051a57600080fd5b50620003bb6200052c36600462003443565b620011c3565b3480156200053f57600080fd5b506200038262000551366004620033f5565b6200125c565b3480156200056457600080fd5b50620003446200057636600462003443565b620012a2565b3480156200058957600080fd5b50620003bb6200059b3660046200314b565b6200131b565b348015620005ae57600080fd5b5062000382620013a4565b348015620005c657600080fd5b50600c54620003bb565b348015620005dd57600080fd5b50620002e3620005ef36600462003443565b620013df565b3480156200060257600080fd5b50620003bb62001452565b3480156200061a57600080fd5b50620003826200062c36600462003443565b62001496565b6200038262000643366004620034d2565b620014c8565b3480156200065657600080fd5b506200066e62000668366004620034af565b620017c3565b604080516001600160a01b0390931683526001600160601b03909116602083015201620002ef565b348015620006a357600080fd5b50600a546001600160a01b031662000344565b348015620006c357600080fd5b50620003826200180d565b348015620006db57600080fd5b506200031062001818565b348015620006f357600080fd5b50620003bb6200070536600462003443565b62001829565b3480156200071857600080fd5b50620003826200072a36600462003278565b62001885565b3480156200073d57600080fd5b50620003bb6200074f36600462003443565b62001892565b3480156200076257600080fd5b506200038262000774366004620031ef565b6200190a565b3480156200078757600080fd5b50620003106200079936600462003443565b62001949565b348015620007ac57600080fd5b50620007c4620007be36600462003443565b62001a2e565b604051620002ef91906200374e565b348015620007e057600080fd5b50600f54620003bb565b348015620007f757600080fd5b506200034462000809366004620034af565b62001abf565b3480156200081c57600080fd5b50620003826200082e36600462003443565b62001b1d565b3480156200084157600080fd5b50600d54620003bb565b3480156200085857600080fd5b50620002e36200086a3660046200316b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015620008a557600080fd5b5062000382620008b73660046200314b565b62001cf0565b60006001600160e01b03198216631131d2f360e21b1415620008e157506001919050565b6001600160e01b0319821663152a902d60e11b14156200090357506001919050565b6200090e8262001d92565b92915050565b606060008054620009259062003a5b565b80601f0160208091040260200160405190810160405280929190818152602001828054620009539062003a5b565b8015620009a45780601f106200097857610100808354040283529160200191620009a4565b820191906000526020600020905b8154815290600101906020018083116200098657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031662000a2d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600062000a5682620012a2565b9050806001600160a01b0316836001600160a01b0316141562000ac65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840162000a24565b336001600160a01b038216148062000ae5575062000ae581336200086a565b62000b595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840162000a24565b62000b65838362001dba565b505050565b600a546001600160a01b0316331462000b975760405162461bcd60e51b815260040162000a2490620037ca565b62000b6583838362001e2a565b600062000bb1826200131b565b90506000811162000bd65760405162461bcd60e51b815260040162000a2490620038f7565b600062000be38362001ee1565b90506000811162000c4d5760405162461bcd60e51b815260206004820152602d60248201527f476976656177617953706c69747465723a206163636f756e74206973206e6f7460448201526c2064756520676976656177617960981b606482015260840162000a24565b62000c59838262001f4b565b80600d600082825462000c6d9190620039be565b90915550600090505b8281101562000ce257600062000c8d858362000e77565b9050600062000c9c826200206a565b90508060106000848152602001908152602001600020600082825462000cc39190620039be565b925050819055505050808062000cd99062003a98565b91505062000c76565b50604080516001600160a01b0385168152602081018390527fb75f306491f3f6778f6a8e259b0a2c215c669d0fe82dfdb68dacf2d409c3928191015b60405180910390a1505050565b62000d373382620020a3565b62000d565760405162461bcd60e51b815260040162000a2490620038a6565b62000b65838383620021a2565b6000828152600b60209081526040808320805482518185028101850190935280835284938493929190849084015b8282101562000de257600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910162000d91565b50505050905060008151111562000e67578060008151811062000e095762000e0962003b0f565b6020026020010151600001516127108260008151811062000e2e5762000e2e62003b0f565b6020026020010151602001516001600160601b03168662000e509190620039f0565b62000e5c9190620039d9565b925092505062000e70565b60008092509250505b9250929050565b600062000e84836200131b565b821062000ee85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840162000a24565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600062000f1e82620012a2565b90506001600160a01b03811662000f9e5760405162461bcd60e51b815260206004820152603d60248201527f436f6c6c6563746f7273476976656177617953706c69747465723a20746f6b6560448201527f6e4964206f776e657220697320746865207a65726f2061646472657373000000606482015260840162000a24565b600062000fab836200206a565b905060008111620010255760405162461bcd60e51b815260206004820152603c60248201527f436f6c6c6563746f7273476976656177617953706c69747465723a20746f6b6560448201527f6e4964206973206e6f742064756520616e792067697665617761797300000000606482015260840162000a24565b62001031828262001f4b565b80600d6000828254620010459190620039be565b9091555050600083815260106020526040812080548392906200106a908490620039be565b9091555050604080516001600160a01b0384168152602081018390527fb75f306491f3f6778f6a8e259b0a2c215c669d0fe82dfdb68dacf2d409c39281910162000d1e565b62000b65838383604051806020016040528060008152506200190a565b600a546001600160a01b03163314620010f95760405162461bcd60e51b815260040162000a2490620037ca565b601360146040516200110b9062002f2a565b620011189291906200371c565b604051809103906000f08015801562001135573d6000803e3d6000fd5b50601580546001600160a01b0319166001600160a01b03929092169190911790556040517f2c112c677a78e6466a0d32f8923c4d4b64c808165cab5361f6b7ad660575e3619062001190906013908590601490869062003668565b60405180910390a18151620011ad90601390602085019062002f38565b50805162000b6590601490602084019062002fa2565b6000620011cf60085490565b8210620012345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840162000a24565b600882815481106200124a576200124a62003b0f565b90600052602060002001549050919050565b600a546001600160a01b03163314620012895760405162461bcd60e51b815260040162000a2490620037ca565b80516200129e90600e90602084019062002fe0565b5050565b6000818152600260205260408120546001600160a01b0316806200090e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840162000a24565b60006001600160a01b038216620013885760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840162000a24565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314620013d15760405162461bcd60e51b815260040162000a2490620037ca565b620013dd60006200235b565b565b600081600111158015620013f4575060648211155b620014135760405162461bcd60e51b815260040162000a24906200385c565b60126000620014228462001829565b815260208101919091526040016000205460ff1680156200090e575060646200144b8362001892565b1092915050565b60008062001460336200131b565b905060008111620014855760405162461bcd60e51b815260040162000a2490620038f7565b620014903362001ee1565b91505090565b600a546001600160a01b03163314620014c35760405162461bcd60e51b815260040162000a2490620037ca565b600c55565b6015546001600160a01b0316620015375760405162461bcd60e51b815260206004820152602c60248201527f5061676573546f6b656e3a20436f6c6c6563746f725061796d656e7453706c6960448201526b1d1d195c881b9bdd081cd95d60a21b606482015260840162000a24565b600c543414620015965760405162461bcd60e51b8152602060048201526024808201527f5061676573546f6b656e3a20696e636f7272656374206d696e74696e67207072604482015263696e636560e01b606482015260840162000a24565b8060ff16600111158015620015af575060648160ff1611155b620015ce5760405162461bcd60e51b815260040162000a24906200385c565b6000620015de8260ff1662001829565b60008181526012602052604090205490915060ff1615156001146200165c5760405162461bcd60e51b815260206004820152602d60248201527f5061676573546f6b656e3a2063686170746572206973206e6f74206f70656e6560448201526c6420666f72206d696e74696e6760981b606482015260840162000a24565b60ff821660009081526011602052604090205460648110620016dc5760405162461bcd60e51b815260206004820152603260248201527f5061676573546f6b656e3a206561636820706167652063616e206f6e6c79206260448201527165206d696e746564203130302074696d657360701b606482015260840162000a24565b6000620016f960ff8516620016f3846001620039be565b620023ad565b905062001707338262002421565b60ff8416600090815260116020526040902080546001019055601554600c546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156200175d573d6000803e3d6000fd5b50601554604051631916558760e01b81523060048201526001600160a01b0390911690631916558790602401600060405180830381600087803b158015620017a457600080fd5b505af1158015620017b9573d6000803e3d6000fd5b5050505050505050565b600b6020528160005260406000208181548110620017e057600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b620013dd3362000ba4565b606060018054620009259062003a5b565b6000816001111580156200183e575060648211155b6200185d5760405162461bcd60e51b815260040162000a24906200385c565b60146200186c60018462003a12565b620018789190620039d9565b6200090e906001620039be565b6200129e33838362002449565b600081600111158015620018a7575060648211155b620018f55760405162461bcd60e51b815260206004820152601e60248201527f70616765206d757374206265206265747765656e203120616e64203130300000604482015260640162000a24565b6000828152601160205260409020546200090e565b620019163383620020a3565b620019355760405162461bcd60e51b815260040162000a2490620038a6565b62001943848484846200251a565b50505050565b6000818152600260205260409020546060906001600160a01b0316620019ca5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840162000a24565b6000620019d662002554565b90506000815111620019f8576040518060200160405280600081525062001a27565b8062001a048462002565565b60405160200162001a17929190620035f6565b6040516020818303038152906040525b9392505050565b6060600b6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101562001ab457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b03168183015282526001909201910162001a63565b505050509050919050565b60008260011115801562001ad4575060648311155b801562001ae15750600082115b801562001aee5750606582105b62001b0d5760405162461bcd60e51b815260040162000a2490620037ff565b62001a27620005768484620023ad565b600a546001600160a01b0316331462001b4a5760405162461bcd60e51b815260040162000a2490620037ca565b8060011115801562001b5d575060058111155b62001bbf5760405162461bcd60e51b815260206004820152602b60248201527f5061676573546f6b656e3a2063686170746572206d757374206265206265747760448201526a65656e203120616e64203560a81b606482015260840162000a24565b60008181526012602052604090205460ff161562001c2e5760405162461bcd60e51b815260206004820152602560248201527f5061676573546f6b656e3a206368617074657220697320616c7265616479206f6044820152641c195b995960da1b606482015260840162000a24565b600181111562001cc3576012600062001c4960018462003a12565b815260208101919091526040016000205460ff16151560011462001cc35760405162461bcd60e51b815260206004820152602a60248201527f5061676573546f6b656e3a2070726576696f75732063686170746572206973206044820152691b9bdd081bdc195b995960b21b606482015260840162000a24565b6000818152601260205260409020805460ff1916600117905562001cea816107d0620039f0565b600f5550565b600a546001600160a01b0316331462001d1d5760405162461bcd60e51b815260040162000a2490620037ca565b6001600160a01b03811662001d845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000a24565b62001d8f816200235b565b50565b60006001600160e01b0319821663780e9d6360e01b14806200090e57506200090e826200267b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819062001df182620012a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908162001e41579050509050818160008151811062001e825762001e8262003b0f565b6020026020010151602001906001600160601b031690816001600160601b031681525050828160008151811062001ebd5762001ebd62003b0f565b60209081029190910101516001600160a01b039091169052620019438482620026ce565b60008062001eef836200131b565b90506000805b8281101562001f4357600062001f0c868362000e77565b9050600062001f1b826200206a565b905062001f298185620039be565b93505050808062001f3a9062003a98565b91505062001ef5565b509392505050565b8047101562001f9d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640162000a24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811462001fec576040519150601f19603f3d011682016040523d82523d6000602084013e62001ff1565b606091505b505090508062000b655760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840162000a24565b600081815260106020526040812054600f54600d546200208b9047620039be565b620020979190620039d9565b6200090e919062003a12565b6000818152600260205260408120546001600160a01b03166200211e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840162000a24565b60006200212b83620012a2565b9050806001600160a01b0316846001600160a01b03161480620021695750836001600160a01b03166200215e84620009ae565b6001600160a01b0316145b806200219a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316620021b782620012a2565b6001600160a01b031614620022215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840162000a24565b6001600160a01b038216620022855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840162000a24565b6200229283838362002865565b6200229f60008262001dba565b6001600160a01b0383166000908152600360205260408120805460019290620022ca90849062003a12565b90915550506001600160a01b0382166000908152600360205260408120805460019290620022fa908490620039be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082600111158015620023c2575060648311155b8015620023cf5750600082115b8015620023dc5750606582105b620023fb5760405162461bcd60e51b815260040162000a2490620037ff565b6200240882606462003a12565b62002415846064620039f0565b62001a27919062003a12565b6200242d8282620028a8565b6015546200129e9082906001600160a01b03166103e862001e2a565b816001600160a01b0316836001600160a01b03161415620024ad5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640162000a24565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b62002527848484620021a2565b6200253584848484620028c4565b620019435760405162461bcd60e51b815260040162000a249062003778565b6060600e8054620009259062003a5b565b6060816200258a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115620025ba5780620025a18162003a98565b9150620025b29050600a83620039d9565b91506200258e565b60008167ffffffffffffffff811115620025d857620025d862003b25565b6040519080825280601f01601f19166020018201604052801562002603576020820181803683370190505b5090505b84156200219a576200261b60018362003a12565b91506200262a600a8662003ab6565b62002637906030620039be565b60f81b8183815181106200264f576200264f62003b0f565b60200101906001600160f81b031916908160001a90535062002673600a86620039d9565b945062002607565b60006001600160e01b031982166380ac58cd60e01b1480620026ad57506001600160e01b03198216635b5e139f60e01b145b806200090e57506301ffc9a760e01b6001600160e01b03198316146200090e565b60005b8151811015620028585760006001600160a01b0316828281518110620026fb57620026fb62003b0f565b6020026020010151600001516001600160a01b03161415620027605760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015260640162000a24565b81818151811062002775576200277562003b0f565b6020026020010151602001516001600160601b031660001415620027dc5760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015260640162000a24565b6000838152600b60205260409020825183908390811062002801576200280162003b0f565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155806200284f8162003a98565b915050620026d1565b506200129e8282620029df565b6200287283838362002a1e565b6001600160a01b03831615801590620028955750600062002893826200206a565b115b1562000b655762000b6583838362002ae2565b6200129e82826040518060200160405280600081525062002bf8565b60006001600160a01b0384163b15620029d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200290b90339089908890889060040162003629565b602060405180830381600087803b1580156200292657600080fd5b505af192505050801562002959575060408051601f3d908101601f191682019092526200295691810190620033d5565b60015b620029b9573d8080156200298a576040519150601f19603f3d011682016040523d82523d6000602084013e6200298f565b606091505b508051620029b15760405162461bcd60e51b815260040162000a249062003778565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200219a565b506001949350505050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df828260405162002a1292919062003948565b60405180910390a15050565b6001600160a01b03831662002a7c5762002a7681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62002aa2565b816001600160a01b0316836001600160a01b03161462002aa25762002aa2838262002c32565b6001600160a01b03821662002abc5762000b658162002cd4565b826001600160a01b0316826001600160a01b03161462000b655762000b65828262002d8e565b6001600160a01b0383161562002baf57826001600160a01b031662002b0782620012a2565b6001600160a01b03161462002b935760405162461bcd60e51b815260206004820152604560248201527f436f6c6c6563746f7273476976656177617953706c69747465723a2066726f6d60448201527f206163636f756e74206973206e6f7420746865206f776e657220666f7220746f6064820152641ad95b925960da1b608482015260a40162000a24565b62002b9e816200206a565b1562002baf5762002baf8162000f11565b604080516001600160a01b038086168252841660208201529081018290527f7acf16d9d7a4867d547b0daadb246d2506611f4b0c47c2237dbe2f23fa35d94a9060600162000d1e565b62002c04838362002dd4565b62002c136000848484620028c4565b62000b655760405162461bcd60e51b815260040162000a249062003778565b6000600162002c41846200131b565b62002c4d919062003a12565b60008381526007602052604090205490915080821462002ca1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062002ce89060019062003a12565b6000838152600960205260408120546008805493945090928490811062002d135762002d1362003b0f565b90600052602060002001549050806008838154811062002d375762002d3762003b0f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062002d725762002d7262003af9565b6001900381819060005260206000200160009055905550505050565b600062002d9b836200131b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821662002e2c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000a24565b6000818152600260205260409020546001600160a01b03161562002e935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000a24565b62002ea16000838362002865565b6001600160a01b038216600090815260036020526040812080546001929062002ecc908490620039be565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6111738062003b6983390190565b82805482825590600052602060002090810192821562002f90579160200282015b8281111562002f9057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062002f59565b5062002f9e9291506200305c565b5090565b82805482825590600052602060002090810192821562002f90579160200282015b8281111562002f9057825182559160200191906001019062002fc3565b82805462002fee9062003a5b565b90600052602060002090601f01602090048101928262003012576000855562002f90565b82601f106200302d57805160ff191683800117855562002f90565b8280016001018555821562002f90579182018281111562002f9057825182559160200191906001019062002fc3565b5b8082111562002f9e57600081556001016200305d565b600067ffffffffffffffff83111562003090576200309062003b25565b620030a5601f8401601f191660200162003963565b9050828152838383011115620030ba57600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030e357600080fd5b81356020620030fc620030f68362003997565b62003963565b80838252828201915082860187848660051b89010111156200311d57600080fd5b60005b858110156200313e5781358452928401929084019060010162003120565b5090979650505050505050565b6000602082840312156200315e57600080fd5b813562001a278162003b3b565b600080604083850312156200317f57600080fd5b82356200318c8162003b3b565b915060208301356200319e8162003b3b565b809150509250929050565b600080600060608486031215620031bf57600080fd5b8335620031cc8162003b3b565b92506020840135620031de8162003b3b565b929592945050506040919091013590565b600080600080608085870312156200320657600080fd5b8435620032138162003b3b565b93506020850135620032258162003b3b565b925060408501359150606085013567ffffffffffffffff8111156200324957600080fd5b8501601f810187136200325b57600080fd5b6200326c8782356020840162003073565b91505092959194509250565b600080604083850312156200328c57600080fd5b8235620032998162003b3b565b9150602083013580151581146200319e57600080fd5b60008060408385031215620032c357600080fd5b8235620032d08162003b3b565b946020939093013593505050565b60008060408385031215620032f257600080fd5b823567ffffffffffffffff808211156200330b57600080fd5b818501915085601f8301126200332057600080fd5b8135602062003333620030f68362003997565b8083825282820191508286018a848660051b89010111156200335457600080fd5b600096505b84871015620033845780356200336f8162003b3b565b83526001969096019591830191830162003359565b50965050860135925050808211156200339c57600080fd5b50620033ab85828601620030d1565b9150509250929050565b600060208284031215620033c857600080fd5b813562001a278162003b51565b600060208284031215620033e857600080fd5b815162001a278162003b51565b6000602082840312156200340857600080fd5b813567ffffffffffffffff8111156200342057600080fd5b8201601f810184136200343257600080fd5b6200219a8482356020840162003073565b6000602082840312156200345657600080fd5b5035919050565b6000806000606084860312156200347357600080fd5b833592506020840135620034878162003b3b565b915060408401356001600160601b0381168114620034a457600080fd5b809150509250925092565b60008060408385031215620034c357600080fd5b50508035926020909101359150565b600060208284031215620034e557600080fd5b813560ff8116811462001a2757600080fd5b6000815480845260208085019450836000528060002060005b83811015620035375781546001600160a01b03168752958201956001918201910162003510565b509495945050505050565b600081518084526020808501945080840160005b838110156200353757815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010162003556565b6000815480845260208085019450836000528060002060005b838110156200353757815487529582019560019182019101620035aa565b60008151808452620035e281602086016020860162003a2c565b601f01601f19169290920160200192915050565b600083516200360a81846020880162003a2c565b8351908301906200362081836020880162003a2c565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906200365e90830184620035c8565b9695505050505050565b6080815260006200367d6080830187620034f7565b82810360208481019190915286518083528782019282019060005b81811015620036bf5784516001600160a01b03168352938301939183019160010162003698565b50508481036040860152620036d5818862003591565b858103606087015286518082528388019450908301915060005b818110156200370d57845183529383019391830191600101620036ef565b50909998505050505050505050565b604081526000620037316040830185620034f7565b828103602084015262003745818562003591565b95945050505050565b60208152600062001a27602083018462003542565b60208152600062001a276020830184620035c8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603f908201527f5061676573546f6b656e3a2070616765206d757374206265206265747765656e60408201527f203120616e642031303020616e64206e4f6648756e6472656420312d31303000606082015260800190565b6020808252602a908201527f5061676573546f6b656e3a2070616765206d757374206265206265747765656e6040820152690203120616e64203130360b41b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526031908201527f436f6c6c6563746f7273476976656177617953706c69747465723a206163636f604082015270756e7420686173206e6f20746f6b656e7360781b606082015260800190565b8281526040602082015260006200219a604083018462003542565b604051601f8201601f1916810167ffffffffffffffff811182821017156200398f576200398f62003b25565b604052919050565b600067ffffffffffffffff821115620039b457620039b462003b25565b5060051b60200190565b60008219821115620039d457620039d462003acd565b500190565b600082620039eb57620039eb62003ae3565b500490565b600081600019048311821515161562003a0d5762003a0d62003acd565b500290565b60008282101562003a275762003a2762003acd565b500390565b60005b8381101562003a4957818101518382015260200162003a2f565b83811115620019435750506000910152565b600181811c9082168062003a7057607f821691505b6020821081141562003a9257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562003aaf5762003aaf62003acd565b5060010190565b60008262003ac85762003ac862003ae3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462001d8f57600080fd5b6001600160e01b03198116811462001d8f57600080fdfe608060405260405162001173380380620011738339810160408190526200002691620003ca565b818180518251146200009a5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620000ed5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000091565b60005b825181101562000159576200014483828151811062000113576200011362000556565b602002602001015183838151811062000130576200013062000556565b60200260200101516200016460201b60201c565b80620001508162000522565b915050620000f0565b505050505062000582565b6001600160a01b038216620001d15760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000091565b60008111620002235760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000091565b6001600160a01b038216600090815260026020526040902054156200029f5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000091565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600260205260408120829055546200030790829062000507565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600082601f8301126200036257600080fd5b815160206200037b6200037583620004e1565b620004ae565b80838252828201915082860187848660051b89010111156200039c57600080fd5b60005b85811015620003bd578151845292840192908401906001016200039f565b5090979650505050505050565b60008060408385031215620003de57600080fd5b82516001600160401b0380821115620003f657600080fd5b818501915085601f8301126200040b57600080fd5b815160206200041e6200037583620004e1565b8083825282820191508286018a848660051b89010111156200043f57600080fd5b600096505b848710156200047a5780516001600160a01b03811681146200046557600080fd5b83526001969096019591830191830162000444565b50918801519196509093505050808211156200049557600080fd5b50620004a48582860162000350565b9150509250929050565b604051601f8201601f191681016001600160401b0381118282101715620004d957620004d96200056c565b604052919050565b60006001600160401b03821115620004fd57620004fd6200056c565b5060051b60200190565b600082198211156200051d576200051d62000540565b500190565b600060001982141562000539576200053962000540565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b610be180620005926000396000f3fe60806040526004361061008a5760003560e01c80638b83209b116100595780638b83209b146101845780639852595c146101bc578063ce7c2ac2146101f2578063d79779b214610228578063e33b7de31461025e57600080fd5b806319165587146100d85780633a98ef39146100fa578063406072a91461011e57806348b750441461016457600080fd5b366100d3577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156100e457600080fd5b506100f86100f336600461093d565b610273565b005b34801561010657600080fd5b506000545b6040519081526020015b60405180910390f35b34801561012a57600080fd5b5061010b61013936600461097c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561017057600080fd5b506100f861017f36600461097c565b6103aa565b34801561019057600080fd5b506101a461019f3660046109b5565b610592565b6040516001600160a01b039091168152602001610115565b3480156101c857600080fd5b5061010b6101d736600461093d565b6001600160a01b031660009081526003602052604090205490565b3480156101fe57600080fd5b5061010b61020d36600461093d565b6001600160a01b031660009081526002602052604090205490565b34801561023457600080fd5b5061010b61024336600461093d565b6001600160a01b031660009081526005602052604090205490565b34801561026a57600080fd5b5060015461010b565b6001600160a01b0381166000908152600260205260409020546102b15760405162461bcd60e51b81526004016102a890610a36565b60405180910390fd5b60006102bc60015490565b6102c69047610ac7565b905060006102f383836102ee866001600160a01b031660009081526003602052604090205490565b6105c2565b9050806103125760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b0383166000908152600360205260408120805483929061033a908490610ac7565b9250508190555080600160008282546103539190610ac7565b9091555061036390508382610607565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0381166000908152600260205260409020546103df5760405162461bcd60e51b81526004016102a890610a36565b6001600160a01b0382166000908152600560205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561043757600080fd5b505afa15801561044b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046f91906109ce565b6104799190610ac7565b905060006104b283836102ee87876001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b9050806104d15760405162461bcd60e51b81526004016102a890610a7c565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290610508908490610ac7565b90915550506001600160a01b03841660009081526005602052604081208054839290610535908490610ac7565b909155506105469050848483610725565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000600482815481106105a7576105a7610b7d565b6000918252602090912001546001600160a01b031692915050565b600080546001600160a01b0385168252600260205260408220548391906105e99086610b01565b6105f39190610adf565b6105fd9190610b20565b90505b9392505050565b804710156106575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102a8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146106a4576040519150601f19603f3d011682016040523d82523d6000602084013e6106a9565b606091505b50509050806107205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102a8565b505050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610720928692916000916107b5918516908490610832565b80519091501561072057808060200190518101906107d3919061095a565b6107205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102a8565b60606105fd848460008585843b61088b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a8565b600080866001600160a01b031685876040516108a791906109e7565b60006040518083038185875af1925050503d80600081146108e4576040519150601f19603f3d011682016040523d82523d6000602084013e6108e9565b606091505b50915091506108f9828286610904565b979650505050505050565b60608315610913575081610600565b8251156109235782518084602001fd5b8160405162461bcd60e51b81526004016102a89190610a03565b60006020828403121561094f57600080fd5b813561060081610b93565b60006020828403121561096c57600080fd5b8151801515811461060057600080fd5b6000806040838503121561098f57600080fd5b823561099a81610b93565b915060208301356109aa81610b93565b809150509250929050565b6000602082840312156109c757600080fd5b5035919050565b6000602082840312156109e057600080fd5b5051919050565b600082516109f9818460208701610b37565b9190910192915050565b6020815260008251806020840152610a22816040850160208701610b37565b601f01601f19169190910160400192915050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60008219821115610ada57610ada610b67565b500190565b600082610afc57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610b1b57610b1b610b67565b500290565b600082821015610b3257610b32610b67565b500390565b60005b83811015610b52578181015183820152602001610b3a565b83811115610b61576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610ba857600080fd5b5056fea264697066735822122039dfdc757a4cd5453dfa186a8180ec5bde68022f20047284e50732e5f40404a564736f6c63430008070033a2646970667358221220e00fe904d9eebc4b1a6a4d1c396c4bd344cf48af30a8e05949ba04231756a5b264736f6c63430008070033
Deployed Bytecode Sourcemap
68949:11254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72675:41;15847:10;72675:41;;;-1:-1:-1;;;;;10570:32:1;;;10552:51;;72706:9:0;10634:2:1;10619:18;;10612:34;10525:18;72675:41:0;;;;;;;68949:11254;;;;;72732:407;;;;;;;;;;-1:-1:-1;72732:407:0;;;;;:::i;:::-;;:::i;:::-;;;14665:14:1;;14658:22;14640:41;;14628:2;14613:18;72732:407:0;;;;;;;;50236:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51795:221::-;;;;;;;;;;-1:-1:-1;51795:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10102:32:1;;;10084:51;;10072:2;10057:18;51795:221:0;9938:203:1;51318:411:0;;;;;;;;;;-1:-1:-1;51318:411:0;;;;;:::i;:::-;;:::i;:::-;;79603:225;;;;;;;;;;-1:-1:-1;79603:225:0;;;;;:::i;:::-;;:::i;63374:113::-;;;;;;;;;;-1:-1:-1;63462:10:0;:17;63374:113;;;30022:25:1;;;30010:2;29995:18;63374:113:0;29876:177:1;74497:778:0;;;;;;;;;;-1:-1:-1;74497:778:0;;;;;:::i;:::-;;:::i;77447:137::-;;;;;;;;;;-1:-1:-1;77546:29:0;;-1:-1:-1;;;;;77546:29:0;77447:137;;52545:339;;;;;;;;;;-1:-1:-1;52545:339:0;;;;;:::i;:::-;;:::i;79836:364::-;;;;;;;;;;-1:-1:-1;79836:364:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10570:32:1;;;10552:51;;10634:2;10619:18;;10612:34;;;;10525:18;79836:364:0;10370:282:1;63042:256:0;;;;;;;;;;-1:-1:-1;63042:256:0;;;;;:::i;:::-;;:::i;75283:641::-;;;;;;;;;;-1:-1:-1;75283:641:0;;;;;:::i;:::-;;:::i;52955:185::-;;;;;;;;;;-1:-1:-1;52955:185:0;;;;;:::i;:::-;;:::i;76950:489::-;;;;;;;;;;-1:-1:-1;76950:489:0;;;;;:::i;:::-;;:::i;63564:233::-;;;;;;;;;;-1:-1:-1;63564:233:0;;;;;:::i;:::-;;:::i;73151:104::-;;;;;;;;;;-1:-1:-1;73151:104:0;;;;;:::i;:::-;;:::i;49930:239::-;;;;;;;;;;-1:-1:-1;49930:239:0;;;;;:::i;:::-;;:::i;49660:208::-;;;;;;;;;;-1:-1:-1;49660:208:0;;;;;:::i;:::-;;:::i;17686:103::-;;;;;;;;;;;;;:::i;73374:93::-;;;;;;;;;;-1:-1:-1;73446:13:0;;73374:93;;78782:244;;;;;;;;;;-1:-1:-1;78782:244:0;;;;;:::i;:::-;;:::i;76116:259::-;;;;;;;;;;;;;:::i;73263:103::-;;;;;;;;;;-1:-1:-1;73263:103:0;;;;;:::i;:::-;;:::i;70592:987::-;;;;;;:::i;:::-;;:::i;7229:52::-;;;;;;;;;;-1:-1:-1;7229:52:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10863:32:1;;;10845:51;;-1:-1:-1;;;;;10932:39:1;;;10927:2;10912:18;;10905:67;10818:18;7229:52:0;10657:321:1;17035:87:0;;;;;;;;;;-1:-1:-1;17108:6:0;;-1:-1:-1;;;;;17108:6:0;17035:87;;74396:93;;;;;;;;;;;;;:::i;50405:104::-;;;;;;;;;;;;;:::i;73603:195::-;;;;;;;;;;-1:-1:-1;73603:195:0;;;;;:::i;:::-;;:::i;52088:155::-;;;;;;;;;;-1:-1:-1;52088:155:0;;;;;:::i;:::-;;:::i;79034:191::-;;;;;;;;;;-1:-1:-1;79034:191:0;;;;;:::i;:::-;;:::i;53211:328::-;;;;;;;;;;-1:-1:-1;53211:328:0;;;;;:::i;:::-;;:::i;50580:334::-;;;;;;;;;;-1:-1:-1;50580:334:0;;;;;:::i;:::-;;:::i;8324:137::-;;;;;;;;;;-1:-1:-1;8324:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;78686:84::-;;;;;;;;;;-1:-1:-1;78752:10:0;;78686:84;;77885:279;;;;;;;;;;-1:-1:-1;77885:279:0;;;;;:::i;:::-;;:::i;78172:506::-;;;;;;;;;;-1:-1:-1;78172:506:0;;;;;:::i;:::-;;:::i;76847:95::-;;;;;;;;;;-1:-1:-1;76920:14:0;;76847:95;;52314:164;;;;;;;;;;-1:-1:-1;52314:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;52435:25:0;;;52411:4;52435:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52314:164;17944:201;;;;;;;;;;-1:-1:-1;17944:201:0;;;;;:::i;:::-;;:::i;72732:407::-;72871:4;-1:-1:-1;;;;;;72896:53:0;;-1:-1:-1;;;72896:53:0;72893:96;;;-1:-1:-1;72973:4:0;;72732:407;-1:-1:-1;72732:407:0:o;72893:96::-;-1:-1:-1;;;;;;73002:36:0;;-1:-1:-1;;;73002:36:0;72999:79;;;-1:-1:-1;73062:4:0;;72732:407;-1:-1:-1;72732:407:0:o;72999:79::-;73095:36;73119:11;73095:23;:36::i;:::-;73088:43;72732:407;-1:-1:-1;;72732:407:0:o;50236:100::-;50290:13;50323:5;50316:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50236:100;:::o;51795:221::-;51871:7;55138:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55138:16:0;51891:73;;;;-1:-1:-1;;;51891:73:0;;22656:2:1;51891:73:0;;;22638:21:1;22695:2;22675:18;;;22668:30;22734:34;22714:18;;;22707:62;-1:-1:-1;;;22785:18:1;;;22778:42;22837:19;;51891:73:0;;;;;;;;;-1:-1:-1;51984:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;51984:24:0;;51795:221::o;51318:411::-;51399:13;51415:23;51430:7;51415:14;:23::i;:::-;51399:39;;51463:5;-1:-1:-1;;;;;51457:11:0;:2;-1:-1:-1;;;;;51457:11:0;;;51449:57;;;;-1:-1:-1;;;51449:57:0;;24688:2:1;51449:57:0;;;24670:21:1;24727:2;24707:18;;;24700:30;24766:34;24746:18;;;24739:62;-1:-1:-1;;;24817:18:1;;;24810:31;24858:19;;51449:57:0;24486:397:1;51449:57:0;15847:10;-1:-1:-1;;;;;51541:21:0;;;;:62;;-1:-1:-1;51566:37:0;51583:5;15847:10;52314:164;:::i;51566:37::-;51519:168;;;;-1:-1:-1;;;51519:168:0;;20261:2:1;51519:168:0;;;20243:21:1;20300:2;20280:18;;;20273:30;20339:34;20319:18;;;20312:62;20410:26;20390:18;;;20383:54;20454:19;;51519:168:0;20059:420:1;51519:168:0;51700:21;51709:2;51713:7;51700:8;:21::i;:::-;51388:341;51318:411;;:::o;79603:225::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;79744:76:::1;79758:8;79768:27;79797:22;79744:13;:76::i;74497:778::-:0;74565:20;74588:18;74598:7;74588:9;:18::i;:::-;74565:41;;74640:1;74625:12;:16;74617:78;;;;-1:-1:-1;;;74617:78:0;;;;;;;:::i;:::-;74706:21;74730:25;74747:7;74730:16;:25::i;:::-;74706:49;;74790:1;74774:13;:17;74766:75;;;;-1:-1:-1;;;74766:75:0;;26815:2:1;74766:75:0;;;26797:21:1;26854:2;26834:18;;;26827:30;26893:34;26873:18;;;26866:62;-1:-1:-1;;;26944:18:1;;;26937:43;26997:19;;74766:75:0;26613:409:1;74766:75:0;74854:41;74872:7;74881:13;74854:17;:41::i;:::-;74934:13;74916:14;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;74963:9:0;;-1:-1:-1;74958:254:0;74983:12;74978:1;:19;74958:254;;;75019:17;75039:31;75059:7;75068:1;75039:19;:31::i;:::-;75019:51;;75085:24;75112:30;75129:12;75112:16;:30::i;:::-;75085:57;;75184:16;75157:9;:23;75167:12;75157:23;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;75004:208;;74999:3;;;;;:::i;:::-;;;;74958:254;;;-1:-1:-1;75227:40:0;;;-1:-1:-1;;;;;10570:32:1;;10552:51;;10634:2;10619:18;;10612:34;;;75227:40:0;;10525:18:1;75227:40:0;;;;;;;;74554:721;;74497:778;:::o;52545:339::-;52740:41;15847:10;52773:7;52740:18;:41::i;:::-;52732:103;;;;-1:-1:-1;;;52732:103:0;;;;;;;:::i;:::-;52848:28;52858:4;52864:2;52868:7;52848:9;:28::i;79836:364::-;79918:16;80005:19;;;:9;:19;;;;;;;;79970:54;;;;;;;;;;;;;;;;;79918:16;;;;79970:54;80005:19;79970:54;79918:16;;79970:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79970:54:0;;;;-1:-1:-1;;;79970:54:0;;-1:-1:-1;;;;;79970:54:0;;;;;;;;;;;;;;;;;;;;;;80058:1;80038:10;:17;:21;80035:125;;;80084:10;80095:1;80084:13;;;;;;;;:::i;:::-;;;;;;;:21;;;80142:5;80121:10;80132:1;80121:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;80108:32:0;:10;:32;;;;:::i;:::-;80107:40;;;;:::i;:::-;80076:72;;;;;;;80035:125;80186:1;80190;80170:22;;;;;79836:364;;;;;;:::o;63042:256::-;63139:7;63175:23;63192:5;63175:16;:23::i;:::-;63167:5;:31;63159:87;;;;-1:-1:-1;;;63159:87:0;;15937:2:1;63159:87:0;;;15919:21:1;15976:2;15956:18;;;15949:30;16015:34;15995:18;;;15988:62;-1:-1:-1;;;16066:18:1;;;16059:41;16117:19;;63159:87:0;15735:407:1;63159:87:0;-1:-1:-1;;;;;;63264:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;63042:256::o;75283:641::-;75343:18;75364:16;75372:7;75364;:16::i;:::-;75343:37;-1:-1:-1;;;;;;75399:24:0;;75391:98;;;;-1:-1:-1;;;75391:98:0;;25090:2:1;75391:98:0;;;25072:21:1;25129:2;25109:18;;;25102:30;25168:34;25148:18;;;25141:62;25239:31;25219:18;;;25212:59;25288:19;;75391:98:0;24888:425:1;75391:98:0;75502:30;75535:25;75552:7;75535:16;:25::i;:::-;75502:58;;75604:1;75579:22;:26;75571:99;;;;-1:-1:-1;;;75571:99:0;;21507:2:1;75571:99:0;;;21489:21:1;21546:2;21526:18;;;21519:30;21585:34;21565:18;;;21558:62;21656:30;21636:18;;;21629:58;21704:19;;75571:99:0;21305:424:1;75571:99:0;75681:62;75707:10;75720:22;75681:17;:62::i;:::-;75772:22;75754:14;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;75805:18:0;;;;:9;:18;;;;;:43;;75826:22;;75805:18;:43;;75826:22;;75805:43;:::i;:::-;;;;-1:-1:-1;;75864:52:0;;;-1:-1:-1;;;;;10570:32:1;;10552:51;;10634:2;10619:18;;10612:34;;;75864:52:0;;10525:18:1;75864:52:0;10370:282:1;52955:185:0;53093:39;53110:4;53116:2;53120:7;53093:39;;;;;;;;;;;;:16;:39::i;76950:489::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;77160:21:::1;77183:19;77127:76;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;77095:29:0::1;:108:::0;;-1:-1:-1;;;;;;77095:108:0::1;-1:-1:-1::0;;;;;77095:108:0;;;::::1;::::0;;;::::1;::::0;;77219:106:::1;::::0;::::1;::::0;::::1;::::0;77240:21:::1;::::0;77263:20;;77285:19:::1;::::0;77306:18;;77219:106:::1;:::i;:::-;;;;;;;;77336:44:::0;;::::1;::::0;:21:::1;::::0;:44:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;77391:40:0;;::::1;::::0;:19:::1;::::0;:40:::1;::::0;::::1;::::0;::::1;:::i;63564:233::-:0;63639:7;63675:30;63462:10;:17;;63374:113;63675:30;63667:5;:38;63659:95;;;;-1:-1:-1;;;63659:95:0;;27647:2:1;63659:95:0;;;27629:21:1;27686:2;27666:18;;;27659:30;27725:34;27705:18;;;27698:62;-1:-1:-1;;;27776:18:1;;;27769:42;27828:19;;63659:95:0;27445:408:1;63659:95:0;63772:10;63783:5;63772:17;;;;;;;;:::i;:::-;;;;;;;;;63765:24;;63564:233;;;:::o;73151:104::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;73222:25;;::::1;::::0;:15:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;;73151:104:::0;:::o;49930:239::-;50002:7;50038:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50038:16:0;50073:19;50065:73;;;;-1:-1:-1;;;50065:73:0;;21097:2:1;50065:73:0;;;21079:21:1;21136:2;21116:18;;;21109:30;21175:34;21155:18;;;21148:62;-1:-1:-1;;;21226:18:1;;;21219:39;21275:19;;50065:73:0;20895:405:1;49660:208:0;49732:7;-1:-1:-1;;;;;49760:19:0;;49752:74;;;;-1:-1:-1;;;49752:74:0;;20686:2:1;49752:74:0;;;20668:21:1;20725:2;20705:18;;;20698:30;20764:34;20744:18;;;20737:62;-1:-1:-1;;;20815:18:1;;;20808:40;20865:19;;49752:74:0;20484:406:1;49752:74:0;-1:-1:-1;;;;;;49844:16:0;;;;;:9;:16;;;;;;;49660:208::o;17686:103::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;17751:30:::1;17778:1;17751:18;:30::i;:::-;17686:103::o:0;78782:244::-;78835:4;78865;78860:1;:9;;:24;;;;;78881:3;78873:4;:11;;78860:24;78852:79;;;;-1:-1:-1;;;78852:79:0;;;;;;;:::i;:::-;78949:22;:40;78972:16;78983:4;78972:10;:16::i;:::-;78949:40;;;;;;;;;;;-1:-1:-1;78949:40:0;;;;:69;;;;;79014:3;78994:17;79006:4;78994:11;:17::i;:::-;:23;78942:76;78782:244;-1:-1:-1;;78782:244:0:o;76116:259::-;76164:7;;76207:23;15847:10;49660:208;:::i;76207:23::-;76184:46;;76264:1;76249:12;:16;76241:78;;;;-1:-1:-1;;;76241:78:0;;;;;;;:::i;:::-;76337:30;15847:10;76337:16;:30::i;:::-;76330:37;;;76116:259;:::o;73263:103::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;73334:13:::1;:24:::0;73263:103::o;70592:987::-;70666:29;;-1:-1:-1;;;;;70666:29:0;70650:109;;;;-1:-1:-1;;;70650:109:0;;28060:2:1;70650:109:0;;;28042:21:1;28099:2;28079:18;;;28072:30;28138:34;28118:18;;;28111:62;-1:-1:-1;;;28189:18:1;;;28182:42;28241:19;;70650:109:0;27858:408:1;70650:109:0;70791:13;;70778:9;:26;70770:75;;;;-1:-1:-1;;;70770:75:0;;15532:2:1;70770:75:0;;;15514:21:1;15571:2;15551:18;;;15544:30;15610:34;15590:18;;;15583:62;-1:-1:-1;;;15661:18:1;;;15654:34;15705:19;;70770:75:0;15330:400:1;70770:75:0;70869:4;70864:9;;:1;:9;;:24;;;;;70885:3;70877:4;:11;;;;70864:24;70856:79;;;;-1:-1:-1;;;70856:79:0;;;;;;;:::i;:::-;70948:12;70963:16;70974:4;70963:16;;:10;:16::i;:::-;70998:31;;;;:22;:31;;;;;;70948;;-1:-1:-1;70998:31:0;;:39;;:31;:39;70990:97;;;;-1:-1:-1;;;70990:97:0;;15118:2:1;70990:97:0;;;15100:21:1;15157:2;15137:18;;;15130:30;15196:34;15176:18;;;15169:62;-1:-1:-1;;;15247:18:1;;;15240:43;15300:19;;70990:97:0;14916:409:1;70990:97:0;71126:18;;;71108:15;71126:18;;;:12;:18;;;;;12471:14;71186:3;71173:16;;71165:79;;;;-1:-1:-1;;;71165:79:0;;28473:2:1;71165:79:0;;;28455:21:1;28512:2;28492:18;;;28485:30;28551:34;28531:18;;;28524:62;-1:-1:-1;;;28602:18:1;;;28595:48;28660:19;;71165:79:0;28271:414:1;71165:79:0;71255:15;71273:22;;;;71282:12;:10;71293:1;71282:12;:::i;:::-;71273:2;:22::i;:::-;71255:40;;71306:29;71315:10;71327:7;71306:8;:29::i;:::-;71346:18;;;;;;;:12;:18;;;;;12590:19;;12608:1;12590:19;;;71395:29;;71435:13;;71387:62;;-1:-1:-1;;;;;71395:29:0;;;;71387:62;;;;;71435:13;71395:29;71387:62;71395:29;71387:62;71435:13;71395:29;71387:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71510:29:0;;:61;;-1:-1:-1;;;71510:61:0;;71564:4;71510:61;;;10084:51:1;-1:-1:-1;;;;;71510:29:0;;;;:37;;10057:18:1;;71510:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70639:940;;;70592:987;:::o;7229:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7229:52:0;;;-1:-1:-1;;;;7229:52:0;;-1:-1:-1;;;;;7229:52:0;;-1:-1:-1;7229:52:0;:::o;74396:93::-;74451:30;15847:10;74497:778;:::i;50405:104::-;50461:13;50494:7;50487:14;;;;;:::i;73603:195::-;73655:4;73685;73680:1;:9;;:24;;;;;73701:3;73693:4;:11;;73680:24;73672:79;;;;-1:-1:-1;;;73672:79:0;;;;;;;:::i;:::-;73783:2;73775:6;73780:1;73775:4;:6;:::i;:::-;73770:15;;;;:::i;:::-;73769:21;;73789:1;73769:21;:::i;52088:155::-;52183:52;15847:10;52216:8;52226;52183:18;:52::i;79034:191::-;79087:4;79117;79112:1;:9;;:24;;;;;79133:3;79125:4;:11;;79112:24;79104:67;;;;-1:-1:-1;;;79104:67:0;;21936:2:1;79104:67:0;;;21918:21:1;21975:2;21955:18;;;21948:30;22014:32;21994:18;;;21987:60;22064:18;;79104:67:0;21734:354:1;79104:67:0;79189:18;;;;:12;:18;;;;;12471:14;79189:28;12379:114;53211:328;53386:41;15847:10;53419:7;53386:18;:41::i;:::-;53378:103;;;;-1:-1:-1;;;53378:103:0;;;;;;;:::i;:::-;53492:39;53506:4;53512:2;53516:7;53525:5;53492:13;:39::i;:::-;53211:328;;;;:::o;50580:334::-;55114:4;55138:16;;;:7;:16;;;;;;50653:13;;-1:-1:-1;;;;;55138:16:0;50679:76;;;;-1:-1:-1;;;50679:76:0;;24272:2:1;50679:76:0;;;24254:21:1;24311:2;24291:18;;;24284:30;24350:34;24330:18;;;24323:62;-1:-1:-1;;;24401:18:1;;;24394:45;24456:19;;50679:76:0;24070:411:1;50679:76:0;50768:21;50792:10;:8;:10::i;:::-;50768:34;;50844:1;50826:7;50820:21;:25;:86;;;;;;;;;;;;;;;;;50872:7;50881:18;:7;:16;:18::i;:::-;50855:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50820:86;50813:93;50580:334;-1:-1:-1;;;50580:334:0:o;8324:137::-;8399:21;8440:9;:13;8450:2;8440:13;;;;;;;;;;;8433:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8433:20:0;;;;-1:-1:-1;;;8433:20:0;;-1:-1:-1;;;;;8433:20:0;;;;;;;;;;;;;;;;;;;;;;8324:137;;;:::o;77885:279::-;77951:7;77984:4;77979:1;:9;;:24;;;;;78000:3;77992:4;:11;;77979:24;:42;;;;;78020:1;78007:10;:14;77979:42;:62;;;;;78038:3;78025:10;:16;77979:62;77971:138;;;;-1:-1:-1;;;77971:138:0;;;;;;;:::i;:::-;78127:29;78135:20;78138:4;78144:10;78135:2;:20::i;78172:506::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;78258:7:::1;78253:1;:12;;:28;;;;;78280:1;78269:7;:12;;78253:28;78245:85;;;::::0;-1:-1:-1;;;78245:85:0;;29666:2:1;78245:85:0::1;::::0;::::1;29648:21:1::0;29705:2;29685:18;;;29678:30;29744:34;29724:18;;;29717:62;-1:-1:-1;;;29795:18:1;;;29788:41;29846:19;;78245:85:0::1;29464:407:1::0;78245:85:0::1;78349:31;::::0;;;:22:::1;:31;::::0;;;;;::::1;;:40;78341:91;;;::::0;-1:-1:-1;;;78341:91:0;;25520:2:1;78341:91:0::1;::::0;::::1;25502:21:1::0;25559:2;25539:18;;;25532:30;25598:34;25578:18;;;25571:62;-1:-1:-1;;;25649:18:1;;;25642:35;25694:19;;78341:91:0::1;25318:401:1::0;78341:91:0::1;78457:1;78447:7;:11;78443:141;;;78483:22;:33;78506:9;78514:1;78506:7:::0;:9:::1;:::i;:::-;78483:33:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;78483:33:0;;::::1;;:41;;:33:::0;:41:::1;78475:97;;;::::0;-1:-1:-1;;;78475:97:0;;17532:2:1;78475:97:0::1;::::0;::::1;17514:21:1::0;17571:2;17551:18;;;17544:30;17610:34;17590:18;;;17583:62;-1:-1:-1;;;17661:18:1;;;17654:40;17711:19;;78475:97:0::1;17330:406:1::0;78475:97:0::1;78594:31;::::0;;;:22:::1;:31;::::0;;;;:38;;-1:-1:-1;;78594:38:0::1;78628:4;78594:38;::::0;;78656:14:::1;78617:7:::0;78666:4:::1;78656:14;:::i;:::-;78643:10;:27:::0;-1:-1:-1;78172:506:0:o;17944:201::-;17108:6;;-1:-1:-1;;;;;17108:6:0;15847:10;17255:23;17247:68;;;;-1:-1:-1;;;17247:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18033:22:0;::::1;18025:73;;;::::0;-1:-1:-1;;;18025:73:0;;16768:2:1;18025:73:0::1;::::0;::::1;16750:21:1::0;16807:2;16787:18;;;16780:30;16846:34;16826:18;;;16819:62;-1:-1:-1;;;16897:18:1;;;16890:36;16943:19;;18025:73:0::1;16566:402:1::0;18025:73:0::1;18109:28;18128:8;18109:18;:28::i;:::-;17944:201:::0;:::o;62734:224::-;62836:4;-1:-1:-1;;;;;;62860:50:0;;-1:-1:-1;;;62860:50:0;;:90;;;62914:36;62938:11;62914:23;:36::i;59031:174::-;59106:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;59106:29:0;-1:-1:-1;;;;;59106:29:0;;;;;;;;:24;;59160:23;59106:24;59160:14;:23::i;:::-;-1:-1:-1;;;;;59151:46:0;;;;;;;;;;;59031:174;;:::o;79233:362::-;79402:21;;;79421:1;79402:21;;;;;;;;;79367:32;;79402:21;;;;-1:-1:-1;;;;;;;;;;;;;;;;;79402:21:0;;;;;;;;;;;;;;;79367:56;;79456:22;79434:10;79445:1;79434:13;;;;;;;;:::i;:::-;;;;;;;:19;;:44;-1:-1:-1;;;;;79434:44:0;;;-1:-1:-1;;;;;79434:44:0;;;;;79513:27;79489:10;79500:1;79489:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;79489:51:0;;;;;79551:36;79566:8;79576:10;79551:14;:36::i;76383:456::-;76448:7;76468:20;76491:18;76501:7;76491:9;:18::i;:::-;76468:41;;76522:21;76563:9;76558:243;76583:12;76578:1;:18;76558:243;;;76618:17;76638:31;76658:7;76667:1;76638:19;:31::i;:::-;76618:51;;76684:24;76711:30;76728:12;76711:16;:30::i;:::-;76684:57;-1:-1:-1;76756:33:0;76684:57;76756:33;;:::i;:::-;;;76603:198;;76598:3;;;;;:::i;:::-;;;;76558:243;;;-1:-1:-1;76818:13:0;76383:456;-1:-1:-1;;;76383:456:0:o;20641:317::-;20756:6;20731:21;:31;;20723:73;;;;-1:-1:-1;;;20723:73:0;;19129:2:1;20723:73:0;;;19111:21:1;19168:2;19148:18;;;19141:30;19207:31;19187:18;;;19180:59;19256:18;;20723:73:0;18927:353:1;20723:73:0;20810:12;20828:9;-1:-1:-1;;;;;20828:14:0;20850:6;20828:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20809:52;;;20880:7;20872:78;;;;-1:-1:-1;;;20872:78:0;;18702:2:1;20872:78:0;;;18684:21:1;18741:2;18721:18;;;18714:30;18780:34;18760:18;;;18753:62;18851:28;18831:18;;;18824:56;18897:19;;20872:78:0;18500:422:1;75932:176:0;75997:7;76082:18;;;:9;:18;;;;;;78752:10;;76920:14;;76025:39;;:21;:39;:::i;:::-;76024:55;;;;:::i;:::-;:76;;;;:::i;55343:348::-;55436:4;55138:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55138:16:0;55453:73;;;;-1:-1:-1;;;55453:73:0;;19487:2:1;55453:73:0;;;19469:21:1;19526:2;19506:18;;;19499:30;19565:34;19545:18;;;19538:62;-1:-1:-1;;;19616:18:1;;;19609:42;19668:19;;55453:73:0;19285:408:1;55453:73:0;55537:13;55553:23;55568:7;55553:14;:23::i;:::-;55537:39;;55606:5;-1:-1:-1;;;;;55595:16:0;:7;-1:-1:-1;;;;;55595:16:0;;:51;;;;55639:7;-1:-1:-1;;;;;55615:31:0;:20;55627:7;55615:11;:20::i;:::-;-1:-1:-1;;;;;55615:31:0;;55595:51;:87;;;-1:-1:-1;;;;;;52435:25:0;;;52411:4;52435:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;55650:32;55587:96;55343:348;-1:-1:-1;;;;55343:348:0:o;58335:578::-;58494:4;-1:-1:-1;;;;;58467:31:0;:23;58482:7;58467:14;:23::i;:::-;-1:-1:-1;;;;;58467:31:0;;58459:85;;;;-1:-1:-1;;;58459:85:0;;23862:2:1;58459:85:0;;;23844:21:1;23901:2;23881:18;;;23874:30;23940:34;23920:18;;;23913:62;-1:-1:-1;;;23991:18:1;;;23984:39;24040:19;;58459:85:0;23660:405:1;58459:85:0;-1:-1:-1;;;;;58563:16:0;;58555:65;;;;-1:-1:-1;;;58555:65:0;;17943:2:1;58555:65:0;;;17925:21:1;17982:2;17962:18;;;17955:30;18021:34;18001:18;;;17994:62;-1:-1:-1;;;18072:18:1;;;18065:34;18116:19;;58555:65:0;17741:400:1;58555:65:0;58633:39;58654:4;58660:2;58664:7;58633:20;:39::i;:::-;58737:29;58754:1;58758:7;58737:8;:29::i;:::-;-1:-1:-1;;;;;58779:15:0;;;;;;:9;:15;;;;;:20;;58798:1;;58779:15;:20;;58798:1;;58779:20;:::i;:::-;;;;-1:-1:-1;;;;;;;58810:13:0;;;;;;:9;:13;;;;;:18;;58827:1;;58810:13;:18;;58827:1;;58810:18;:::i;:::-;;;;-1:-1:-1;;58839:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;58839:21:0;-1:-1:-1;;;;;58839:21:0;;;;;;;;;58878:27;;58839:16;;58878:27;;;;;;;58335:578;;;:::o;18305:191::-;18398:6;;;-1:-1:-1;;;;;18415:17:0;;;-1:-1:-1;;;;;;18415:17:0;;;;;;;18448:40;;18398:6;;;18415:17;18398:6;;18448:40;;18379:16;;18448:40;18368:128;18305:191;:::o;77592:285::-;77655:4;77685;77680:1;:9;;:24;;;;;77701:3;77693:4;:11;;77680:24;:42;;;;;77721:1;77708:10;:14;77680:42;:62;;;;;77739:3;77726:10;:16;77680:62;77672:138;;;;-1:-1:-1;;;77672:138:0;;;;;;;:::i;:::-;77850:16;77856:10;77850:3;:16;:::i;:::-;77835:10;:4;77842:3;77835:10;:::i;:::-;77834:33;;;;:::i;71587:176::-;71654:22;71664:2;71668:7;71654:9;:22::i;:::-;71718:29;;71687:68;;71701:7;;-1:-1:-1;;;;;71718:29:0;71750:4;71687:13;:68::i;59347:315::-;59502:8;-1:-1:-1;;;;;59493:17:0;:5;-1:-1:-1;;;;;59493:17:0;;;59485:55;;;;-1:-1:-1;;;59485:55:0;;18348:2:1;59485:55:0;;;18330:21:1;18387:2;18367:18;;;18360:30;18426:27;18406:18;;;18399:55;18471:18;;59485:55:0;18146:349:1;59485:55:0;-1:-1:-1;;;;;59551:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;59551:46:0;;;;;;;;;;59613:41;;14640::1;;;59613::0;;14613:18:1;59613:41:0;;;;;;;59347:315;;;:::o;54421:::-;54578:28;54588:4;54594:2;54598:7;54578:9;:28::i;:::-;54625:48;54648:4;54654:2;54658:7;54667:5;54625:22;:48::i;:::-;54617:111;;;;-1:-1:-1;;;54617:111:0;;;;;;;:::i;73475:116::-;73535:13;73568:15;73561:22;;;;;:::i;13333:723::-;13389:13;13610:10;13606:53;;-1:-1:-1;;13637:10:0;;;;;;;;;;;;-1:-1:-1;;;13637:10:0;;;;;13333:723::o;13606:53::-;13684:5;13669:12;13725:78;13732:9;;13725:78;;13758:8;;;;:::i;:::-;;-1:-1:-1;13781:10:0;;-1:-1:-1;13789:2:0;13781:10;;:::i;:::-;;;13725:78;;;13813:19;13845:6;13835:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13835:17:0;;13813:39;;13863:154;13870:10;;13863:154;;13897:11;13907:1;13897:11;;:::i;:::-;;-1:-1:-1;13966:10:0;13974:2;13966:5;:10;:::i;:::-;13953:24;;:2;:24;:::i;:::-;13940:39;;13923:6;13930;13923:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13923:56:0;;;;;;;;-1:-1:-1;13994:11:0;14003:2;13994:11;;:::i;:::-;;;13863:154;;49291:305;49393:4;-1:-1:-1;;;;;;49430:40:0;;-1:-1:-1;;;49430:40:0;;:105;;-1:-1:-1;;;;;;;49487:48:0;;-1:-1:-1;;;49487:48:0;49430:105;:158;;;-1:-1:-1;;;;;;;;;;41136:40:0;;;49552:36;41027:157;7290:423;7386:6;7381:282;7402:10;:17;7398:1;:21;7381:282;;;7482:3;-1:-1:-1;;;;;7449:37:0;:10;7460:1;7449:13;;;;;;;;:::i;:::-;;;;;;;:21;;;-1:-1:-1;;;;;7449:37:0;;;7441:77;;;;-1:-1:-1;;;7441:77:0;;28892:2:1;7441:77:0;;;28874:21:1;28931:2;28911:18;;;28904:30;28970:29;28950:18;;;28943:57;29017:18;;7441:77:0;28690:351:1;7441:77:0;7541:10;7552:1;7541:13;;;;;;;;:::i;:::-;;;;;;;:19;;;-1:-1:-1;;;;;7541:24:0;7564:1;7541:24;;7533:69;;;;-1:-1:-1;;;7533:69:0;;19900:2:1;7533:69:0;;;19882:21:1;;;19919:18;;;19912:30;19978:34;19958:18;;;19951:62;20030:18;;7533:69:0;19698:356:1;7533:69:0;7617:14;;;;:9;:14;;;;;7637:13;;:10;;7648:1;;7637:13;;;;;;:::i;:::-;;;;;;;;;;;;7617:34;;;;;;;-1:-1:-1;7617:34:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7617:34:0;-1:-1:-1;;;7617:34:0;-1:-1:-1;;;;;7617:34:0;;;;;;;7421:3;;;;:::i;:::-;;;;7381:282;;;;7673:32;7689:3;7694:10;7673:15;:32::i;71771:331::-;71922:45;71949:4;71955:2;71959:7;71922:26;:45::i;:::-;-1:-1:-1;;;;;71982:18:0;;;;;;:51;;;72032:1;72004:25;72021:7;72004:16;:25::i;:::-;:29;71982:51;71978:117;;;72049:34;72065:4;72071:2;72075:7;72049:15;:34::i;56033:110::-;56109:26;56119:2;56123:7;56109:26;;;;;;;;;;;;:9;:26::i;60227:799::-;60382:4;-1:-1:-1;;;;;60403:13:0;;19642:20;19690:8;60399:620;;60439:72;;-1:-1:-1;;;60439:72:0;;-1:-1:-1;;;;;60439:36:0;;;;;:72;;15847:10;;60490:4;;60496:7;;60505:5;;60439:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60439:72:0;;;;;;;;-1:-1:-1;;60439:72:0;;;;;;;;;;;;:::i;:::-;;;60435:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60681:13:0;;60677:272;;60724:60;;-1:-1:-1;;;60724:60:0;;;;;;;:::i;60677:272::-;60899:6;60893:13;60884:6;60880:2;60876:15;60869:38;60435:529;-1:-1:-1;;;;;;60562:51:0;-1:-1:-1;;;60562:51:0;;-1:-1:-1;60555:58:0;;60399:620;-1:-1:-1;61003:4:0;60227:799;;;;;;:::o;8469:143::-;8575:29;8588:3;8593:10;8575:29;;;;;;;:::i;:::-;;;;;;;;8469:143;;:::o;64410:589::-;-1:-1:-1;;;;;64616:18:0;;64612:187;;64651:40;64683:7;65826:10;:17;;65799:24;;;;:15;:24;;;;;:44;;;65854:24;;;;;;;;;;;;65722:164;64651:40;64612:187;;;64721:2;-1:-1:-1;;;;;64713:10:0;:4;-1:-1:-1;;;;;64713:10:0;;64709:90;;64740:47;64773:4;64779:7;64740:32;:47::i;:::-;-1:-1:-1;;;;;64813:16:0;;64809:183;;64846:45;64883:7;64846:36;:45::i;64809:183::-;64919:4;-1:-1:-1;;;;;64913:10:0;:2;-1:-1:-1;;;;;64913:10:0;;64909:83;;64940:40;64968:2;64972:7;64940:27;:40::i;73869:519::-;-1:-1:-1;;;;;74000:18:0;;;73996:334;;74062:4;-1:-1:-1;;;;;74042:24:0;:16;74050:7;74042;:16::i;:::-;-1:-1:-1;;;;;74042:24:0;;74034:106;;;;-1:-1:-1;;;74034:106:0;;25926:2:1;74034:106:0;;;25908:21:1;25965:2;25945:18;;;25938:30;26004:34;25984:18;;;25977:62;26075:34;26055:18;;;26048:62;-1:-1:-1;;;26126:19:1;;;26119:36;26172:19;;74034:106:0;25724:473:1;74034:106:0;74237:25;74254:7;74237:16;:25::i;:::-;:30;74233:86;;74287:16;74295:7;74287;:16::i;:::-;74345:35;;;-1:-1:-1;;;;;11241:15:1;;;11223:34;;11293:15;;11288:2;11273:18;;11266:43;11325:18;;;11318:34;;;74345:35:0;;11173:2:1;11158:18;74345:35:0;10983:375:1;56370:321:0;56500:18;56506:2;56510:7;56500:5;:18::i;:::-;56551:54;56582:1;56586:2;56590:7;56599:5;56551:22;:54::i;:::-;56529:154;;;;-1:-1:-1;;;56529:154:0;;;;;;;:::i;66513:988::-;66779:22;66829:1;66804:22;66821:4;66804:16;:22::i;:::-;:26;;;;:::i;:::-;66841:18;66862:26;;;:17;:26;;;;;;66779:51;;-1:-1:-1;66995:28:0;;;66991:328;;-1:-1:-1;;;;;67062:18:0;;67040:19;67062:18;;;:12;:18;;;;;;;;:34;;;;;;;;;67113:30;;;;;;:44;;;67230:30;;:17;:30;;;;;:43;;;66991:328;-1:-1:-1;67415:26:0;;;;:17;:26;;;;;;;;67408:33;;;-1:-1:-1;;;;;67459:18:0;;;;;:12;:18;;;;;:34;;;;;;;67452:41;66513:988::o;67796:1079::-;68074:10;:17;68049:22;;68074:21;;68094:1;;68074:21;:::i;:::-;68106:18;68127:24;;;:15;:24;;;;;;68500:10;:26;;68049:46;;-1:-1:-1;68127:24:0;;68049:46;;68500:26;;;;;;:::i;:::-;;;;;;;;;68478:48;;68564:11;68539:10;68550;68539:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;68644:28;;;:15;:28;;;;;;;:41;;;68816:24;;;;;68809:31;68851:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;67867:1008;;;67796:1079;:::o;65300:221::-;65385:14;65402:20;65419:2;65402:16;:20::i;:::-;-1:-1:-1;;;;;65433:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;65478:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;65300:221:0:o;57027:382::-;-1:-1:-1;;;;;57107:16:0;;57099:61;;;;-1:-1:-1;;;57099:61:0;;22295:2:1;57099:61:0;;;22277:21:1;;;22314:18;;;22307:30;22373:34;22353:18;;;22346:62;22425:18;;57099:61:0;22093:356:1;57099:61:0;55114:4;55138:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55138:16:0;:30;57171:58;;;;-1:-1:-1;;;57171:58:0;;17175:2:1;57171:58:0;;;17157:21:1;17214:2;17194:18;;;17187:30;17253;17233:18;;;17226:58;17301:18;;57171:58:0;16973:352:1;57171:58:0;57242:45;57271:1;57275:2;57279:7;57242:20;:45::i;:::-;-1:-1:-1;;;;;57300:13:0;;;;;;:9;:13;;;;;:18;;57317:1;;57300:13;:18;;57317:1;;57300:18;:::i;:::-;;;;-1:-1:-1;;57329:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;57329:21:0;-1:-1:-1;;;;;57329:21:0;;;;;;;;57368:33;;57329:16;;;57368:33;;57329:16;;57368:33;57027:382;;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:673::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;636:60;652:43;692:2;652:43;:::i;:::-;636:60;:::i;:::-;718:3;742:2;737:3;730:15;770:2;765:3;761:12;754:19;;805:2;797:6;793:15;857:3;852:2;846;843:1;839:10;831:6;827:23;823:32;820:41;817:61;;;874:1;871;864:12;817:61;896:1;906:163;920:2;917:1;914:9;906:163;;;977:17;;965:30;;1015:12;;;;1047;;;;938:1;931:9;906:163;;;-1:-1:-1;1087:5:1;;425:673;-1:-1:-1;;;;;;;425:673:1:o;1103:247::-;1162:6;1215:2;1203:9;1194:7;1190:23;1186:32;1183:52;;;1231:1;1228;1221:12;1183:52;1270:9;1257:23;1289:31;1314:5;1289:31;:::i;1615:388::-;1683:6;1691;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;1799:9;1786:23;1818:31;1843:5;1818:31;:::i;:::-;1868:5;-1:-1:-1;1925:2:1;1910:18;;1897:32;1938:33;1897:32;1938:33;:::i;:::-;1990:7;1980:17;;;1615:388;;;;;:::o;2008:456::-;2085:6;2093;2101;2154:2;2142:9;2133:7;2129:23;2125:32;2122:52;;;2170:1;2167;2160:12;2122:52;2209:9;2196:23;2228:31;2253:5;2228:31;:::i;:::-;2278:5;-1:-1:-1;2335:2:1;2320:18;;2307:32;2348:33;2307:32;2348:33;:::i;:::-;2008:456;;2400:7;;-1:-1:-1;;;2454:2:1;2439:18;;;;2426:32;;2008:456::o;2469:794::-;2564:6;2572;2580;2588;2641:3;2629:9;2620:7;2616:23;2612:33;2609:53;;;2658:1;2655;2648:12;2609:53;2697:9;2684:23;2716:31;2741:5;2716:31;:::i;:::-;2766:5;-1:-1:-1;2823:2:1;2808:18;;2795:32;2836:33;2795:32;2836:33;:::i;:::-;2888:7;-1:-1:-1;2942:2:1;2927:18;;2914:32;;-1:-1:-1;2997:2:1;2982:18;;2969:32;3024:18;3013:30;;3010:50;;;3056:1;3053;3046:12;3010:50;3079:22;;3132:4;3124:13;;3120:27;-1:-1:-1;3110:55:1;;3161:1;3158;3151:12;3110:55;3184:73;3249:7;3244:2;3231:16;3226:2;3222;3218:11;3184:73;:::i;:::-;3174:83;;;2469:794;;;;;;;:::o;3268:416::-;3333:6;3341;3394:2;3382:9;3373:7;3369:23;3365:32;3362:52;;;3410:1;3407;3400:12;3362:52;3449:9;3436:23;3468:31;3493:5;3468:31;:::i;:::-;3518:5;-1:-1:-1;3575:2:1;3560:18;;3547:32;3617:15;;3610:23;3598:36;;3588:64;;3648:1;3645;3638:12;3689:315;3757:6;3765;3818:2;3806:9;3797:7;3793:23;3789:32;3786:52;;;3834:1;3831;3824:12;3786:52;3873:9;3860:23;3892:31;3917:5;3892:31;:::i;:::-;3942:5;3994:2;3979:18;;;;3966:32;;-1:-1:-1;;;3689:315:1:o;4009:1226::-;4127:6;4135;4188:2;4176:9;4167:7;4163:23;4159:32;4156:52;;;4204:1;4201;4194:12;4156:52;4244:9;4231:23;4273:18;4314:2;4306:6;4303:14;4300:34;;;4330:1;4327;4320:12;4300:34;4368:6;4357:9;4353:22;4343:32;;4413:7;4406:4;4402:2;4398:13;4394:27;4384:55;;4435:1;4432;4425:12;4384:55;4471:2;4458:16;4493:4;4517:60;4533:43;4573:2;4533:43;:::i;4517:60::-;4599:3;4623:2;4618:3;4611:15;4651:2;4646:3;4642:12;4635:19;;4682:2;4678;4674:11;4730:7;4725:2;4719;4716:1;4712:10;4708:2;4704:19;4700:28;4697:41;4694:61;;;4751:1;4748;4741:12;4694:61;4773:1;4764:10;;4783:238;4797:2;4794:1;4791:9;4783:238;;;4868:3;4855:17;4885:31;4910:5;4885:31;:::i;:::-;4929:18;;4815:1;4808:9;;;;;4967:12;;;;4999;;4783:238;;;-1:-1:-1;5040:5:1;-1:-1:-1;;5083:18:1;;5070:32;;-1:-1:-1;;5114:16:1;;;5111:36;;;5143:1;5140;5133:12;5111:36;;5166:63;5221:7;5210:8;5199:9;5195:24;5166:63;:::i;:::-;5156:73;;;4009:1226;;;;;:::o;5240:245::-;5298:6;5351:2;5339:9;5330:7;5326:23;5322:32;5319:52;;;5367:1;5364;5357:12;5319:52;5406:9;5393:23;5425:30;5449:5;5425:30;:::i;5490:249::-;5559:6;5612:2;5600:9;5591:7;5587:23;5583:32;5580:52;;;5628:1;5625;5618:12;5580:52;5660:9;5654:16;5679:30;5703:5;5679:30;:::i;5744:450::-;5813:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:52;;;5882:1;5879;5872:12;5834:52;5922:9;5909:23;5955:18;5947:6;5944:30;5941:50;;;5987:1;5984;5977:12;5941:50;6010:22;;6063:4;6055:13;;6051:27;-1:-1:-1;6041:55:1;;6092:1;6089;6082:12;6041:55;6115:73;6180:7;6175:2;6162:16;6157:2;6153;6149:11;6115:73;:::i;6199:180::-;6258:6;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;-1:-1:-1;6350:23:1;;6199:180;-1:-1:-1;6199:180:1:o;6384:511::-;6468:6;6476;6484;6537:2;6525:9;6516:7;6512:23;6508:32;6505:52;;;6553:1;6550;6543:12;6505:52;6589:9;6576:23;6566:33;;6649:2;6638:9;6634:18;6621:32;6662:31;6687:5;6662:31;:::i;:::-;6712:5;-1:-1:-1;6769:2:1;6754:18;;6741:32;-1:-1:-1;;;;;6804:40:1;;6792:53;;6782:81;;6859:1;6856;6849:12;6782:81;6882:7;6872:17;;;6384:511;;;;;:::o;6900:248::-;6968:6;6976;7029:2;7017:9;7008:7;7004:23;7000:32;6997:52;;;7045:1;7042;7035:12;6997:52;-1:-1:-1;;7068:23:1;;;7138:2;7123:18;;;7110:32;;-1:-1:-1;6900:248:1:o;7153:269::-;7210:6;7263:2;7251:9;7242:7;7238:23;7234:32;7231:52;;;7279:1;7276;7269:12;7231:52;7318:9;7305:23;7368:4;7361:5;7357:16;7350:5;7347:27;7337:55;;7388:1;7385;7378:12;7427:495;7488:3;7526:5;7520:12;7553:6;7548:3;7541:19;7579:4;7608:2;7603:3;7599:12;7592:19;;7630:5;7627:1;7620:16;7672:2;7669:1;7659:16;7693:1;7703:194;7717:6;7714:1;7711:13;7703:194;;;7782:13;;-1:-1:-1;;;;;7778:39:1;7766:52;;7838:12;;;;7814:1;7873:14;;;;7732:9;7703:194;;;-1:-1:-1;7913:3:1;;7427:495;-1:-1:-1;;;;;7427:495:1:o;7927:585::-;7984:3;8022:5;8016:12;8049:6;8044:3;8037:19;8075:4;8104:2;8099:3;8095:12;8088:19;;8141:2;8134:5;8130:14;8162:1;8172:315;8186:6;8183:1;8180:13;8172:315;;;8245:13;;8287:9;;-1:-1:-1;;;;;8283:35:1;8271:48;;8363:11;;8357:18;-1:-1:-1;;;;;8353:51:1;8339:12;;;8332:73;8434:4;8425:14;;;;8462:15;;;;8315:1;8201:9;8172:315;;8517:469;8578:3;8616:5;8610:12;8643:6;8638:3;8631:19;8669:4;8698:2;8693:3;8689:12;8682:19;;8720:5;8717:1;8710:16;8762:2;8759:1;8749:16;8783:1;8793:168;8807:6;8804:1;8801:13;8793:168;;;8868:13;;8856:26;;8902:12;;;;8949:1;8937:14;;;;8822:9;8793:168;;8991:257;9032:3;9070:5;9064:12;9097:6;9092:3;9085:19;9113:63;9169:6;9162:4;9157:3;9153:14;9146:4;9139:5;9135:16;9113:63;:::i;:::-;9230:2;9209:15;-1:-1:-1;;9205:29:1;9196:39;;;;9237:4;9192:50;;8991:257;-1:-1:-1;;8991:257:1:o;9253:470::-;9432:3;9470:6;9464:13;9486:53;9532:6;9527:3;9520:4;9512:6;9508:17;9486:53;:::i;:::-;9602:13;;9561:16;;;;9624:57;9602:13;9561:16;9658:4;9646:17;;9624:57;:::i;:::-;9697:20;;9253:470;-1:-1:-1;;;;9253:470:1:o;11363:488::-;-1:-1:-1;;;;;11632:15:1;;;11614:34;;11684:15;;11679:2;11664:18;;11657:43;11731:2;11716:18;;11709:34;;;11779:3;11774:2;11759:18;;11752:31;;;11557:4;;11800:45;;11825:19;;11817:6;11800:45;:::i;:::-;11792:53;11363:488;-1:-1:-1;;;;;;11363:488:1:o;12135:1570::-;12542:3;12531:9;12524:22;12505:4;12569:65;12629:3;12618:9;12614:19;12606:6;12569:65;:::i;:::-;12691:22;;;12653:2;12671:18;;;12664:50;;;;12763:13;;12785:22;;;12861:15;;;;12823;;;12894:1;12904:195;12918:6;12915:1;12912:13;12904:195;;;12983:13;;-1:-1:-1;;;;;12979:39:1;12967:52;;13074:15;;;;13039:12;;;;13015:1;12933:9;12904:195;;;12908:3;;13144:9;13139:3;13135:19;13130:2;13119:9;13115:18;13108:47;13178:49;13223:3;13215:6;13178:49;:::i;:::-;13263:22;;;13258:2;13243:18;;13236:50;13339:13;;13361:24;;;13443:15;;;;-1:-1:-1;13403:15:1;;;;-1:-1:-1;13478:1:1;13488:189;13504:8;13499:3;13496:17;13488:189;;;13573:15;;13559:30;;13650:17;;;;13611:14;;;;13532:1;13523:11;13488:189;;;-1:-1:-1;13694:5:1;;12135:1570;-1:-1:-1;;;;;;;;;12135:1570:1:o;13710:475::-;13961:2;13950:9;13943:21;13924:4;13987:64;14047:2;14036:9;14032:18;14024:6;13987:64;:::i;:::-;14099:9;14091:6;14087:22;14082:2;14071:9;14067:18;14060:50;14127:52;14172:6;14164;14127:52;:::i;:::-;14119:60;13710:475;-1:-1:-1;;;;;13710:475:1:o;14190:305::-;14409:2;14398:9;14391:21;14372:4;14429:60;14485:2;14474:9;14470:18;14462:6;14429:60;:::i;14692:219::-;14841:2;14830:9;14823:21;14804:4;14861:44;14901:2;14890:9;14886:18;14878:6;14861:44;:::i;16147:414::-;16349:2;16331:21;;;16388:2;16368:18;;;16361:30;16427:34;16422:2;16407:18;;16400:62;-1:-1:-1;;;16493:2:1;16478:18;;16471:48;16551:3;16536:19;;16147:414::o;22867:356::-;23069:2;23051:21;;;23088:18;;;23081:30;23147:34;23142:2;23127:18;;23120:62;23214:2;23199:18;;22867:356::o;23228:427::-;23430:2;23412:21;;;23469:2;23449:18;;;23442:30;23508:34;23503:2;23488:18;;23481:62;23579:33;23574:2;23559:18;;23552:61;23645:3;23630:19;;23228:427::o;26202:406::-;26404:2;26386:21;;;26443:2;26423:18;;;26416:30;26482:34;26477:2;26462:18;;26455:62;-1:-1:-1;;;26548:2:1;26533:18;;26526:40;26598:3;26583:19;;26202:406::o;27027:413::-;27229:2;27211:21;;;27268:2;27248:18;;;27241:30;27307:34;27302:2;27287:18;;27280:62;-1:-1:-1;;;27373:2:1;27358:18;;27351:47;27430:3;27415:19;;27027:413::o;29046:::-;29248:2;29230:21;;;29287:2;29267:18;;;29260:30;29326:34;29321:2;29306:18;;29299:62;-1:-1:-1;;;29392:2:1;29377:18;;29370:47;29449:3;29434:19;;29046:413::o;30058:376::-;30305:6;30294:9;30287:25;30348:2;30343;30332:9;30328:18;30321:30;30268:4;30368:60;30424:2;30413:9;30409:18;30401:6;30368:60;:::i;30439:275::-;30510:2;30504:9;30575:2;30556:13;;-1:-1:-1;;30552:27:1;30540:40;;30610:18;30595:34;;30631:22;;;30592:62;30589:88;;;30657:18;;:::i;:::-;30693:2;30686:22;30439:275;;-1:-1:-1;30439:275:1:o;30719:183::-;30779:4;30812:18;30804:6;30801:30;30798:56;;;30834:18;;:::i;:::-;-1:-1:-1;30879:1:1;30875:14;30891:4;30871:25;;30719:183::o;30907:128::-;30947:3;30978:1;30974:6;30971:1;30968:13;30965:39;;;30984:18;;:::i;:::-;-1:-1:-1;31020:9:1;;30907:128::o;31040:120::-;31080:1;31106;31096:35;;31111:18;;:::i;:::-;-1:-1:-1;31145:9:1;;31040:120::o;31165:168::-;31205:7;31271:1;31267;31263:6;31259:14;31256:1;31253:21;31248:1;31241:9;31234:17;31230:45;31227:71;;;31278:18;;:::i;:::-;-1:-1:-1;31318:9:1;;31165:168::o;31338:125::-;31378:4;31406:1;31403;31400:8;31397:34;;;31411:18;;:::i;:::-;-1:-1:-1;31448:9:1;;31338:125::o;31468:258::-;31540:1;31550:113;31564:6;31561:1;31558:13;31550:113;;;31640:11;;;31634:18;31621:11;;;31614:39;31586:2;31579:10;31550:113;;;31681:6;31678:1;31675:13;31672:48;;;-1:-1:-1;;31716:1:1;31698:16;;31691:27;31468:258::o;31731:380::-;31810:1;31806:12;;;;31853;;;31874:61;;31928:4;31920:6;31916:17;31906:27;;31874:61;31981:2;31973:6;31970:14;31950:18;31947:38;31944:161;;;32027:10;32022:3;32018:20;32015:1;32008:31;32062:4;32059:1;32052:15;32090:4;32087:1;32080:15;31944:161;;31731:380;;;:::o;32116:135::-;32155:3;-1:-1:-1;;32176:17:1;;32173:43;;;32196:18;;:::i;:::-;-1:-1:-1;32243:1:1;32232:13;;32116:135::o;32256:112::-;32288:1;32314;32304:35;;32319:18;;:::i;:::-;-1:-1:-1;32353:9:1;;32256:112::o;32373:127::-;32434:10;32429:3;32425:20;32422:1;32415:31;32465:4;32462:1;32455:15;32489:4;32486:1;32479:15;32505:127;32566:10;32561:3;32557:20;32554:1;32547:31;32597:4;32594:1;32587:15;32621:4;32618:1;32611:15;32637:127;32698:10;32693:3;32689:20;32686:1;32679:31;32729:4;32726:1;32719:15;32753:4;32750:1;32743:15;32769:127;32830:10;32825:3;32821:20;32818:1;32811:31;32861:4;32858:1;32851:15;32885:4;32882:1;32875:15;32901:127;32962:10;32957:3;32953:20;32950:1;32943:31;32993:4;32990:1;32983:15;33017:4;33014:1;33007:15;33033:131;-1:-1:-1;;;;;33108:31:1;;33098:42;;33088:70;;33154:1;33151;33144:12;33169:131;-1:-1:-1;;;;;;33243:32:1;;33233:43;;33223:71;;33290:1;33287;33280:12
Swarm Source
ipfs://39dfdc757a4cd5453dfa186a8180ec5bde68022f20047284e50732e5f40404a5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.