Overview
ETH Balance
0.0075 ETH
Eth Value
$19.72 (@ $2,629.91/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13459712 | 1023 days ago | 0.0075 ETH |
Loading...
Loading
Contract Name:
Headscapes
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-21 */ // File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT 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 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/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/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/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/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/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/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/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/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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 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/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/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/Base64.sol pragma solidity ^0.8.9; library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF) ) out := shl(8, out) out := add( out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF) ) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } // File: contracts/HeadscapesStorage.sol pragma solidity ^0.8.9; contract HeadscapesStorage { constructor() {} function getPalettes(uint256 index) public pure returns (string memory) { return [ "b: #281C2D; --s: #695E93; --a: #8155BA; --m: #BEAFC2", "b: #738FA7; --s: #0C4160; --a: #C3CEDA; --m: #071330", "b: #1A5653; --s: #107869; --a: #5CD85A; --m: #08313A", "b: #E95670; --s: #713770; --a: #B34270; --m: #432F70", "b: #E1A140; --s: #532200; --a: #EFCFA0; --m: #914110", "b: #0B0909; --s: #44444C; --a: #8C8C8C; --m: #D6D6D6", "b: #F1D26C; --s: #2B1200; --a: #CF5C00; --m: #8D1E00", "b: #8C9B88; --s: #F5E8DA; --a: #735E93; --m: #EFF1EF", "b: #676E7F; --s: #0F0D12; --a: #F9F6F0; --m: #B6737C" ][index]; } function getPatterns(uint256 index) public pure returns (string memory) { return [ 'x="-7.25" y="142.5" patternUnits="userSpaceOnUse" width="126" height="200" viewBox="0 0 10 16"><g id="cube"><path fill="var(--a)" d="M0 0l5 3v5l-5 -3z"></path><path d="M10 0l-5 3v5l5 -3"></path></g><use x="5" y="8" href="#cube"></use><use x="-5" y="8" href="#cube"></use>', 'x="12" y="-5" width="375" height="62.5" patternUnits="userSpaceOnUse"><linearGradient id="g1"><stop offset="5%" stop-color="var(--s)"/><stop offset="50%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--s)"/></linearGradient><radialGradient id="g2"><stop offset="10%" stop-color="var(--s)"/><stop offset="50%" stop-color="var(--a)"/></radialGradient><rect fill="url(#g1)" height="10" width="375" x="0" y="0"/><g fill-opacity="0.5" stroke="var(--s)" fill="url(#g2)"><circle cx="20" cy="40" r="5" stroke-width="1"/><circle cx="82.5" cy="40" r="7" stroke-width="3" /><circle cx="145" cy="40" r="4" stroke-width="3"/><circle cx="207.5" cy="40" r="8" stroke-width="2"/><circle cx="270" cy="40" r="2" stroke-width="3"/><circle cx="332.5" cy="40" r="3.5" stroke-width="1"/></g>', 'x="-12.5" y="15.625" width="150" height="62.5" patternUnits="userSpaceOnUse" stroke-width="4"><path d="M0 0 L0 0 25 25 M25 0 L25 0 0 25" stroke="var(--a)"/><path d="M12.5 25 v50" stroke="var(--m)"/><path d="M25 12.5 h45" stroke="var(--m)"/><path d="M87 29.25 v30" stroke="var(--a)"/><circle cx="87" cy="13" r="11.5" fill="transparent" stroke="var(--s)" fill-opacity="0.5"/><path d="M103 12.5 h45" stroke="var(--m)"/>', 'x="-12.5" y="15.625" width="150" height="62.5" patternUnits="userSpaceOnUse"><linearGradient id="g1" gradientTransform="rotate(90)"><stop offset="5%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--s)"/></linearGradient><path d="M0 0 v62.5 h150z" stroke="var(--a)" fill="url(#g1)" stroke-width="4"/>', 'x="0" y="0" width="750" height="250" patternUnits="userSpaceOnUse"><radialGradient id="g1"><stop offset="10%" stop-color="var(--b)"/><stop offset="95%" stop-color="var(--m)"/></radialGradient><circle cx="0" cy="125" r="95" fill="transparent" stroke-width="2" stroke="var(--m)" /><circle cx="0" cy="125" r="45" fill="var(--s)"/><circle cx="750" cy="125" r="75" fill="var(--a)"/><circle cx="375" cy="250" r="80" fill="var(--s)"/><circle cx="375" cy="0" r="30" fill="transparent" stroke-width="2" stroke="var(--a)"/><circle cx="375" cy="250" r="30" fill="transparent" stroke-width="2" stroke="var(--a)"/><circle cx="375" cy="125" r="25" fill="var(--m)"/><circle cx="750" cy="250" r="31" fill="var(--s)"/><circle cx="750" cy="0" r="31" fill="var(--a)"/><circle cx="0" cy="0" r="22" fill="var(--m)"/><circle cx="750" cy="0" r="22" fill="var(--s)"/><circle cx="0" cy="250" r="22" fill="var(--a)"/><circle cx="750" cy="250" r="22" fill="url(#g1)"/>', 'x="0" y="0" width="750" height="100" patternUnits="userSpaceOnUse" stroke-width="4"><radialGradient cx="10%" cy="10%" id="g1"><stop offset="5%" stop-color="var(--a)"/><stop offset="95%" stop-color="var(--m)"/></radialGradient><radialGradient cx="90%" cy="90%" id="g2"><stop offset="5%" stop-color="var(--m)"/><stop offset="95%" stop-color="var(--a)"/></radialGradient><path d="M0 0 v100 h375 z" stroke="var(--s)" fill="url(#g1)"/><path d="M375 100 h375 V0 z" stroke="var(--s)" fill="url(#g2)"/>', 'x="0" y="0" width="300" height="125" patternUnits="userSpaceOnUse" stroke-width="4" fill="transparent"><path d="M20 0 Q-30 75, 100 20 T65 120 " stroke="var(--s)" /><path d="M 20 0 C -30 75, 65 10, 100 10 S -180 150, 280 20 S -100 200, -100 200" transform="scale(0.5) translate(200 10) rotate(180 150 75)" stroke="var(--a)" /><path d="M275 100 q-20 -30, -30 -40 t-20 30 t-20 -30 t20 -30" stroke="var(--m)" />', 'x="-12.5" y="0" width="125" height="125" patternUnits="userSpaceOnUse" stroke-width="4" fill-opacity="0.75"><rect x="25" y="12.5" height="100" width="100" fill="var(--m)"/><rect x="50" y="37.5" height="50" width="50" fill="var(--m)"/><rect x="0" y="0" height="10" width="150" fill="var(--s)"/><rect x="0" y="115" height="10" width="150" fill="var(--s)"/><rect x="0" y="10" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="112.5" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="22.5" height="2.5" width="125" fill="var(--a)"/><rect x="0" y="100" height="2.5" width="125" fill="var(--a)"/><rect x="37.5" y="0" height="125" width="2.5" fill="var(--s)" /><rect x="110" y="0" height="125" width="2.5" fill="var(--s)"/><rect x="0" y="60" height="5" width="375" fill="var(--a)"/><rect x="72.5" y="0" height="375" width="5" fill="var(--a)"/>', "" ][index]; } function getTurbs(uint256 index) public pure returns (string memory) { return [ 'type="fractalNoise" baseFrequency="0.0029, .0009" numOctaves="5"', 'type="fractalNoise" baseFrequency="0.069, .0420" numOctaves="5"', 'type="fractalNoise" baseFrequency="0.002, .029" numOctaves="50"', 'type="fractalNoise" baseFrequency=".0420, .069" numOctaves="6.9"', 'type="turbulence" baseFrequency="0.09, .06" numOctaves="1"', 'type="fractalNoise" baseFrequency="0.2, .9" numOctaves="50"', 'type="turbulence" baseFrequency=".00888, .0888" numOctaves="88"', 'type="turbulence" baseFrequency="2, .029" numOctaves="10"', 'type="fractalNoise" baseFrequency="0, 0" numOctaves="0"' ][index]; } function getBlurs(uint256 index) public pure returns (string memory) { return ["0.0", "0.0", "0.0", "0.0", "0.04", "0.2", "0.7", "1.7", "7"][index]; } function getGrads(uint256 index) public pure returns (string memory) { return [ "var(--b)", "linear-gradient(var(--s), var(--b))", "radial-gradient(var(--s), var(--b))", "repeating-linear-gradient(var(--s), var(--b) 125px)", "repeating-radial-gradient(var(--s), var(--b) 1px)", "conic-gradient(var(--b), var(--s))", "repeating-linear-gradient(0.85turn, transparent, var(--s) 100px),repeating-linear-gradient(0.15turn, transparent, var(--b) 50px),repeating-linear-gradient(0.5turn, transparent, var(--a) 20px),repeating-linear-gradient(transparent, var(--m) 1px)", "repeating-conic-gradient(var(--b) 0 9deg, var(--s) 9deg 18deg)", "repeating-conic-gradient(from 0deg at 50% 50%, red, orange, yellow, green, blue, indigo, violet)" ][index]; } function getLights(uint256 index) public pure returns (string memory) { return [ "", "", "", "", "", 'surfaceScale="100"><fePointLight x="750" y="250" z="200"/></feDiffuseLighting>', 'surfaceScale="6"><feDistantLight azimuth="10" elevation="43"/></feDiffuseLighting>', 'surfaceScale="10"><fePointLight x="750" y="250" z="200"/></feDiffuseLighting>', 'surfaceScale="22"><feDistantLight azimuth="5" elevation="40"/></feDiffuseLighting>' ][index]; } function getMaps(uint256 index) public pure returns (string memory) { return [ 'in="SourceGraphic" scale="10" xChannelSelector="A" yChannelSelector="B"', 'in="SourceGraphic" scale="20" xChannelSelector="R" yChannelSelector="B"', 'in="FillPaint" scale="100" xChannelSelector="B" yChannelSelector="G"', 'in="FillPaint" scale="300" xChannelSelector="A" yChannelSelector="R"', 'in="FillPaint" scale="600" xChannelSelector="R" yChannelSelector="R"', 'in="FillPaint" scale="1000" xChannelSelector="G" yChannelSelector="R"', 'in="SourceAlpha" scale="987" xChannelSelector="B" yChannelSelector="A"', 'in="[redacted]" scale="69" xChannelSelector="A" yChannelSelector="R"', 'in="[redacted]" scale="420" xChannelSelector="A" yChannelSelector="A"' ][index]; } } // File: contracts/Headscapes.sol pragma solidity ^0.8.9; // ▄▄ ▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ // █ █ █ █ █ █ ██ █ █ █ █ █ █ // █ █▄█ █ ▄▄▄█ ▄ █ ▄ █ ▄▄▄▄▄█ █ ▄ █ ▄ █ ▄▄▄█ ▄▄▄▄▄█ // █ █ █▄▄▄█ █▄█ █ █ █ █ █▄▄▄▄▄█ ▄▄█ █▄█ █ █▄█ █ █▄▄▄█ █▄▄▄▄▄ // █ ▄ █ ▄▄▄█ █ █▄█ █▄▄▄▄▄ █ █ █ █ ▄▄▄█ ▄▄▄█▄▄▄▄▄ █ // █ █ █ █ █▄▄▄█ ▄ █ █▄▄▄▄▄█ █ █▄▄█ ▄ █ █ █ █▄▄▄ ▄▄▄▄▄█ █ // █▄▄█ █▄▄█▄▄▄▄▄▄▄█▄█ █▄▄█▄▄▄▄▄▄██▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄█ █▄▄█▄▄▄█ █▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█ // On Chain generative banner art contract Headscapes is ERC721Enumerable, ReentrancyGuard, Ownable { uint256 private nonce = 0; HeadscapesStorage private store = HeadscapesStorage(0x4e7a909736Aa3efb6bB7bDbbbFfB901a0917e055); mapping(string => bool) private hashToMinted; mapping(uint256 => string) private tokenIdToHash; mapping(uint256 => string) private tokenIdToTitle; mapping(bytes32 => bool) public titleToIsTaken; struct Headscape { uint8 blur; uint8 gradient; uint8 light; uint8 map; uint8 palette; uint8 pattern; uint8 turbulence; } constructor() ERC721("Headscapes", "HDSCP") {} function generateSvg(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) { string memory header = getSvgHeader(headscape, tokenId); string memory rectTail = headscape.pattern == 8 ? ' fill="var(--b)" />' : ' fill="url(#p0)" />'; return string( abi.encodePacked( header, '<rect height="500" width="1500" filter="url(#f0)"', rectTail, "</svg>" ) ); } function getSvgHeader(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) { string memory o = string( abi.encodePacked( '<svg width="1500" height="500" version="1.1" xmlns="http://www.w3.org/2000/svg" style="position: relative; background: ', store.getGrads(headscape.gradient), ';" class="c0">', "<style>.c0{--", store.getPalettes(headscape.palette), ";}</style>", "<defs>", headscape.pattern == 8 ? "" : string( abi.encodePacked( '<pattern id="p0" ', store.getPatterns(headscape.pattern), "</pattern>" ) ), getFilter(headscape, tokenId), "</defs>" ) ); return o; } function getFilter(Headscape memory headscape, uint256 tokenId) internal view returns (string memory) { // pattern == 8 means no pattern string memory r = headscape.pattern == 8 ? 'in="r2" result="r3" ' : 'in="r3" result="r4" '; string memory light = store.getLights(headscape.light); string memory l = compareStrings(light, "") ? "" : string( abi.encodePacked( '<feDiffuseLighting lighting-color="var(--a)" ', r, store.getLights(headscape.light) ) ); // Every other token gets a merge node string memory f = tokenId % 2 == 0 ? "</filter>" : '<feMerge><feMergeNode in="r4" /><feMergeNode in="r2" /></feMerge></filter>'; string memory o; if (headscape.pattern == 8) { o = string( abi.encodePacked( '<filter id="f0">', "<feTurbulence ", store.getTurbs(headscape.turbulence), ' seed="', toString(tokenId), '" result="r1" />', '<feGaussianBlur stdDeviation="', store.getBlurs(headscape.blur), '" in="r1" result="r2" />', l, "</filter>" ) ); } else { o = string( abi.encodePacked( '<filter id="f0">', "<feTurbulence ", store.getTurbs(headscape.turbulence), ' seed="', toString(tokenId), '" result="r1" />', '<feDisplacementMap in2="r1" result="r2" ', store.getMaps(headscape.map), " />", '<feGaussianBlur stdDeviation="', store.getBlurs(headscape.blur), '" in="r2" result="r3" />', l, f ) ); } return o; } function getAttributes(Headscape memory headscape) internal pure returns (string memory) { return string( abi.encodePacked( '", "attributes": [{"trait_type": "Blur","value": "', [ "None", "None", "None", "None", "Faint", "Bleary", "Fuzzy", "Hazy", "Myopia" ][headscape.blur], '"},{"trait_type": "Gradient","value": "', [ "None", "Linear", "Radial", "Repeating Linear", "Repeating Radial", "Conic", "Pyramid Flannel", "Rising Sun", "Rainbow Wheel" ][headscape.gradient], '"},{"trait_type": "Light","value": "', [ "None", "None", "None", "None", "None", "High Point Light", "Low Distance Light", "Low Point Light", "High Distance Light" ][headscape.light], '"},{"trait_type": "Displacement Map","value": "', [ "10", "20", "100", "300", "600", "1000", "987 Alpha", "[redacted] I", "[redacted] II" ][headscape.map], '"},{"trait_type": "Palette","value": "', [ "Purple Fabric", "Mountain Haze", "Northern Lights", "Lava Sky", "Autumn Crush", "Dark Metal", "Fall Fire", "Secret Spring", "Winter Musings" ][headscape.palette], '"},{"trait_type": "Pattern","value": "', [ "Cubes", "Dots & Lines", "Xs and Os", "Banners", "Circles", "Triangles", "Squiggles", "Plaid", "None" ][headscape.pattern], '"},{"trait_type": "Turbulence","value": "', [ "Fractal 1", "Fractal 2", "Fractal 3", "Fractal 4", "Turbulence 1", "Fractal 5", "Turbulence 2", "Turbulence 3", "None" ][headscape.turbulence] ) ); } function getHeadscape(uint256 tokenId) internal view returns (Headscape memory) { // substring locations for each relevant index are alphabetical (blur, gradient, light, etc) // blur index is at tokenIdToHash[tokenId][0] // gradient index is at tokenIdToHash[tokenId][1]. etc Headscape memory headscape; headscape.blur = uint8( charToInt(substring(tokenIdToHash[tokenId], 0, 1)) ); headscape.gradient = uint8( charToInt(substring(tokenIdToHash[tokenId], 1, 2)) ); headscape.light = uint8( charToInt(substring(tokenIdToHash[tokenId], 2, 3)) ); headscape.map = uint8( charToInt(substring(tokenIdToHash[tokenId], 3, 4)) ); headscape.palette = uint8( charToInt(substring(tokenIdToHash[tokenId], 4, 5)) ); headscape.pattern = uint8( charToInt(substring(tokenIdToHash[tokenId], 5, 6)) ); headscape.turbulence = uint8( charToInt(substring(tokenIdToHash[tokenId], 6, 7)) ); return headscape; } function hash(uint256 tokenId) internal returns (string memory) { uint8 blur = usew( [240, 232, 180, 90, 80, 70, 60, 58, 55], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1065 ); uint8 gradient = usew( [250, 240, 232, 180, 110, 90, 80, 70, 55], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1307 ); uint8 light = usew( [240, 230, 220, 210, 200, 150, 140, 130, 120], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1640 ); uint8 map = usew( [240, 232, 210, 188, 130, 100, 90, 78, 69], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1337 ); uint8 palette = usew( [250, 245, 240, 235, 230, 225, 220, 215, 210], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 2070 ); uint8 pattern = usew( [240, 232, 200, 180, 170, 160, 140, 130, 120], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1572 ); uint8 turbulence = usew( [240, 232, 180, 110, 90, 80, 70, 60, 55], random( string( abi.encodePacked( block.difficulty, block.timestamp, tokenId, nonce ) ) ) % 1117 ); // Hack to get around the fact that blur and light have multiple 'None's and need // to be ranked the same using the same index blur = blur < 5 ? 0 : blur; light = light < 5 ? 0 : light; string memory h = string( abi.encodePacked( toString(blur), toString(gradient), toString(light), toString(map), toString(palette), toString(pattern), toString(turbulence) ) ); // no dupes if (hashToMinted[h]) { nonce++; return hash(tokenId); } return h; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); Headscape memory headscape = getHeadscape(tokenId); string memory name = bytes(tokenIdToTitle[tokenId]).length > 0 ? string(tokenIdToTitle[tokenId]) : string(abi.encodePacked("Headscape #", toString(tokenId))); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( string( abi.encodePacked( '{"name": "', name, getAttributes(headscape), '"},{"trait_type": "Titled","value": "', compareStrings(tokenIdToTitle[tokenId], "") ? "false" : "true", '"}], "image": "data:image/svg+xml;base64,', Base64.encode( bytes(generateSvg(headscape, tokenId)) ), '"}' ) ) ) ) ) ); } // Write Functions // Adds a user-defined title to a Headscape function addTitle(uint256 tokenId, string memory text) public nonReentrant { require( _msgSender() == ownerOf(tokenId), "You don't own this Headscape" ); require( bytes(tokenIdToTitle[tokenId]).length == 0, "This Headscape already has a title!" ); require( !titleToIsTaken[(keccak256(abi.encodePacked((text))))], "This title has already been taken" ); require( bytes(text).length > 0 && bytes(text).length < 65, "Enter a title at least 1 and up to 64 chars long" ); tokenIdToTitle[tokenId] = cleanString(text); titleToIsTaken[(keccak256(abi.encodePacked((text))))] = true; } // Claim from 1 and up to 10 at a time. // Unfortunately, this contract is not ERC1155 so batch minting is not possible. // Transfer event will be emitted for each call to _safeMint. function claim(uint256 num) public payable nonReentrant { require( num > 0 && num < 11, "Choose at least 1 and at most 10 to mint" ); require( num + totalSupply() < 9500, "Enter a different quantity - there arent that many left to mint" ); require(msg.value >= num * 15000000000000000, "Price is .015 per mint"); uint256 numClaimed = totalSupply(); for (uint256 i = 0; i < num; i++) { string memory h = hash(numClaimed); tokenIdToHash[numClaimed] = h; hashToMinted[h] = true; _safeMint(_msgSender(), numClaimed); numClaimed = totalSupply(); nonce++; } // Send half to EFF! // Verify their address here: https://www.eff.org/pages/other-ways-give-and-donor-support#crypto // and here: https://etherscan.io/address/0x095f1fD53A56C01c76A2a56B7273995Ce915d8C4 if (msg.value > 0) { payable(0x095f1fD53A56C01c76A2a56B7273995Ce915d8C4).transfer( msg.value / 2 ); } } // Owner can claim ids 9500 - 9999, one at a time function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require( tokenId >= 9500 && tokenId < 10000, "Choose an unclaimed index between 9500 and 9999, inclusive" ); string memory h = hash(tokenId); tokenIdToHash[tokenId] = h; hashToMinted[h] = true; _safeMint(owner(), tokenId); nonce++; } function withdraw() public payable nonReentrant onlyOwner { payable(msg.sender).transfer(address(this).balance); } // Util functions // Random number generator function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function compareStrings(string memory a, string memory b) internal pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } // This function sucks, don't use it. Really dumb way to turn the hashed // 'DNA' of each Headscape into useable integers. function charToInt(string memory c) internal pure returns (uint256) { if (compareStrings(c, "0")) return 0; if (compareStrings(c, "1")) return 1; if (compareStrings(c, "2")) return 2; if (compareStrings(c, "3")) return 3; if (compareStrings(c, "4")) return 4; if (compareStrings(c, "5")) return 5; if (compareStrings(c, "6")) return 6; if (compareStrings(c, "7")) return 7; if (compareStrings(c, "8")) return 8; return 0; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } // Weight function to get a weighted random number // Tweaked from OnChainMonkeys - thank you! function usew(uint8[9] memory w, uint256 i) internal pure returns (uint8) { uint8 ind = 0; uint256 j = uint256(w[0]); while (j <= i) { ind++; j += uint256(w[ind]); } return ind; } // Turns a double quote character into a single quote character function cleanString(string memory str) internal pure returns (string memory) { bytes memory bytesStr = bytes(str); for (uint256 i = 0; i < bytesStr.length; i++) { if (bytesStr[i] == 0x22) { bytesStr[i] = 0x27; } } return string(bytesStr); } 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); } }
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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"text","type":"string"}],"name":"addTitle","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":"num","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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":"bytes32","name":"","type":"bytes32"}],"name":"titleToIsTaken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526000600c55600d80546001600160a01b031916734e7a909736aa3efb6bb7bdbbbffb901a0917e0551790553480156200003c57600080fd5b50604080518082018252600a8152694865616473636170657360b01b602080830191825283518085019094526005845264048445343560dc1b9084015281519192916200008c916000916200010d565b508051620000a29060019060208401906200010d565b50506001600a5550620000b533620000bb565b620001f0565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b61525d80620002006000396000f3fe60806040526004361061014b5760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610383578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063edc6d4351461042c578063f2fde38b1461045c57600080fd5b80634f6ccce7146102db5780636352211e146102fb57806370a082311461031b578063715018a61461033b5780638da5cb5b1461035057806395d89b411461036e57600080fd5b80632a54e540116101085780632a54e540146102405780632f745c5914610260578063379607f5146102805780633ccfd60b1461029357806342842e0e1461029b578063434f48c4146102bb57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610220575b600080fd5b34801561015c57600080fd5b5061017061016b3660046141db565b61047c565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104a7565b60405161017c9190614257565b3480156101b357600080fd5b506101c76101c236600461426a565b610539565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa36600461429f565b6105d3565b005b34801561020d57600080fd5b506008545b60405190815260200161017c565b34801561022c57600080fd5b506101ff61023b3660046142c9565b6106e9565b34801561024c57600080fd5b506101ff61025b3660046143b2565b61071a565b34801561026c57600080fd5b5061021261027b36600461429f565b6109ac565b6101ff61028e36600461426a565b610a42565b6101ff610ccd565b3480156102a757600080fd5b506101ff6102b63660046142c9565b610d53565b3480156102c757600080fd5b506101ff6102d636600461426a565b610d6e565b3480156102e757600080fd5b506102126102f636600461426a565b610ee0565b34801561030757600080fd5b506101c761031636600461426a565b610f73565b34801561032757600080fd5b5061021261033636600461440d565b610fea565b34801561034757600080fd5b506101ff611071565b34801561035c57600080fd5b50600b546001600160a01b03166101c7565b34801561037a57600080fd5b5061019a6110a7565b34801561038f57600080fd5b506101ff61039e366004614428565b6110b6565b3480156103af57600080fd5b506101ff6103be366004614464565b61117b565b3480156103cf57600080fd5b5061019a6103de36600461426a565b6111b3565b3480156103ef57600080fd5b506101706103fe3660046144e0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b5061017061044736600461426a565b60116020526000908152604090205460ff1681565b34801561046857600080fd5b506101ff61047736600461440d565b611492565b60006001600160e01b0319821663780e9d6360e01b14806104a157506104a18261152d565b92915050565b6060600080546104b690614513565b80601f01602080910402602001604051908101604052809291908181526020018280546104e290614513565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105de82610f73565b9050806001600160a01b0316836001600160a01b0316141561064c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ae565b336001600160a01b0382161480610668575061066881336103fe565b6106da5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105ae565b6106e4838361157d565b505050565b6106f333826115eb565b61070f5760405162461bcd60e51b81526004016105ae9061454e565b6106e48383836116e2565b6002600a54141561073d5760405162461bcd60e51b81526004016105ae9061459f565b6002600a5561074b82610f73565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686973204865616473636170650000000060448201526064016105ae565b600082815260106020526040902080546107c490614513565b15905061081f5760405162461bcd60e51b815260206004820152602360248201527f546869732048656164736361706520616c7265616479206861732061207469746044820152626c652160e81b60648201526084016105ae565b601160008260405160200161083491906145f2565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156108b45760405162461bcd60e51b815260206004820152602160248201527f54686973207469746c652068617320616c7265616479206265656e2074616b656044820152603760f91b60648201526084016105ae565b600081511180156108c6575060418151105b61092b5760405162461bcd60e51b815260206004820152603060248201527f456e7465722061207469746c65206174206c65617374203120616e642075702060448201526f746f203634206368617273206c6f6e6760801b60648201526084016105ae565b6109348161188d565b60008381526010602090815260409091208251610957939192919091019061412c565b506001601160008360405160200161096f91906145f2565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550506001600a55565b60006109b783610fea565b8210610a195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a655760405162461bcd60e51b81526004016105ae9061459f565b6002600a558015801590610a795750600b81105b610ad65760405162461bcd60e51b815260206004820152602860248201527f43686f6f7365206174206c65617374203120616e64206174206d6f7374203130604482015267081d1bc81b5a5b9d60c21b60648201526084016105ae565b61251c610ae260085490565b610aec9083614624565b10610b5f5760405162461bcd60e51b815260206004820152603f60248201527f456e746572206120646966666572656e74207175616e74697479202d2074686560448201527f7265206172656e742074686174206d616e79206c65667420746f206d696e740060648201526084016105ae565b610b708166354a6ba7a1800061463c565b341015610bb85760405162461bcd60e51b8152602060048201526016602482015275141c9a58d9481a5cc80b8c0c4d481c195c881b5a5b9d60521b60448201526064016105ae565b6000610bc360085490565b905060005b82811015610c70576000610bdb83611911565b6000848152600f602090815260409091208251929350610bff92909184019061412c565b506001600e82604051610c1291906145f2565b908152604051908190036020019020805491151560ff19909216919091179055610c42610c3c3390565b84611e35565b600854600c80549194506000610c578361465b565b9190505550508080610c689061465b565b915050610bc8565b503415610cc45773095f1fd53a56c01c76a2a56b7273995ce915d8c46108fc610c9a60023461468c565b6040518115909202916000818181858888f19350505050158015610cc2573d6000803e3d6000fd5b505b50506001600a55565b6002600a541415610cf05760405162461bcd60e51b81526004016105ae9061459f565b6002600a55600b546001600160a01b03163314610d1f5760405162461bcd60e51b81526004016105ae906146a0565b60405133904780156108fc02916000818181858888f19350505050158015610d4b573d6000803e3d6000fd5b506001600a55565b6106e48383836040518060200160405280600081525061117b565b6002600a541415610d915760405162461bcd60e51b81526004016105ae9061459f565b6002600a55600b546001600160a01b03163314610dc05760405162461bcd60e51b81526004016105ae906146a0565b61251c8110158015610dd3575061271081105b610e455760405162461bcd60e51b815260206004820152603a60248201527f43686f6f736520616e20756e636c61696d656420696e6465782062657477656560448201527f6e203935303020616e6420393939392c20696e636c757369766500000000000060648201526084016105ae565b6000610e5082611911565b6000838152600f602090815260409091208251929350610e7492909184019061412c565b506001600e82604051610e8791906145f2565b908152604051908190036020019020805491151560ff19909216919091179055610ec2610ebc600b546001600160a01b031690565b83611e35565b600c8054906000610ed28361465b565b90915550506001600a555050565b6000610eeb60085490565b8210610f4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105ae565b60088281548110610f6157610f616146d5565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ae565b60006001600160a01b0382166110555760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ae565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461109b5760405162461bcd60e51b81526004016105ae906146a0565b6110a56000611e53565b565b6060600180546104b690614513565b6001600160a01b03821633141561110f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61118533836115eb565b6111a15760405162461bcd60e51b81526004016105ae9061454e565b6111ad84848484611ea5565b50505050565b6000818152600260205260409020546060906001600160a01b03166112325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ae565b600061123d83611ed8565b905060008060106000868152602001908152602001600020805461126090614513565b9050116112945761127084612427565b60405160200161128091906146eb565b60405160208183030381529060405261132c565b600084815260106020526040902080546112ad90614513565b80601f01602080910402602001604051908101604052809291908181526020018280546112d990614513565b80156113265780601f106112fb57610100808354040283529160200191611326565b820191906000526020600020905b81548152906001019060200180831161130957829003601f168201915b50505050505b905061146a8161133b84612525565b600087815260106020526040902080546113ec919061135990614513565b80601f016020809104026020016040519081016040528092919081815260200182805461138590614513565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505060405180602001604052806000815250612f6b565b61141257604051806040016040528060048152602001637472756560e01b815250611431565b6040518060400160405280600581526020016466616c736560d81b8152505b61144361143e878a612fc4565b613071565b604051602001611456949392919061471e565b604051602081830303815290604052613071565b60405160200161147a9190614814565b60405160208183030381529060405292505050919050565b600b546001600160a01b031633146114bc5760405162461bcd60e51b81526004016105ae906146a0565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ae565b61152a81611e53565b50565b60006001600160e01b031982166380ac58cd60e01b148061155e57506001600160e01b03198216635b5e139f60e01b145b806104a157506301ffc9a760e01b6001600160e01b03198316146104a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115b282610f73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ae565b600061166f83610f73565b9050806001600160a01b0316846001600160a01b031614806116aa5750836001600160a01b031661169f84610539565b6001600160a01b0316145b806116da57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166116f582610f73565b6001600160a01b03161461175d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105ae565b6001600160a01b0382166117bf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ae565b6117ca8383836131d7565b6117d560008261157d565b6001600160a01b03831660009081526003602052604081208054600192906117fe908490614859565b90915550506001600160a01b038216600090815260036020526040812080546001929061182c908490614624565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60608160005b815181101561190a578181815181106118ae576118ae6146d5565b6020910101516001600160f81b031916601160f91b14156118f857602760f81b8282815181106118e0576118e06146d5565b60200101906001600160f81b031916908160001a9053505b806119028161465b565b915050611893565b5092915050565b604080516101208101825260f0815260e860208083019190915260b482840152605a60608381019190915260506080840152604660a0840152603c60c0840152603a60e08401526037610100840152600c54935190936000936119c1939092610429926119b29261199e92449242928c920193845260208401929092526040830152606082015260800190565b60405160208183030381529060405261328f565b6119bc9190614870565b6132c0565b604080516101208101825260fa815260f060208083019190915260e88284015260b46060830152606e6080830152605a60a0830152605060c0830152604660e08301526037610100830152600c549251939450600093611a4a9361051b926119b29261199e92449242928d92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e660208083019190915260dc8284015260d2606083015260c86080830152609660a0830152608c60c0830152608260e08301526078610100830152600c549251939450600093611ad393610668926119b29261199e92449242928e92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260d28284015260bc606083015260826080830152606460a0830152605a60c0830152604e60e08301526045610100830152600c549251939450600093611b5c93610539926119b29261199e92449242928f92910193845260208401929092526040830152606082015260800190565b90506000611bfc60405180610120016040528060fa60ff16815260200160f560ff16815260200160f060ff16815260200160eb60ff16815260200160e660ff16815260200160e160ff16815260200160dc60ff16815260200160d760ff16815260200160d260ff168152506108166119b244428c600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260c88284015260b460608084019190915260aa60808085019190915260a0808501819052608c60c0860152608260e08601526078610100860152600c548651449581019590955242968501969096529183018d9052820193909352929350600092611c8992610624916119b2910161199e565b90506000611d2960405180610120016040528060f060ff16815260200160e860ff16815260200160b460ff168152602001606e60ff168152602001605a60ff168152602001605060ff168152602001604660ff168152602001603c60ff168152602001603760ff1681525061045d6119b244428e600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b905060058760ff1610611d3c5786611d3f565b60005b965060058560ff1610611d525784611d55565b60005b94506000611d658860ff16612427565b611d718860ff16612427565b611d7d8860ff16612427565b611d898860ff16612427565b611d958860ff16612427565b611da18860ff16612427565b611dad8860ff16612427565b604051602001611dc39796959493929190614884565b6040516020818303038152906040529050600e81604051611de491906145f2565b9081526040519081900360200190205460ff1615611e2857600c8054906000611e0c8361465b565b9190505550611e1a8a611911565b9a9950505050505050505050565b9998505050505050505050565b611e4f828260405180602001604052806000815250613315565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611eb08484846116e2565b611ebc84848484613348565b6111ad5760405162461bcd60e51b81526004016105ae90614916565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526000838152600f602052604090208054611ff791611ff291611f6b90614513565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9790614513565b8015611fe45780601f10611fb957610100808354040283529160200191611fe4565b820191906000526020600020905b815481529060010190602001808311611fc757829003601f168201915b505050505060006001613455565b613522565b60ff1681526000838152600f6020526040902080546120a491611ff29161201d90614513565b80601f016020809104026020016040519081016040528092919081815260200182805461204990614513565b80156120965780601f1061206b57610100808354040283529160200191612096565b820191906000526020600020905b81548152906001019060200180831161207957829003601f168201915b505050505060016002613455565b60ff166020808301919091526000848152600f90915260409020805461215891611ff2916120d190614513565b80601f01602080910402602001604051908101604052809291908181526020018280546120fd90614513565b801561214a5780601f1061211f5761010080835404028352916020019161214a565b820191906000526020600020905b81548152906001019060200180831161212d57829003601f168201915b505050505060026003613455565b60ff166040808301919091526000848152600f60205220805461220991611ff29161218290614513565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90614513565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b505050505060036004613455565b60ff1660608201526000838152600f6020526040902080546122b991611ff29161223290614513565b80601f016020809104026020016040519081016040528092919081815260200182805461225e90614513565b80156122ab5780601f10612280576101008083540402835291602001916122ab565b820191906000526020600020905b81548152906001019060200180831161228e57829003601f168201915b505050505060046005613455565b60ff1660808201526000838152600f60205260409020805461236991611ff2916122e290614513565b80601f016020809104026020016040519081016040528092919081815260200182805461230e90614513565b801561235b5780601f106123305761010080835404028352916020019161235b565b820191906000526020600020905b81548152906001019060200180831161233e57829003601f168201915b505050505060056006613455565b60ff1660a08201526000838152600f60205260409020805461241991611ff29161239290614513565b80601f01602080910402602001604051908101604052809291908181526020018280546123be90614513565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b505050505060066007613455565b60ff1660c082015292915050565b60608161244b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612475578061245f8161465b565b915061246e9050600a8361468c565b915061244f565b60008167ffffffffffffffff81111561249057612490614305565b6040519080825280601f01601f1916602001820160405280156124ba576020820181803683370190505b5090505b84156116da576124cf600183614859565b91506124dc600a86614870565b6124e7906030614624565b60f81b8183815181106124fc576124fc6146d5565b60200101906001600160f81b031916908160001a90535061251e600a8661468c565b94506124be565b6060604051806101200160405280604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b81525081526020016040518060400160405280600581526020016411985a5b9d60da1b815250815260200160405180604001604052806006815260200165426c6561727960d01b81525081526020016040518060400160405280600581526020016446757a7a7960d81b81525081526020016040518060400160405280600481526020016348617a7960e01b8152508152602001604051806040016040528060068152602001654d796f70696160d01b815250815250826000015160ff1660098110612681576126816146d5565b60209081029190910151604080516101608101825260046101208201908152634e6f6e6560e01b6101408301528152815180830183526006808252652634b732b0b960d11b828701528286019190915282518084018452908152651498591a585b60d21b81860152818301528151808301835260108082526f2932b832b0ba34b733902634b732b0b960811b828701526060830191909152825180840184529081526f14995c19585d1a5b99c81498591a585b60821b818601526080820152815180830183526005815264436f6e696360d81b8186015260a082015281518083018352600f81526e141e5c985b5a5908119b185b9b995b608a1b8186015260c082015281518083018352600a8152692934b9b4b7339029bab760b11b8186015260e08201528151808301909252600d82526c14985a5b989bddc815da19595b609a1b828501526101008101919091529184015190919060ff16600981106127ea576127ea6146d5565b60209081029190910151604080516101608101825260046101208201818152634e6f6e6560e01b6101408401819052908352835180850185528281528087018290528387015283518085018552828152808701829052838501528351808501855282815280870182905260608401528351808501855291825281860152608082015281518083018352601081526f121a59da08141bda5b9d08131a59da1d60821b8186015260a0820152815180830183526012815271131bddc8111a5cdd185b98d948131a59da1d60721b8186015260c082015281518083018352600f81526e131bddc8141bda5b9d08131a59da1d608a1b8186015260e0820152815180830183526013815272121a59da08111a5cdd185b98d948131a59da1d606a1b9481019490945261010081019390935285015190919060ff1660098110612930576129306146d5565b602002015160405180610120016040528060405180604001604052806002815260200161031360f41b815250815260200160405180604001604052806002815260200161032360f41b81525081526020016040518060400160405280600381526020016203130360ec1b81525081526020016040518060400160405280600381526020016203330360ec1b81525081526020016040518060400160405280600381526020016203630360ec1b8152508152602001604051806040016040528060048152602001630313030360e41b81525081526020016040518060400160405280600981526020016839383720416c70686160b81b81525081526020016040518060400160405280600c81526020016b5b72656461637465645d204960a01b81525081526020016040518060400160405280600d81526020016c5b72656461637465645d20494960981b815250815250856060015160ff1660098110612a9857612a986146d5565b60200201516040518061012001604052806040518060400160405280600d81526020016c507572706c652046616272696360981b81525081526020016040518060400160405280600d81526020016c4d6f756e7461696e2048617a6560981b81525081526020016040518060400160405280600f81526020016e4e6f72746865726e204c696768747360881b8152508152602001604051806040016040528060088152602001674c61766120536b7960c01b81525081526020016040518060400160405280600c81526020016b082eae8eadadc4086e4eae6d60a31b81525081526020016040518060400160405280600a81526020016911185c9ac813595d185b60b21b81525081526020016040518060400160405280600981526020016846616c6c204669726560b81b81525081526020016040518060400160405280600d81526020016c53656372657420537072696e6760981b81525081526020016040518060400160405280600e81526020016d57696e746572204d7573696e677360901b815250815250866080015160ff1660098110612c3857612c386146d5565b602002015160405180610120016040528060405180604001604052806005815260200164437562657360d81b81525081526020016040518060400160405280600c81526020016b446f74732026204c696e657360a01b815250815260200160405180604001604052806009815260200168587320616e64204f7360b81b81525081526020016040518060400160405280600781526020016642616e6e65727360c81b815250815260200160405180604001604052806007815260200166436972636c657360c81b815250815260200160405180604001604052806009815260200168547269616e676c657360b81b8152508152602001604051806040016040528060098152602001685371756967676c657360b81b815250815260200160405180604001604052806005815260200164141b185a5960da1b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508760a0015160ff1660098110612db057612db06146d5565b6020020151604051806101200160405280604051806040016040528060098152602001684672616374616c203160b81b815250815260200160405180604001604052806009815260200168233930b1ba30b6101960b91b8152508152602001604051806040016040528060098152602001684672616374616c203360b81b815250815260200160405180604001604052806009815260200168119c9858dd185b080d60ba1b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203160a01b8152508152602001604051806040016040528060098152602001684672616374616c203560b81b81525081526020016040518060400160405280600c81526020016b2a3ab9313ab632b731b2901960a11b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203360a01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508860c0015160ff1660098110612f3a57612f3a6146d5565b6020020151604051602001612f559796959493929190614968565b6040516020818303038152906040529050919050565b600081604051602001612f7e91906145f2565b6040516020818303038152906040528051906020012083604051602001612fa591906145f2565b6040516020818303038152906040528051906020012014905092915050565b60606000612fd284846136dc565b905060008460a0015160ff166008146130165760405180604001604052806013815260200172103334b6361e913ab9361411b818149110179f60691b815250613043565b60405180604001604052806013815260200172103334b6361e913b30b9141696b1149110179f60691b8152505b90508181604051602001613058929190614b84565b6040516020818303038152906040529250505092915050565b805160609080613091575050604080516020810190915260008152919050565b600060036130a0836002614624565b6130aa919061468c565b6130b590600461463c565b905060006130c4826020614624565b67ffffffffffffffff8111156130dc576130dc614305565b6040519080825280601f01601f191660200182016040528015613106576020820181803683370190505b509050600060405180606001604052806040815260200161519e604091399050600181016020830160005b86811015613192576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613131565b5060038606600181146131ac57600281146131bd576131c9565b613d3d60f01b6001198301526131c9565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166132325761322d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613255565b816001600160a01b0316836001600160a01b0316146132555761325583826138f3565b6001600160a01b03821661326c576106e481613990565b826001600160a01b0316826001600160a01b0316146106e4576106e48282613a3f565b6000816040516020016132a291906145f2565b60408051601f19818403018152919052805160209091012092915050565b8151600090819060ff165b83811161330d57816132dc81614c0a565b925050848260ff16600981106132f4576132f46146d5565b60200201516133069060ff1682614624565b90506132cb565b509392505050565b61331f8383613a83565b61332c6000848484613348565b6106e45760405162461bcd60e51b81526004016105ae90614916565b60006001600160a01b0384163b1561344a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061338c903390899088908890600401614c2a565b602060405180830381600087803b1580156133a657600080fd5b505af19250505080156133d6575060408051601f3d908101601f191682019092526133d391810190614c67565b60015b613430573d808015613404576040519150601f19603f3d011682016040523d82523d6000602084013e613409565b606091505b5080516134285760405162461bcd60e51b81526004016105ae90614916565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116da565b506001949350505050565b60608360006134648585614859565b67ffffffffffffffff81111561347c5761347c614305565b6040519080825280601f01601f1916602001820160405280156134a6576020820181803683370190505b509050845b84811015613518578281815181106134c5576134c56146d5565b01602001516001600160f81b031916826134df8884614859565b815181106134ef576134ef6146d5565b60200101906001600160f81b031916908160001a905350806135108161465b565b9150506134ab565b5095945050505050565b600061354782604051806040016040528060018152602001600360fc1b815250612f6b565b1561355457506000919050565b61357782604051806040016040528060018152602001603160f81b815250612f6b565b1561358457506001919050565b6135a782604051806040016040528060018152602001601960f91b815250612f6b565b156135b457506002919050565b6135d782604051806040016040528060018152602001603360f81b815250612f6b565b156135e457506003919050565b61360782604051806040016040528060018152602001600d60fa1b815250612f6b565b1561361457506004919050565b61363782604051806040016040528060018152602001603560f81b815250612f6b565b1561364457506005919050565b61366782604051806040016040528060018152602001601b60f91b815250612f6b565b1561367457506006919050565b61369782604051806040016040528060018152602001603760f81b815250612f6b565b156136a457506007919050565b6136c782604051806040016040528060018152602001600760fb1b815250612f6b565b156136d457506008919050565b506000919050565b600d5460208301516040516310853bd960e21b815260ff90911660048201526060916000916001600160a01b0390911690634214ef649060240160006040518083038186803b15801561372e57600080fd5b505afa158015613742573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376a9190810190614c84565b600d546080860151604051630e9b3c1160e01b815260ff90911660048201526001600160a01b0390911690630e9b3c119060240160006040518083038186803b1580156137b657600080fd5b505afa1580156137ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137f29190810190614c84565b8560a0015160ff166008146138ad57600d5460a087015160405163cd36223960e01b815260ff90911660048201526001600160a01b039091169063cd3622399060240160006040518083038186803b15801561384d57600080fd5b505afa158015613861573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138899190810190614c84565b6040516020016138999190614cfb565b6040516020818303038152906040526138be565b604051806020016040528060008152505b6138c88787613bd1565b6040516020016138db9493929190614d49565b60408051808303601f19018152919052949350505050565b6000600161390084610fea565b61390a9190614859565b60008381526007602052604090205490915080821461395d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139a290600190614859565b600083815260096020526040812054600880549394509092849081106139ca576139ca6146d5565b9060005260206000200154905080600883815481106139eb576139eb6146d5565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a2357613a23614ea2565b6001900381819060005260206000200160009055905550505050565b6000613a4a83610fea565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613ad95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ae565b6000818152600260205260409020546001600160a01b031615613b3e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105ae565b613b4a600083836131d7565b6001600160a01b0382166000908152600360205260408120805460019290613b73908490614624565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060008360a0015160ff16600814613c165760405180604001604052806014815260200173034b71e91391991103932b9bab63a1e91391a11160651b815250613c44565b60405180604001604052806014815260200173034b71e91391911103932b9bab63a1e91391991160651b8152505b600d5460408681015190516390dbf17560e01b815260ff90911660048201529192506000916001600160a01b03909116906390dbf1759060240160006040518083038186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cd29190810190614c84565b90506000613cef8260405180602001604052806000815250612f6b565b613da057600d5460408781015190516390dbf17560e01b815260ff909116600482015284916001600160a01b0316906390dbf1759060240160006040518083038186803b158015613d3f57600080fd5b505afa158015613d53573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d7b9190810190614c84565b604051602001613d8c929190614eb8565b604051602081830303815290604052613db1565b604051806020016040528060008152505b90506000613dc0600287614870565b15613de3576040518060800160405280604a81526020016151de604a9139613e06565b604051806040016040528060098152602001681e17b334b63a32b91f60b91b8152505b905060608760a0015160ff1660081415613f5a57600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ea29190810190614c84565b613eab88612427565b600d548a51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f309190810190614c84565b85604051602001613f449493929190614f29565b6040516020818303038152906040529050614121565b600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613fa657600080fd5b505afa158015613fba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fe29190810190614c84565b613feb88612427565b600d5460608b01516040516336a8813760e11b815260ff90911660048201526001600160a01b0390911690636d51026e9060240160006040518083038186803b15801561403757600080fd5b505afa15801561404b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140739190810190614c84565b600d548b51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b1580156140bc57600080fd5b505afa1580156140d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140f89190810190614c84565b868660405160200161410f96959493929190615046565b60405160208183030381529060405290505b979650505050505050565b82805461413890614513565b90600052602060002090601f01602090048101928261415a57600085556141a0565b82601f1061417357805160ff19168380011785556141a0565b828001600101855582156141a0579182015b828111156141a0578251825591602001919060010190614185565b506141ac9291506141b0565b5090565b5b808211156141ac57600081556001016141b1565b6001600160e01b03198116811461152a57600080fd5b6000602082840312156141ed57600080fd5b81356141f8816141c5565b9392505050565b60005b8381101561421a578181015183820152602001614202565b838111156111ad5750506000910152565b600081518084526142438160208601602086016141ff565b601f01601f19169290920160200192915050565b6020815260006141f8602083018461422b565b60006020828403121561427c57600080fd5b5035919050565b80356001600160a01b038116811461429a57600080fd5b919050565b600080604083850312156142b257600080fd5b6142bb83614283565b946020939093013593505050565b6000806000606084860312156142de57600080fd5b6142e784614283565b92506142f560208501614283565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561434457614344614305565b604052919050565b600067ffffffffffffffff82111561436657614366614305565b50601f01601f191660200190565b60006143876143828461434c565b61431b565b905082815283838301111561439b57600080fd5b828260208301376000602084830101529392505050565b600080604083850312156143c557600080fd5b82359150602083013567ffffffffffffffff8111156143e357600080fd5b8301601f810185136143f457600080fd5b61440385823560208401614374565b9150509250929050565b60006020828403121561441f57600080fd5b6141f882614283565b6000806040838503121561443b57600080fd5b61444483614283565b91506020830135801515811461445957600080fd5b809150509250929050565b6000806000806080858703121561447a57600080fd5b61448385614283565b935061449160208601614283565b925060408501359150606085013567ffffffffffffffff8111156144b457600080fd5b8501601f810187136144c557600080fd5b6144d487823560208401614374565b91505092959194509250565b600080604083850312156144f357600080fd5b6144fc83614283565b915061450a60208401614283565b90509250929050565b600181811c9082168061452757607f821691505b6020821081141561454857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081516145e88185602086016141ff565b9290920192915050565b600082516146048184602087016141ff565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156146375761463761460e565b500190565b60008160001904831182151516156146565761465661460e565b500290565b600060001982141561466f5761466f61460e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261469b5761469b614676565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6a486561647363617065202360a81b81526000825161471181600b8501602087016141ff565b91909101600b0192915050565b693d913730b6b2911d101160b11b8152845160009061474481600a850160208a016141ff565b85519083019061475b81600a840160208a016141ff565b7f227d2c7b2274726169745f74797065223a20225469746c6564222c2276616c75600a92909101918201526432911d101160d91b602a82015284516147a781602f8401602089016141ff565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d602f9290910191820152681b0ed8985cd94d8d0b60ba1b604f82015283516147f78160588401602088016141ff565b61227d60f01b60589290910191820152605a019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161484c81601d8501602087016141ff565b91909101601d0192915050565b60008282101561486b5761486b61460e565b500390565b60008261487f5761487f614676565b500690565b6000885160206148978285838e016141ff565b8951918401916148aa8184848e016141ff565b89519201916148bc8184848d016141ff565b88519201916148ce8184848c016141ff565b87519201916148e08184848b016141ff565b86519201916148f28184848a016141ff565b855192019161490481848489016141ff565b919091019a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a815271101121363ab91116113b30b63ab2911d101160711b6020820152600088516149bb816032850160208d016141ff565b7f227d2c7b2274726169745f74797065223a20224772616469656e74222c22766160329184019182015266363ab2911d101160c91b60528201528851614a08816059840160208d016141ff565b7f227d2c7b2274726169745f74797065223a20224c69676874222c2276616c75656059929091019182015263111d101160e11b60798201528751614a5381607d840160208c016141ff565b614b75614b6f614b34614b2e614af6614af0614ab8614ab2607d898b01017f227d2c7b2274726169745f74797065223a2022446973706c6163656d656e742081526e26b0b81116113b30b63ab2911d101160891b6020820152602f0190565b8f6145d6565b7f227d2c7b2274726169745f74797065223a202250616c65747465222c2276616c8152653ab2911d101160d11b602082015260260190565b8c6145d6565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c8152653ab2911d101160d11b602082015260260190565b896145d6565b7f227d2c7b2274726169745f74797065223a202254757262756c656e6365222c228152683b30b63ab2911d101160b91b602082015260290190565b866145d6565b9b9a5050505050505050505050565b60008351614b968184602088016141ff565b80830190507f3c72656374206865696768743d22353030222077696474683d223135303022208152703334b63a32b91e913ab9361411b318149160791b60208201528351614beb8160318401602088016141ff565b651e17b9bb339f60d11b60319290910191820152603701949350505050565b600060ff821660ff811415614c2157614c2161460e565b60010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c5d9083018461422b565b9695505050505050565b600060208284031215614c7957600080fd5b81516141f8816141c5565b600060208284031215614c9657600080fd5b815167ffffffffffffffff811115614cad57600080fd5b8201601f81018413614cbe57600080fd5b8051614ccc6143828261434c565b818152856020838501011115614ce157600080fd5b614cf28260208301602086016141ff565b95945050505050565b7001e3830ba3a32b9371034b21e913818111607d1b81528151600090614d288160118501602087016141ff565b691e17b830ba3a32b9371f60b11b6011939091019283015250601b01919050565b7f3c7376672077696474683d223135303022206865696768743d2235303022207681527f657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e7760208201527f332e6f72672f323030302f73766722207374796c653d22706f736974696f6e3a60408201527f2072656c61746976653b206261636b67726f756e643a20000000000000000000606082015260008551614df3816077850160208a016141ff565b6d1d911031b630b9b99e913198111f60911b6077918401918201526c3c7374796c653e2e63307b2d2d60981b60858201528551614e37816092840160208a016141ff565b691dbe9e17b9ba3cb6329f60b11b60929290910191820152651e3232b3399f60d11b609c8201528451614e718160a28401602089016141ff565b614e96614e8360a283850101876145d6565b661e17b232b3399f60c91b815260070190565b98975050505050505050565b634e487b7160e01b600052603160045260246000fd5b7f3c6665446966667573654c69676874696e67206c69676874696e672d636f6c6f81526c0391e913b30b9141696b094911609d1b602082015260008351614f0681602d8501602088016141ff565b835190830190614f1d81602d8401602088016141ff565b01602d01949350505050565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b60108201528451600090614f6c81601e850160208a016141ff565b661039b2b2b21e9160c91b601e918401918201528551614f93816025840160208a016141ff565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665476175737369616e426c757220737464446576696174696f6e3d22000060358201528451614fea8160538401602089016141ff565b7f2220696e3d2272312220726573756c743d22723222202f3e000000000000000060539290910191820152835161502881606b8401602088016141ff565b614e96606b82840101681e17b334b63a32b91f60b91b815260090190565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b6010820152865160009061508981601e850160208c016141ff565b661039b2b2b21e9160c91b601e9184019182015287516150b0816025840160208c016141ff565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665446973706c6163656d656e744d617020696e323d2272312220726573756035820152670363a1e91391911160c51b6055820152865161511881605d840160208b016141ff565b611e1a614b6f61519761516e61516861513f605d878901016210179f60e91b815260030190565b7f3c6665476175737369616e426c757220737464446576696174696f6e3d2200008152601e0190565b8b6145d6565b7f2220696e3d2272322220726573756c743d22723322202f3e0000000000000000815260180190565b886145d656fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c66654d657267653e3c66654d657267654e6f646520696e3d22723422202f3e3c66654d657267654e6f646520696e3d22723222202f3e3c2f66654d657267653e3c2f66696c7465723ea26469706673582212207afc78c6365ec8d517f56b7a18b569387ac64c8a466cca90c59d4f7dfdd949d164736f6c63430008090033
Deployed Bytecode
0x60806040526004361061014b5760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610383578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063edc6d4351461042c578063f2fde38b1461045c57600080fd5b80634f6ccce7146102db5780636352211e146102fb57806370a082311461031b578063715018a61461033b5780638da5cb5b1461035057806395d89b411461036e57600080fd5b80632a54e540116101085780632a54e540146102405780632f745c5914610260578063379607f5146102805780633ccfd60b1461029357806342842e0e1461029b578063434f48c4146102bb57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610220575b600080fd5b34801561015c57600080fd5b5061017061016b3660046141db565b61047c565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104a7565b60405161017c9190614257565b3480156101b357600080fd5b506101c76101c236600461426a565b610539565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa36600461429f565b6105d3565b005b34801561020d57600080fd5b506008545b60405190815260200161017c565b34801561022c57600080fd5b506101ff61023b3660046142c9565b6106e9565b34801561024c57600080fd5b506101ff61025b3660046143b2565b61071a565b34801561026c57600080fd5b5061021261027b36600461429f565b6109ac565b6101ff61028e36600461426a565b610a42565b6101ff610ccd565b3480156102a757600080fd5b506101ff6102b63660046142c9565b610d53565b3480156102c757600080fd5b506101ff6102d636600461426a565b610d6e565b3480156102e757600080fd5b506102126102f636600461426a565b610ee0565b34801561030757600080fd5b506101c761031636600461426a565b610f73565b34801561032757600080fd5b5061021261033636600461440d565b610fea565b34801561034757600080fd5b506101ff611071565b34801561035c57600080fd5b50600b546001600160a01b03166101c7565b34801561037a57600080fd5b5061019a6110a7565b34801561038f57600080fd5b506101ff61039e366004614428565b6110b6565b3480156103af57600080fd5b506101ff6103be366004614464565b61117b565b3480156103cf57600080fd5b5061019a6103de36600461426a565b6111b3565b3480156103ef57600080fd5b506101706103fe3660046144e0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b5061017061044736600461426a565b60116020526000908152604090205460ff1681565b34801561046857600080fd5b506101ff61047736600461440d565b611492565b60006001600160e01b0319821663780e9d6360e01b14806104a157506104a18261152d565b92915050565b6060600080546104b690614513565b80601f01602080910402602001604051908101604052809291908181526020018280546104e290614513565b801561052f5780601f106105045761010080835404028352916020019161052f565b820191906000526020600020905b81548152906001019060200180831161051257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105b75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105de82610f73565b9050806001600160a01b0316836001600160a01b0316141561064c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ae565b336001600160a01b0382161480610668575061066881336103fe565b6106da5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105ae565b6106e4838361157d565b505050565b6106f333826115eb565b61070f5760405162461bcd60e51b81526004016105ae9061454e565b6106e48383836116e2565b6002600a54141561073d5760405162461bcd60e51b81526004016105ae9061459f565b6002600a5561074b82610f73565b6001600160a01b0316336001600160a01b0316146107ab5760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f6e2774206f776e2074686973204865616473636170650000000060448201526064016105ae565b600082815260106020526040902080546107c490614513565b15905061081f5760405162461bcd60e51b815260206004820152602360248201527f546869732048656164736361706520616c7265616479206861732061207469746044820152626c652160e81b60648201526084016105ae565b601160008260405160200161083491906145f2565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156108b45760405162461bcd60e51b815260206004820152602160248201527f54686973207469746c652068617320616c7265616479206265656e2074616b656044820152603760f91b60648201526084016105ae565b600081511180156108c6575060418151105b61092b5760405162461bcd60e51b815260206004820152603060248201527f456e7465722061207469746c65206174206c65617374203120616e642075702060448201526f746f203634206368617273206c6f6e6760801b60648201526084016105ae565b6109348161188d565b60008381526010602090815260409091208251610957939192919091019061412c565b506001601160008360405160200161096f91906145f2565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550506001600a55565b60006109b783610fea565b8210610a195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105ae565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a655760405162461bcd60e51b81526004016105ae9061459f565b6002600a558015801590610a795750600b81105b610ad65760405162461bcd60e51b815260206004820152602860248201527f43686f6f7365206174206c65617374203120616e64206174206d6f7374203130604482015267081d1bc81b5a5b9d60c21b60648201526084016105ae565b61251c610ae260085490565b610aec9083614624565b10610b5f5760405162461bcd60e51b815260206004820152603f60248201527f456e746572206120646966666572656e74207175616e74697479202d2074686560448201527f7265206172656e742074686174206d616e79206c65667420746f206d696e740060648201526084016105ae565b610b708166354a6ba7a1800061463c565b341015610bb85760405162461bcd60e51b8152602060048201526016602482015275141c9a58d9481a5cc80b8c0c4d481c195c881b5a5b9d60521b60448201526064016105ae565b6000610bc360085490565b905060005b82811015610c70576000610bdb83611911565b6000848152600f602090815260409091208251929350610bff92909184019061412c565b506001600e82604051610c1291906145f2565b908152604051908190036020019020805491151560ff19909216919091179055610c42610c3c3390565b84611e35565b600854600c80549194506000610c578361465b565b9190505550508080610c689061465b565b915050610bc8565b503415610cc45773095f1fd53a56c01c76a2a56b7273995ce915d8c46108fc610c9a60023461468c565b6040518115909202916000818181858888f19350505050158015610cc2573d6000803e3d6000fd5b505b50506001600a55565b6002600a541415610cf05760405162461bcd60e51b81526004016105ae9061459f565b6002600a55600b546001600160a01b03163314610d1f5760405162461bcd60e51b81526004016105ae906146a0565b60405133904780156108fc02916000818181858888f19350505050158015610d4b573d6000803e3d6000fd5b506001600a55565b6106e48383836040518060200160405280600081525061117b565b6002600a541415610d915760405162461bcd60e51b81526004016105ae9061459f565b6002600a55600b546001600160a01b03163314610dc05760405162461bcd60e51b81526004016105ae906146a0565b61251c8110158015610dd3575061271081105b610e455760405162461bcd60e51b815260206004820152603a60248201527f43686f6f736520616e20756e636c61696d656420696e6465782062657477656560448201527f6e203935303020616e6420393939392c20696e636c757369766500000000000060648201526084016105ae565b6000610e5082611911565b6000838152600f602090815260409091208251929350610e7492909184019061412c565b506001600e82604051610e8791906145f2565b908152604051908190036020019020805491151560ff19909216919091179055610ec2610ebc600b546001600160a01b031690565b83611e35565b600c8054906000610ed28361465b565b90915550506001600a555050565b6000610eeb60085490565b8210610f4e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105ae565b60088281548110610f6157610f616146d5565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ae565b60006001600160a01b0382166110555760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ae565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461109b5760405162461bcd60e51b81526004016105ae906146a0565b6110a56000611e53565b565b6060600180546104b690614513565b6001600160a01b03821633141561110f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105ae565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61118533836115eb565b6111a15760405162461bcd60e51b81526004016105ae9061454e565b6111ad84848484611ea5565b50505050565b6000818152600260205260409020546060906001600160a01b03166112325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ae565b600061123d83611ed8565b905060008060106000868152602001908152602001600020805461126090614513565b9050116112945761127084612427565b60405160200161128091906146eb565b60405160208183030381529060405261132c565b600084815260106020526040902080546112ad90614513565b80601f01602080910402602001604051908101604052809291908181526020018280546112d990614513565b80156113265780601f106112fb57610100808354040283529160200191611326565b820191906000526020600020905b81548152906001019060200180831161130957829003601f168201915b50505050505b905061146a8161133b84612525565b600087815260106020526040902080546113ec919061135990614513565b80601f016020809104026020016040519081016040528092919081815260200182805461138590614513565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505060405180602001604052806000815250612f6b565b61141257604051806040016040528060048152602001637472756560e01b815250611431565b6040518060400160405280600581526020016466616c736560d81b8152505b61144361143e878a612fc4565b613071565b604051602001611456949392919061471e565b604051602081830303815290604052613071565b60405160200161147a9190614814565b60405160208183030381529060405292505050919050565b600b546001600160a01b031633146114bc5760405162461bcd60e51b81526004016105ae906146a0565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ae565b61152a81611e53565b50565b60006001600160e01b031982166380ac58cd60e01b148061155e57506001600160e01b03198216635b5e139f60e01b145b806104a157506301ffc9a760e01b6001600160e01b03198316146104a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115b282610f73565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ae565b600061166f83610f73565b9050806001600160a01b0316846001600160a01b031614806116aa5750836001600160a01b031661169f84610539565b6001600160a01b0316145b806116da57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166116f582610f73565b6001600160a01b03161461175d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105ae565b6001600160a01b0382166117bf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ae565b6117ca8383836131d7565b6117d560008261157d565b6001600160a01b03831660009081526003602052604081208054600192906117fe908490614859565b90915550506001600160a01b038216600090815260036020526040812080546001929061182c908490614624565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60608160005b815181101561190a578181815181106118ae576118ae6146d5565b6020910101516001600160f81b031916601160f91b14156118f857602760f81b8282815181106118e0576118e06146d5565b60200101906001600160f81b031916908160001a9053505b806119028161465b565b915050611893565b5092915050565b604080516101208101825260f0815260e860208083019190915260b482840152605a60608381019190915260506080840152604660a0840152603c60c0840152603a60e08401526037610100840152600c54935190936000936119c1939092610429926119b29261199e92449242928c920193845260208401929092526040830152606082015260800190565b60405160208183030381529060405261328f565b6119bc9190614870565b6132c0565b604080516101208101825260fa815260f060208083019190915260e88284015260b46060830152606e6080830152605a60a0830152605060c0830152604660e08301526037610100830152600c549251939450600093611a4a9361051b926119b29261199e92449242928d92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e660208083019190915260dc8284015260d2606083015260c86080830152609660a0830152608c60c0830152608260e08301526078610100830152600c549251939450600093611ad393610668926119b29261199e92449242928e92910193845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260d28284015260bc606083015260826080830152606460a0830152605a60c0830152604e60e08301526045610100830152600c549251939450600093611b5c93610539926119b29261199e92449242928f92910193845260208401929092526040830152606082015260800190565b90506000611bfc60405180610120016040528060fa60ff16815260200160f560ff16815260200160f060ff16815260200160eb60ff16815260200160e660ff16815260200160e160ff16815260200160dc60ff16815260200160d760ff16815260200160d260ff168152506108166119b244428c600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b604080516101208101825260f0815260e860208083019190915260c88284015260b460608084019190915260aa60808085019190915260a0808501819052608c60c0860152608260e08601526078610100860152600c548651449581019590955242968501969096529183018d9052820193909352929350600092611c8992610624916119b2910161199e565b90506000611d2960405180610120016040528060f060ff16815260200160e860ff16815260200160b460ff168152602001606e60ff168152602001605a60ff168152602001605060ff168152602001604660ff168152602001603c60ff168152602001603760ff1681525061045d6119b244428e600c5460405160200161199e949392919093845260208401929092526040830152606082015260800190565b905060058760ff1610611d3c5786611d3f565b60005b965060058560ff1610611d525784611d55565b60005b94506000611d658860ff16612427565b611d718860ff16612427565b611d7d8860ff16612427565b611d898860ff16612427565b611d958860ff16612427565b611da18860ff16612427565b611dad8860ff16612427565b604051602001611dc39796959493929190614884565b6040516020818303038152906040529050600e81604051611de491906145f2565b9081526040519081900360200190205460ff1615611e2857600c8054906000611e0c8361465b565b9190505550611e1a8a611911565b9a9950505050505050505050565b9998505050505050505050565b611e4f828260405180602001604052806000815250613315565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611eb08484846116e2565b611ebc84848484613348565b6111ad5760405162461bcd60e51b81526004016105ae90614916565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526000838152600f602052604090208054611ff791611ff291611f6b90614513565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9790614513565b8015611fe45780601f10611fb957610100808354040283529160200191611fe4565b820191906000526020600020905b815481529060010190602001808311611fc757829003601f168201915b505050505060006001613455565b613522565b60ff1681526000838152600f6020526040902080546120a491611ff29161201d90614513565b80601f016020809104026020016040519081016040528092919081815260200182805461204990614513565b80156120965780601f1061206b57610100808354040283529160200191612096565b820191906000526020600020905b81548152906001019060200180831161207957829003601f168201915b505050505060016002613455565b60ff166020808301919091526000848152600f90915260409020805461215891611ff2916120d190614513565b80601f01602080910402602001604051908101604052809291908181526020018280546120fd90614513565b801561214a5780601f1061211f5761010080835404028352916020019161214a565b820191906000526020600020905b81548152906001019060200180831161212d57829003601f168201915b505050505060026003613455565b60ff166040808301919091526000848152600f60205220805461220991611ff29161218290614513565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90614513565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b505050505060036004613455565b60ff1660608201526000838152600f6020526040902080546122b991611ff29161223290614513565b80601f016020809104026020016040519081016040528092919081815260200182805461225e90614513565b80156122ab5780601f10612280576101008083540402835291602001916122ab565b820191906000526020600020905b81548152906001019060200180831161228e57829003601f168201915b505050505060046005613455565b60ff1660808201526000838152600f60205260409020805461236991611ff2916122e290614513565b80601f016020809104026020016040519081016040528092919081815260200182805461230e90614513565b801561235b5780601f106123305761010080835404028352916020019161235b565b820191906000526020600020905b81548152906001019060200180831161233e57829003601f168201915b505050505060056006613455565b60ff1660a08201526000838152600f60205260409020805461241991611ff29161239290614513565b80601f01602080910402602001604051908101604052809291908181526020018280546123be90614513565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b505050505060066007613455565b60ff1660c082015292915050565b60608161244b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612475578061245f8161465b565b915061246e9050600a8361468c565b915061244f565b60008167ffffffffffffffff81111561249057612490614305565b6040519080825280601f01601f1916602001820160405280156124ba576020820181803683370190505b5090505b84156116da576124cf600183614859565b91506124dc600a86614870565b6124e7906030614624565b60f81b8183815181106124fc576124fc6146d5565b60200101906001600160f81b031916908160001a90535061251e600a8661468c565b94506124be565b6060604051806101200160405280604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b81525081526020016040518060400160405280600581526020016411985a5b9d60da1b815250815260200160405180604001604052806006815260200165426c6561727960d01b81525081526020016040518060400160405280600581526020016446757a7a7960d81b81525081526020016040518060400160405280600481526020016348617a7960e01b8152508152602001604051806040016040528060068152602001654d796f70696160d01b815250815250826000015160ff1660098110612681576126816146d5565b60209081029190910151604080516101608101825260046101208201908152634e6f6e6560e01b6101408301528152815180830183526006808252652634b732b0b960d11b828701528286019190915282518084018452908152651498591a585b60d21b81860152818301528151808301835260108082526f2932b832b0ba34b733902634b732b0b960811b828701526060830191909152825180840184529081526f14995c19585d1a5b99c81498591a585b60821b818601526080820152815180830183526005815264436f6e696360d81b8186015260a082015281518083018352600f81526e141e5c985b5a5908119b185b9b995b608a1b8186015260c082015281518083018352600a8152692934b9b4b7339029bab760b11b8186015260e08201528151808301909252600d82526c14985a5b989bddc815da19595b609a1b828501526101008101919091529184015190919060ff16600981106127ea576127ea6146d5565b60209081029190910151604080516101608101825260046101208201818152634e6f6e6560e01b6101408401819052908352835180850185528281528087018290528387015283518085018552828152808701829052838501528351808501855282815280870182905260608401528351808501855291825281860152608082015281518083018352601081526f121a59da08141bda5b9d08131a59da1d60821b8186015260a0820152815180830183526012815271131bddc8111a5cdd185b98d948131a59da1d60721b8186015260c082015281518083018352600f81526e131bddc8141bda5b9d08131a59da1d608a1b8186015260e0820152815180830183526013815272121a59da08111a5cdd185b98d948131a59da1d606a1b9481019490945261010081019390935285015190919060ff1660098110612930576129306146d5565b602002015160405180610120016040528060405180604001604052806002815260200161031360f41b815250815260200160405180604001604052806002815260200161032360f41b81525081526020016040518060400160405280600381526020016203130360ec1b81525081526020016040518060400160405280600381526020016203330360ec1b81525081526020016040518060400160405280600381526020016203630360ec1b8152508152602001604051806040016040528060048152602001630313030360e41b81525081526020016040518060400160405280600981526020016839383720416c70686160b81b81525081526020016040518060400160405280600c81526020016b5b72656461637465645d204960a01b81525081526020016040518060400160405280600d81526020016c5b72656461637465645d20494960981b815250815250856060015160ff1660098110612a9857612a986146d5565b60200201516040518061012001604052806040518060400160405280600d81526020016c507572706c652046616272696360981b81525081526020016040518060400160405280600d81526020016c4d6f756e7461696e2048617a6560981b81525081526020016040518060400160405280600f81526020016e4e6f72746865726e204c696768747360881b8152508152602001604051806040016040528060088152602001674c61766120536b7960c01b81525081526020016040518060400160405280600c81526020016b082eae8eadadc4086e4eae6d60a31b81525081526020016040518060400160405280600a81526020016911185c9ac813595d185b60b21b81525081526020016040518060400160405280600981526020016846616c6c204669726560b81b81525081526020016040518060400160405280600d81526020016c53656372657420537072696e6760981b81525081526020016040518060400160405280600e81526020016d57696e746572204d7573696e677360901b815250815250866080015160ff1660098110612c3857612c386146d5565b602002015160405180610120016040528060405180604001604052806005815260200164437562657360d81b81525081526020016040518060400160405280600c81526020016b446f74732026204c696e657360a01b815250815260200160405180604001604052806009815260200168587320616e64204f7360b81b81525081526020016040518060400160405280600781526020016642616e6e65727360c81b815250815260200160405180604001604052806007815260200166436972636c657360c81b815250815260200160405180604001604052806009815260200168547269616e676c657360b81b8152508152602001604051806040016040528060098152602001685371756967676c657360b81b815250815260200160405180604001604052806005815260200164141b185a5960da1b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508760a0015160ff1660098110612db057612db06146d5565b6020020151604051806101200160405280604051806040016040528060098152602001684672616374616c203160b81b815250815260200160405180604001604052806009815260200168233930b1ba30b6101960b91b8152508152602001604051806040016040528060098152602001684672616374616c203360b81b815250815260200160405180604001604052806009815260200168119c9858dd185b080d60ba1b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203160a01b8152508152602001604051806040016040528060098152602001684672616374616c203560b81b81525081526020016040518060400160405280600c81526020016b2a3ab9313ab632b731b2901960a11b81525081526020016040518060400160405280600c81526020016b54757262756c656e6365203360a01b8152508152602001604051806040016040528060048152602001634e6f6e6560e01b8152508152508860c0015160ff1660098110612f3a57612f3a6146d5565b6020020151604051602001612f559796959493929190614968565b6040516020818303038152906040529050919050565b600081604051602001612f7e91906145f2565b6040516020818303038152906040528051906020012083604051602001612fa591906145f2565b6040516020818303038152906040528051906020012014905092915050565b60606000612fd284846136dc565b905060008460a0015160ff166008146130165760405180604001604052806013815260200172103334b6361e913ab9361411b818149110179f60691b815250613043565b60405180604001604052806013815260200172103334b6361e913b30b9141696b1149110179f60691b8152505b90508181604051602001613058929190614b84565b6040516020818303038152906040529250505092915050565b805160609080613091575050604080516020810190915260008152919050565b600060036130a0836002614624565b6130aa919061468c565b6130b590600461463c565b905060006130c4826020614624565b67ffffffffffffffff8111156130dc576130dc614305565b6040519080825280601f01601f191660200182016040528015613106576020820181803683370190505b509050600060405180606001604052806040815260200161519e604091399050600181016020830160005b86811015613192576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613131565b5060038606600181146131ac57600281146131bd576131c9565b613d3d60f01b6001198301526131c9565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166132325761322d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613255565b816001600160a01b0316836001600160a01b0316146132555761325583826138f3565b6001600160a01b03821661326c576106e481613990565b826001600160a01b0316826001600160a01b0316146106e4576106e48282613a3f565b6000816040516020016132a291906145f2565b60408051601f19818403018152919052805160209091012092915050565b8151600090819060ff165b83811161330d57816132dc81614c0a565b925050848260ff16600981106132f4576132f46146d5565b60200201516133069060ff1682614624565b90506132cb565b509392505050565b61331f8383613a83565b61332c6000848484613348565b6106e45760405162461bcd60e51b81526004016105ae90614916565b60006001600160a01b0384163b1561344a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061338c903390899088908890600401614c2a565b602060405180830381600087803b1580156133a657600080fd5b505af19250505080156133d6575060408051601f3d908101601f191682019092526133d391810190614c67565b60015b613430573d808015613404576040519150601f19603f3d011682016040523d82523d6000602084013e613409565b606091505b5080516134285760405162461bcd60e51b81526004016105ae90614916565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116da565b506001949350505050565b60608360006134648585614859565b67ffffffffffffffff81111561347c5761347c614305565b6040519080825280601f01601f1916602001820160405280156134a6576020820181803683370190505b509050845b84811015613518578281815181106134c5576134c56146d5565b01602001516001600160f81b031916826134df8884614859565b815181106134ef576134ef6146d5565b60200101906001600160f81b031916908160001a905350806135108161465b565b9150506134ab565b5095945050505050565b600061354782604051806040016040528060018152602001600360fc1b815250612f6b565b1561355457506000919050565b61357782604051806040016040528060018152602001603160f81b815250612f6b565b1561358457506001919050565b6135a782604051806040016040528060018152602001601960f91b815250612f6b565b156135b457506002919050565b6135d782604051806040016040528060018152602001603360f81b815250612f6b565b156135e457506003919050565b61360782604051806040016040528060018152602001600d60fa1b815250612f6b565b1561361457506004919050565b61363782604051806040016040528060018152602001603560f81b815250612f6b565b1561364457506005919050565b61366782604051806040016040528060018152602001601b60f91b815250612f6b565b1561367457506006919050565b61369782604051806040016040528060018152602001603760f81b815250612f6b565b156136a457506007919050565b6136c782604051806040016040528060018152602001600760fb1b815250612f6b565b156136d457506008919050565b506000919050565b600d5460208301516040516310853bd960e21b815260ff90911660048201526060916000916001600160a01b0390911690634214ef649060240160006040518083038186803b15801561372e57600080fd5b505afa158015613742573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376a9190810190614c84565b600d546080860151604051630e9b3c1160e01b815260ff90911660048201526001600160a01b0390911690630e9b3c119060240160006040518083038186803b1580156137b657600080fd5b505afa1580156137ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526137f29190810190614c84565b8560a0015160ff166008146138ad57600d5460a087015160405163cd36223960e01b815260ff90911660048201526001600160a01b039091169063cd3622399060240160006040518083038186803b15801561384d57600080fd5b505afa158015613861573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138899190810190614c84565b6040516020016138999190614cfb565b6040516020818303038152906040526138be565b604051806020016040528060008152505b6138c88787613bd1565b6040516020016138db9493929190614d49565b60408051808303601f19018152919052949350505050565b6000600161390084610fea565b61390a9190614859565b60008381526007602052604090205490915080821461395d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139a290600190614859565b600083815260096020526040812054600880549394509092849081106139ca576139ca6146d5565b9060005260206000200154905080600883815481106139eb576139eb6146d5565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a2357613a23614ea2565b6001900381819060005260206000200160009055905550505050565b6000613a4a83610fea565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613ad95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ae565b6000818152600260205260409020546001600160a01b031615613b3e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105ae565b613b4a600083836131d7565b6001600160a01b0382166000908152600360205260408120805460019290613b73908490614624565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060008360a0015160ff16600814613c165760405180604001604052806014815260200173034b71e91391991103932b9bab63a1e91391a11160651b815250613c44565b60405180604001604052806014815260200173034b71e91391911103932b9bab63a1e91391991160651b8152505b600d5460408681015190516390dbf17560e01b815260ff90911660048201529192506000916001600160a01b03909116906390dbf1759060240160006040518083038186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cd29190810190614c84565b90506000613cef8260405180602001604052806000815250612f6b565b613da057600d5460408781015190516390dbf17560e01b815260ff909116600482015284916001600160a01b0316906390dbf1759060240160006040518083038186803b158015613d3f57600080fd5b505afa158015613d53573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d7b9190810190614c84565b604051602001613d8c929190614eb8565b604051602081830303815290604052613db1565b604051806020016040528060008152505b90506000613dc0600287614870565b15613de3576040518060800160405280604a81526020016151de604a9139613e06565b604051806040016040528060098152602001681e17b334b63a32b91f60b91b8152505b905060608760a0015160ff1660081415613f5a57600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613e6657600080fd5b505afa158015613e7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ea29190810190614c84565b613eab88612427565b600d548a51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f309190810190614c84565b85604051602001613f449493929190614f29565b6040516020818303038152906040529050614121565b600d5460c089015160405163e523c2c360e01b815260ff90911660048201526001600160a01b039091169063e523c2c39060240160006040518083038186803b158015613fa657600080fd5b505afa158015613fba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fe29190810190614c84565b613feb88612427565b600d5460608b01516040516336a8813760e11b815260ff90911660048201526001600160a01b0390911690636d51026e9060240160006040518083038186803b15801561403757600080fd5b505afa15801561404b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140739190810190614c84565b600d548b51604051633aedf85360e11b815260ff90911660048201526001600160a01b03909116906375dbf0a69060240160006040518083038186803b1580156140bc57600080fd5b505afa1580156140d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140f89190810190614c84565b868660405160200161410f96959493929190615046565b60405160208183030381529060405290505b979650505050505050565b82805461413890614513565b90600052602060002090601f01602090048101928261415a57600085556141a0565b82601f1061417357805160ff19168380011785556141a0565b828001600101855582156141a0579182015b828111156141a0578251825591602001919060010190614185565b506141ac9291506141b0565b5090565b5b808211156141ac57600081556001016141b1565b6001600160e01b03198116811461152a57600080fd5b6000602082840312156141ed57600080fd5b81356141f8816141c5565b9392505050565b60005b8381101561421a578181015183820152602001614202565b838111156111ad5750506000910152565b600081518084526142438160208601602086016141ff565b601f01601f19169290920160200192915050565b6020815260006141f8602083018461422b565b60006020828403121561427c57600080fd5b5035919050565b80356001600160a01b038116811461429a57600080fd5b919050565b600080604083850312156142b257600080fd5b6142bb83614283565b946020939093013593505050565b6000806000606084860312156142de57600080fd5b6142e784614283565b92506142f560208501614283565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561434457614344614305565b604052919050565b600067ffffffffffffffff82111561436657614366614305565b50601f01601f191660200190565b60006143876143828461434c565b61431b565b905082815283838301111561439b57600080fd5b828260208301376000602084830101529392505050565b600080604083850312156143c557600080fd5b82359150602083013567ffffffffffffffff8111156143e357600080fd5b8301601f810185136143f457600080fd5b61440385823560208401614374565b9150509250929050565b60006020828403121561441f57600080fd5b6141f882614283565b6000806040838503121561443b57600080fd5b61444483614283565b91506020830135801515811461445957600080fd5b809150509250929050565b6000806000806080858703121561447a57600080fd5b61448385614283565b935061449160208601614283565b925060408501359150606085013567ffffffffffffffff8111156144b457600080fd5b8501601f810187136144c557600080fd5b6144d487823560208401614374565b91505092959194509250565b600080604083850312156144f357600080fd5b6144fc83614283565b915061450a60208401614283565b90509250929050565b600181811c9082168061452757607f821691505b6020821081141561454857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600081516145e88185602086016141ff565b9290920192915050565b600082516146048184602087016141ff565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156146375761463761460e565b500190565b60008160001904831182151516156146565761465661460e565b500290565b600060001982141561466f5761466f61460e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261469b5761469b614676565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6a486561647363617065202360a81b81526000825161471181600b8501602087016141ff565b91909101600b0192915050565b693d913730b6b2911d101160b11b8152845160009061474481600a850160208a016141ff565b85519083019061475b81600a840160208a016141ff565b7f227d2c7b2274726169745f74797065223a20225469746c6564222c2276616c75600a92909101918201526432911d101160d91b602a82015284516147a781602f8401602089016141ff565b7f227d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d602f9290910191820152681b0ed8985cd94d8d0b60ba1b604f82015283516147f78160588401602088016141ff565b61227d60f01b60589290910191820152605a019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161484c81601d8501602087016141ff565b91909101601d0192915050565b60008282101561486b5761486b61460e565b500390565b60008261487f5761487f614676565b500690565b6000885160206148978285838e016141ff565b8951918401916148aa8184848e016141ff565b89519201916148bc8184848d016141ff565b88519201916148ce8184848c016141ff565b87519201916148e08184848b016141ff565b86519201916148f28184848a016141ff565b855192019161490481848489016141ff565b919091019a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a815271101121363ab91116113b30b63ab2911d101160711b6020820152600088516149bb816032850160208d016141ff565b7f227d2c7b2274726169745f74797065223a20224772616469656e74222c22766160329184019182015266363ab2911d101160c91b60528201528851614a08816059840160208d016141ff565b7f227d2c7b2274726169745f74797065223a20224c69676874222c2276616c75656059929091019182015263111d101160e11b60798201528751614a5381607d840160208c016141ff565b614b75614b6f614b34614b2e614af6614af0614ab8614ab2607d898b01017f227d2c7b2274726169745f74797065223a2022446973706c6163656d656e742081526e26b0b81116113b30b63ab2911d101160891b6020820152602f0190565b8f6145d6565b7f227d2c7b2274726169745f74797065223a202250616c65747465222c2276616c8152653ab2911d101160d11b602082015260260190565b8c6145d6565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c8152653ab2911d101160d11b602082015260260190565b896145d6565b7f227d2c7b2274726169745f74797065223a202254757262756c656e6365222c228152683b30b63ab2911d101160b91b602082015260290190565b866145d6565b9b9a5050505050505050505050565b60008351614b968184602088016141ff565b80830190507f3c72656374206865696768743d22353030222077696474683d223135303022208152703334b63a32b91e913ab9361411b318149160791b60208201528351614beb8160318401602088016141ff565b651e17b9bb339f60d11b60319290910191820152603701949350505050565b600060ff821660ff811415614c2157614c2161460e565b60010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c5d9083018461422b565b9695505050505050565b600060208284031215614c7957600080fd5b81516141f8816141c5565b600060208284031215614c9657600080fd5b815167ffffffffffffffff811115614cad57600080fd5b8201601f81018413614cbe57600080fd5b8051614ccc6143828261434c565b818152856020838501011115614ce157600080fd5b614cf28260208301602086016141ff565b95945050505050565b7001e3830ba3a32b9371034b21e913818111607d1b81528151600090614d288160118501602087016141ff565b691e17b830ba3a32b9371f60b11b6011939091019283015250601b01919050565b7f3c7376672077696474683d223135303022206865696768743d2235303022207681527f657273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e7760208201527f332e6f72672f323030302f73766722207374796c653d22706f736974696f6e3a60408201527f2072656c61746976653b206261636b67726f756e643a20000000000000000000606082015260008551614df3816077850160208a016141ff565b6d1d911031b630b9b99e913198111f60911b6077918401918201526c3c7374796c653e2e63307b2d2d60981b60858201528551614e37816092840160208a016141ff565b691dbe9e17b9ba3cb6329f60b11b60929290910191820152651e3232b3399f60d11b609c8201528451614e718160a28401602089016141ff565b614e96614e8360a283850101876145d6565b661e17b232b3399f60c91b815260070190565b98975050505050505050565b634e487b7160e01b600052603160045260246000fd5b7f3c6665446966667573654c69676874696e67206c69676874696e672d636f6c6f81526c0391e913b30b9141696b094911609d1b602082015260008351614f0681602d8501602088016141ff565b835190830190614f1d81602d8401602088016141ff565b01602d01949350505050565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b60108201528451600090614f6c81601e850160208a016141ff565b661039b2b2b21e9160c91b601e918401918201528551614f93816025840160208a016141ff565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665476175737369616e426c757220737464446576696174696f6e3d22000060358201528451614fea8160538401602089016141ff565b7f2220696e3d2272312220726573756c743d22723222202f3e000000000000000060539290910191820152835161502881606b8401602088016141ff565b614e96606b82840101681e17b334b63a32b91f60b91b815260090190565b6f1e3334b63a32b91034b21e913318111f60811b81526d01e3332aa3ab9313ab632b731b2960951b6010820152865160009061508981601e850160208c016141ff565b661039b2b2b21e9160c91b601e9184019182015287516150b0816025840160208c016141ff565b6f11103932b9bab63a1e9139189110179f60811b602592909101918201527f3c6665446973706c6163656d656e744d617020696e323d2272312220726573756035820152670363a1e91391911160c51b6055820152865161511881605d840160208b016141ff565b611e1a614b6f61519761516e61516861513f605d878901016210179f60e91b815260030190565b7f3c6665476175737369616e426c757220737464446576696174696f6e3d2200008152601e0190565b8b6145d6565b7f2220696e3d2272322220726573756c743d22723322202f3e0000000000000000815260180190565b886145d656fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c66654d657267653e3c66654d657267654e6f646520696e3d22723422202f3e3c66654d657267654e6f646520696e3d22723222202f3e3c2f66654d657267653e3c2f66696c7465723ea26469706673582212207afc78c6365ec8d517f56b7a18b569387ac64c8a466cca90c59d4f7dfdd949d164736f6c63430008090033
Deployed Bytecode Sourcemap
58390:20229:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39594:224;;;;;;;;;;-1:-1:-1;39594:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39594:224:0;;;;;;;;26513:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28072:221::-;;;;;;;;;;-1:-1:-1;28072:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;28072:221:0;1550:203:1;27595:411:0;;;;;;;;;;-1:-1:-1;27595:411:0;;;;;:::i;:::-;;:::i;:::-;;40234:113;;;;;;;;;;-1:-1:-1;40322:10:0;:17;40234:113;;;2341:25:1;;;2329:2;2314:18;40234:113:0;2195:177:1;28962:339:0;;;;;;;;;;-1:-1:-1;28962:339:0;;;;;:::i;:::-;;:::i;72863:773::-;;;;;;;;;;-1:-1:-1;72863:773:0;;;;;:::i;:::-;;:::i;39902:256::-;;;;;;;;;;-1:-1:-1;39902:256:0;;;;;:::i;:::-;;:::i;73842:1153::-;;;;;;:::i;:::-;;:::i;75462:128::-;;;:::i;29372:185::-;;;;;;;;;;-1:-1:-1;29372:185:0;;;;;:::i;:::-;;:::i;75058:396::-;;;;;;;;;;-1:-1:-1;75058:396:0;;;;;:::i;:::-;;:::i;40424:233::-;;;;;;;;;;-1:-1:-1;40424:233:0;;;;;:::i;:::-;;:::i;26207:239::-;;;;;;;;;;-1:-1:-1;26207:239:0;;;;;:::i;:::-;;:::i;25937:208::-;;;;;;;;;;-1:-1:-1;25937:208:0;;;;;:::i;:::-;;:::i;2507:94::-;;;;;;;;;;;;;:::i;1856:87::-;;;;;;;;;;-1:-1:-1;1929:6:0;;-1:-1:-1;;;;;1929:6:0;1856:87;;26682:104;;;;;;;;;;;;;:::i;28365:295::-;;;;;;;;;;-1:-1:-1;28365:295:0;;;;;:::i;:::-;;:::i;29628:328::-;;;;;;;;;;-1:-1:-1;29628:328:0;;;;;:::i;:::-;;:::i;71166:1614::-;;;;;;;;;;-1:-1:-1;71166:1614:0;;;;;:::i;:::-;;:::i;28731:164::-;;;;;;;;;;-1:-1:-1;28731:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28852:25:0;;;28828:4;28852:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28731:164;58772:46;;;;;;;;;;-1:-1:-1;58772:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;2756:192;;;;;;;;;;-1:-1:-1;2756:192:0;;;;;:::i;:::-;;:::i;39594:224::-;39696:4;-1:-1:-1;;;;;;39720:50:0;;-1:-1:-1;;;39720:50:0;;:90;;;39774:36;39798:11;39774:23;:36::i;:::-;39713:97;39594:224;-1:-1:-1;;39594:224:0:o;26513:100::-;26567:13;26600:5;26593:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26513:100;:::o;28072:221::-;28148:7;31555:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31555:16:0;28168:73;;;;-1:-1:-1;;;28168:73:0;;6433:2:1;28168:73:0;;;6415:21:1;6472:2;6452:18;;;6445:30;6511:34;6491:18;;;6484:62;-1:-1:-1;;;6562:18:1;;;6555:42;6614:19;;28168:73:0;;;;;;;;;-1:-1:-1;28261:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28261:24:0;;28072:221::o;27595:411::-;27676:13;27692:23;27707:7;27692:14;:23::i;:::-;27676:39;;27740:5;-1:-1:-1;;;;;27734:11:0;:2;-1:-1:-1;;;;;27734:11:0;;;27726:57;;;;-1:-1:-1;;;27726:57:0;;6846:2:1;27726:57:0;;;6828:21:1;6885:2;6865:18;;;6858:30;6924:34;6904:18;;;6897:62;-1:-1:-1;;;6975:18:1;;;6968:31;7016:19;;27726:57:0;6644:397:1;27726:57:0;732:10;-1:-1:-1;;;;;27818:21:0;;;;:62;;-1:-1:-1;27843:37:0;27860:5;732:10;28731:164;:::i;27843:37::-;27796:168;;;;-1:-1:-1;;;27796:168:0;;7248:2:1;27796:168:0;;;7230:21:1;7287:2;7267:18;;;7260:30;7326:34;7306:18;;;7299:62;7397:26;7377:18;;;7370:54;7441:19;;27796:168:0;7046:420:1;27796:168:0;27977:21;27986:2;27990:7;27977:8;:21::i;:::-;27665:341;27595:411;;:::o;28962:339::-;29157:41;732:10;29190:7;29157:18;:41::i;:::-;29149:103;;;;-1:-1:-1;;;29149:103:0;;;;;;;:::i;:::-;29265:28;29275:4;29281:2;29285:7;29265:9;:28::i;72863:773::-;4877:1;5473:7;;:19;;5465:63;;;;-1:-1:-1;;;5465:63:0;;;;;;;:::i;:::-;4877:1;5606:7;:18;72987:16:::1;72995:7:::0;72987::::1;:16::i;:::-;-1:-1:-1::0;;;;;72971:32:0::1;732:10:::0;-1:-1:-1;;;;;72971:32:0::1;;72949:110;;;::::0;-1:-1:-1;;;72949:110:0;;8451:2:1;72949:110:0::1;::::0;::::1;8433:21:1::0;8490:2;8470:18;;;8463:30;8529;8509:18;;;8502:58;8577:18;;72949:110:0::1;8249:352:1::0;72949:110:0::1;73098:23;::::0;;;:14:::1;:23;::::0;;;;73092:37;;::::1;::::0;::::1;:::i;:::-;:42:::0;;-1:-1:-1;73070:127:0::1;;;::::0;-1:-1:-1;;;73070:127:0;;8808:2:1;73070:127:0::1;::::0;::::1;8790:21:1::0;8847:2;8827:18;;;8820:30;8886:34;8866:18;;;8859:62;-1:-1:-1;;;8937:18:1;;;8930:33;8980:19;;73070:127:0::1;8606:399:1::0;73070:127:0::1;73231:14;:53;73275:4;73257:24;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;73257:24:0;;::::1;::::0;;;;;;73247:35;;73257:24:::1;73247:35:::0;;::::1;::::0;73231:53;;;;::::1;::::0;;;;;-1:-1:-1;73231:53:0;;::::1;;73230:54;73208:137;;;::::0;-1:-1:-1;;;73208:137:0;;9683:2:1;73208:137:0::1;::::0;::::1;9665:21:1::0;9722:2;9702:18;;;9695:30;9761:34;9741:18;;;9734:62;-1:-1:-1;;;9812:18:1;;;9805:31;9853:19;;73208:137:0::1;9481:397:1::0;73208:137:0::1;73399:1;73384:4;73378:18;:22;:49;;;;;73425:2;73410:4;73404:18;:23;73378:49;73356:147;;;::::0;-1:-1:-1;;;73356:147:0;;10085:2:1;73356:147:0::1;::::0;::::1;10067:21:1::0;10124:2;10104:18;;;10097:30;10163:34;10143:18;;;10136:62;-1:-1:-1;;;10214:18:1;;;10207:46;10270:19;;73356:147:0::1;9883:412:1::0;73356:147:0::1;73540:17;73552:4;73540:11;:17::i;:::-;73514:23;::::0;;;:14:::1;:23;::::0;;;;;;;:43;;::::1;::::0;:23;;:43;;;::::1;::::0;::::1;:::i;:::-;;73624:4;73568:14;:53;73612:4;73594:24;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;73594:24:0;;;;;;73584:35;;73594:24:::1;73584:35:::0;;::::1;::::0;73568:53;;;;::::1;::::0;;;;;-1:-1:-1;73568:53:0;:60;;-1:-1:-1;;73568:60:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;;5785:7:0;:22;72863:773::o;39902:256::-;39999:7;40035:23;40052:5;40035:16;:23::i;:::-;40027:5;:31;40019:87;;;;-1:-1:-1;;;40019:87:0;;10502:2:1;40019:87:0;;;10484:21:1;10541:2;10521:18;;;10514:30;10580:34;10560:18;;;10553:62;-1:-1:-1;;;10631:18:1;;;10624:41;10682:19;;40019:87:0;10300:407:1;40019:87:0;-1:-1:-1;;;;;;40124:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39902:256::o;73842:1153::-;4877:1;5473:7;;:19;;5465:63;;;;-1:-1:-1;;;5465:63:0;;;;;;;:::i;:::-;4877:1;5606:7;:18;73931:7;;;;;:19:::1;;;73948:2;73942:3;:8;73931:19;73909:109;;;::::0;-1:-1:-1;;;73909:109:0;;10914:2:1;73909:109:0::1;::::0;::::1;10896:21:1::0;10953:2;10933:18;;;10926:30;10992:34;10972:18;;;10965:62;-1:-1:-1;;;11043:18:1;;;11036:38;11091:19;;73909:109:0::1;10712:404:1::0;73909:109:0::1;74073:4;74057:13;40322:10:::0;:17;;40234:113;74057:13:::1;74051:19;::::0;:3;:19:::1;:::i;:::-;:26;74029:139;;;::::0;-1:-1:-1;;;74029:139:0;;11588:2:1;74029:139:0::1;::::0;::::1;11570:21:1::0;11627:2;11607:18;;;11600:30;11666:34;11646:18;;;11639:62;11737:33;11717:18;;;11710:61;11788:19;;74029:139:0::1;11386:427:1::0;74029:139:0::1;74200:23;:3:::0;74206:17:::1;74200:23;:::i;:::-;74187:9;:36;;74179:71;;;::::0;-1:-1:-1;;;74179:71:0;;12193:2:1;74179:71:0::1;::::0;::::1;12175:21:1::0;12232:2;12212:18;;;12205:30;-1:-1:-1;;;12251:18:1;;;12244:52;12313:18;;74179:71:0::1;11991:346:1::0;74179:71:0::1;74261:18;74282:13;40322:10:::0;:17;;40234:113;74282:13:::1;74261:34;;74311:9;74306:289;74330:3;74326:1;:7;74306:289;;;74355:15;74373:16;74378:10;74373:4;:16::i;:::-;74404:25;::::0;;;:13:::1;:25;::::0;;;;;;;:29;;74355:34;;-1:-1:-1;74404:29:0::1;::::0;:25;;:29;::::1;::::0;::::1;:::i;:::-;;74466:4;74448:12;74461:1;74448:15;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:22;;;::::1;;-1:-1:-1::0;;74448:22:0;;::::1;::::0;;;::::1;::::0;;74485:35:::1;74495:12;732:10:::0;;652:98;74495:12:::1;74509:10;74485:9;:35::i;:::-;40322:10:::0;:17;74576:5:::1;:7:::0;;74535:26;;-1:-1:-1;74576:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;74340:255;74335:3;;;;;:::i;:::-;;;;74306:289;;;-1:-1:-1::0;74839:9:0::1;:13:::0;74835:153:::1;;74877:42;74869:107;74948:13;74960:1;74948:9;:13;:::i;:::-;74869:107;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;74835:153;-1:-1:-1::0;;4833:1:0;5785:7;:22;73842:1153::o;75462:128::-;4877:1;5473:7;;:19;;5465:63;;;;-1:-1:-1;;;5465:63:0;;;;;;;:::i;:::-;4877:1;5606:7;:18;1929:6;;-1:-1:-1;;;;;1929:6:0;732:10;2076:23:::1;2068:68;;;;-1:-1:-1::0;;;2068:68:0::1;;;;;;;:::i;:::-;75531:51:::2;::::0;75539:10:::2;::::0;75560:21:::2;75531:51:::0;::::2;;;::::0;::::2;::::0;;;75560:21;75539:10;75531:51;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;4833:1:0;5785:7;:22;75462:128::o;29372:185::-;29510:39;29527:4;29533:2;29537:7;29510:39;;;;;;;;;;;;:16;:39::i;75058:396::-;4877:1;5473:7;;:19;;5465:63;;;;-1:-1:-1;;;5465:63:0;;;;;;;:::i;:::-;4877:1;5606:7;:18;1929:6;;-1:-1:-1;;;;;1929:6:0;732:10;2076:23:::1;2068:68;;;;-1:-1:-1::0;;;2068:68:0::1;;;;;;;:::i;:::-;75169:4:::2;75158:7;:15;;:34;;;;;75187:5;75177:7;:15;75158:34;75136:142;;;::::0;-1:-1:-1;;;75136:142:0;;13302:2:1;75136:142:0::2;::::0;::::2;13284:21:1::0;13341:2;13321:18;;;13314:30;13380:34;13360:18;;;13353:62;13451:28;13431:18;;;13424:56;13497:19;;75136:142:0::2;13100:422:1::0;75136:142:0::2;75289:15;75307:13;75312:7;75307:4;:13::i;:::-;75331:22;::::0;;;:13:::2;:22;::::0;;;;;;;:26;;75289:31;;-1:-1:-1;75331:26:0::2;::::0;:22;;:26;::::2;::::0;::::2;:::i;:::-;;75386:4;75368:12;75381:1;75368:15;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;:22;;;::::2;;-1:-1:-1::0;;75368:22:0;;::::2;::::0;;;::::2;::::0;;75401:27:::2;75411:7;1929:6:::0;;-1:-1:-1;;;;;1929:6:0;;1856:87;75411:7:::2;75420;75401:9;:27::i;:::-;75439:5;:7:::0;;;:5:::2;:7;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;4833:1:0;5785:7;:22;-1:-1:-1;;75058:396:0:o;40424:233::-;40499:7;40535:30;40322:10;:17;;40234:113;40535:30;40527:5;:38;40519:95;;;;-1:-1:-1;;;40519:95:0;;13729:2:1;40519:95:0;;;13711:21:1;13768:2;13748:18;;;13741:30;13807:34;13787:18;;;13780:62;-1:-1:-1;;;13858:18:1;;;13851:42;13910:19;;40519:95:0;13527:408:1;40519:95:0;40632:10;40643:5;40632:17;;;;;;;;:::i;:::-;;;;;;;;;40625:24;;40424:233;;;:::o;26207:239::-;26279:7;26315:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26315:16:0;26350:19;26342:73;;;;-1:-1:-1;;;26342:73:0;;14274:2:1;26342:73:0;;;14256:21:1;14313:2;14293:18;;;14286:30;14352:34;14332:18;;;14325:62;-1:-1:-1;;;14403:18:1;;;14396:39;14452:19;;26342:73:0;14072:405:1;25937:208:0;26009:7;-1:-1:-1;;;;;26037:19:0;;26029:74;;;;-1:-1:-1;;;26029:74:0;;14684:2:1;26029:74:0;;;14666:21:1;14723:2;14703:18;;;14696:30;14762:34;14742:18;;;14735:62;-1:-1:-1;;;14813:18:1;;;14806:40;14863:19;;26029:74:0;14482:406:1;26029:74:0;-1:-1:-1;;;;;;26121:16:0;;;;;:9;:16;;;;;;;25937:208::o;2507:94::-;1929:6;;-1:-1:-1;;;;;1929:6:0;732:10;2076:23;2068:68;;;;-1:-1:-1;;;2068:68:0;;;;;;;:::i;:::-;2572:21:::1;2590:1;2572:9;:21::i;:::-;2507:94::o:0;26682:104::-;26738:13;26771:7;26764:14;;;;;:::i;28365:295::-;-1:-1:-1;;;;;28468:24:0;;732:10;28468:24;;28460:62;;;;-1:-1:-1;;;28460:62:0;;15095:2:1;28460:62:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:27;15153:18;;;15146:55;15218:18;;28460:62:0;14893:349:1;28460:62:0;732:10;28535:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28535:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28535:53:0;;;;;;;;;;28604:48;;540:41:1;;;28535:42:0;;732:10;28604:48;;513:18:1;28604:48:0;;;;;;;28365:295;;:::o;29628:328::-;29803:41;732:10;29836:7;29803:18;:41::i;:::-;29795:103;;;;-1:-1:-1;;;29795:103:0;;;;;;;:::i;:::-;29909:39;29923:4;29929:2;29933:7;29942:5;29909:13;:39::i;:::-;29628:328;;;;:::o;71166:1614::-;31531:4;31555:16;;;:7;:16;;;;;;71231:13;;-1:-1:-1;;;;;31555:16:0;71257:113;;;;-1:-1:-1;;;71257:113:0;;15449:2:1;71257:113:0;;;15431:21:1;15488:2;15468:18;;;15461:30;15527:34;15507:18;;;15500:62;-1:-1:-1;;;15578:18:1;;;15571:45;15633:19;;71257:113:0;15247:411:1;71257:113:0;71381:26;71410:21;71423:7;71410:12;:21::i;:::-;71381:50;;71442:18;71503:1;71469:14;:23;71484:7;71469:23;;;;;;;;;;;71463:37;;;;;:::i;:::-;;;:41;:162;;71606:17;71615:7;71606:8;:17::i;:::-;71574:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;71463:162;;;71527:23;;;;:14;:23;;;;;71463:162;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71442:183;;71774:964;71997:4;72040:24;72054:9;72040:13;:24::i;:::-;72196:23;;;;:14;:23;;;;;72181:43;;;;72196:23;72181:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:43::i;:::-;:144;;;;;;;;;;;;;;;-1:-1:-1;;;72181:144:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72181:144:0;;;;72446:133;72508:31;72520:9;72531:7;72508:11;:31::i;:::-;72446:13;:133::i;:::-;71891:766;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71774:13;:964::i;:::-;71681:1076;;;;;;;;:::i;:::-;;;;;;;;;;;;;71636:1136;;;;71166:1614;;;:::o;2756:192::-;1929:6;;-1:-1:-1;;;;;1929:6:0;732:10;2076:23;2068:68;;;;-1:-1:-1;;;2068:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2845:22:0;::::1;2837:73;;;::::0;-1:-1:-1;;;2837:73:0;;18442:2:1;2837:73:0::1;::::0;::::1;18424:21:1::0;18481:2;18461:18;;;18454:30;18520:34;18500:18;;;18493:62;-1:-1:-1;;;18571:18:1;;;18564:36;18617:19;;2837:73:0::1;18240:402:1::0;2837:73:0::1;2921:19;2931:8;2921:9;:19::i;:::-;2756:192:::0;:::o;25568:305::-;25670:4;-1:-1:-1;;;;;;25707:40:0;;-1:-1:-1;;;25707:40:0;;:105;;-1:-1:-1;;;;;;;25764:48:0;;-1:-1:-1;;;25764:48:0;25707:105;:158;;;-1:-1:-1;;;;;;;;;;24199:40:0;;;25829:36;24090:157;35448:174;35523:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35523:29:0;-1:-1:-1;;;;;35523:29:0;;;;;;;;:24;;35577:23;35523:24;35577:14;:23::i;:::-;-1:-1:-1;;;;;35568:46:0;;;;;;;;;;;35448:174;;:::o;31760:348::-;31853:4;31555:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31555:16:0;31870:73;;;;-1:-1:-1;;;31870:73:0;;18849:2:1;31870:73:0;;;18831:21:1;18888:2;18868:18;;;18861:30;18927:34;18907:18;;;18900:62;-1:-1:-1;;;18978:18:1;;;18971:42;19030:19;;31870:73:0;18647:408:1;31870:73:0;31954:13;31970:23;31985:7;31970:14;:23::i;:::-;31954:39;;32023:5;-1:-1:-1;;;;;32012:16:0;:7;-1:-1:-1;;;;;32012:16:0;;:51;;;;32056:7;-1:-1:-1;;;;;32032:31:0;:20;32044:7;32032:11;:20::i;:::-;-1:-1:-1;;;;;32032:31:0;;32012:51;:87;;;-1:-1:-1;;;;;;28852:25:0;;;28828:4;28852:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32067:32;32004:96;31760:348;-1:-1:-1;;;;31760:348:0:o;34752:578::-;34911:4;-1:-1:-1;;;;;34884:31:0;:23;34899:7;34884:14;:23::i;:::-;-1:-1:-1;;;;;34884:31:0;;34876:85;;;;-1:-1:-1;;;34876:85:0;;19262:2:1;34876:85:0;;;19244:21:1;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;-1:-1:-1;;;19391:18:1;;;19384:39;19440:19;;34876:85:0;19060:405:1;34876:85:0;-1:-1:-1;;;;;34980:16:0;;34972:65;;;;-1:-1:-1;;;34972:65:0;;19672:2:1;34972:65:0;;;19654:21:1;19711:2;19691:18;;;19684:30;19750:34;19730:18;;;19723:62;-1:-1:-1;;;19801:18:1;;;19794:34;19845:19;;34972:65:0;19470:400:1;34972:65:0;35050:39;35071:4;35077:2;35081:7;35050:20;:39::i;:::-;35154:29;35171:1;35175:7;35154:8;:29::i;:::-;-1:-1:-1;;;;;35196:15:0;;;;;;:9;:15;;;;;:20;;35215:1;;35196:15;:20;;35215:1;;35196:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35227:13:0;;;;;;:9;:13;;;;;:18;;35244:1;;35227:13;:18;;35244:1;;35227:18;:::i;:::-;;;;-1:-1:-1;;35256:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35256:21:0;-1:-1:-1;;;;;35256:21:0;;;;;;;;;35295:27;;35256:16;;35295:27;;;;;;;34752:578;;;:::o;77560:325::-;77623:13;77679:3;77649:21;77694:150;77718:8;:15;77714:1;:19;77694:150;;;77759:8;77768:1;77759:11;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;77759:11:0;-1:-1:-1;;;77759:19:0;77755:78;;;77813:4;77799:18;;:8;77808:1;77799:11;;;;;;;;:::i;:::-;;;;:18;-1:-1:-1;;;;;77799:18:0;;;;;;;;;77755:78;77735:3;;;;:::i;:::-;;;;77694:150;;;-1:-1:-1;77868:8:0;77560:325;-1:-1:-1;;77560:325:0:o;67589:3569::-;67677:369;;;;;;;;67697:3;67677:369;;67702:3;67677:369;;;;;;;;67707:3;67677:369;;;;67712:2;67638:13;67677:369;;;;;;;67716:2;67677:369;;;;67720:2;67677:369;;;;67724:2;67677:369;;;;67728:2;67677:369;;;;67732:2;67677:369;;;;67966:5;;67804:190;;67638:13;;67664:10;;67677:369;;;;68031:4;;67750:278;;67804:190;;67847:16;;67890:15;;67932:7;;67804:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;67804:190:0;;;;;;;;;;;;;67750:6;:278::i;:::-;:285;;;;:::i;:::-;67677:4;:369::i;:::-;68074:371;;;;;;;;68094:3;68074:371;;68099:3;68074:371;;;;;;;;68104:3;68074:371;;;;68109:3;68074:371;;;;68114:3;68074:371;;;;68119:2;68074:371;;;;68123:2;68074:371;;;;68127:2;68074:371;;;;68131:2;68074:371;;;;68365:5;;68203:190;;67664:382;;-1:-1:-1;68057:14:0;;68074:371;;68430:4;;68149:278;;68203:190;;68246:16;;68289:15;;68331:7;;68365:5;68203:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;68074:371:0;68470:375;;;;;;;;68490:3;68470:375;;68495:3;68470:375;;;;;;;;68500:3;68470:375;;;;68505:3;68470:375;;;;68510:3;68470:375;;;;68515:3;68470:375;;;;68520:3;68470:375;;;;68525:3;68470:375;;;;68530:3;68470:375;;;;68765:5;;68603:190;;68057:388;;-1:-1:-1;68456:11:0;;68470:375;;68830:4;;68549:278;;68603:190;;68646:16;;68689:15;;68731:7;;68765:5;68603:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;68470:375:0;68868:372;;;;;;;;68888:3;68868:372;;68893:3;68868:372;;;;;;;;68898:3;68868:372;;;;68903:3;68868:372;;;;68908:3;68868:372;;;;68913:3;68868:372;;;;68918:2;68868:372;;;;68922:2;68868:372;;;;68926:2;68868:372;;;;69160:5;;68998:190;;68456:389;;-1:-1:-1;68856:9:0;;68868:372;;69225:4;;68944:278;;68998:190;;69041:16;;69084:15;;69126:7;;69160:5;68998:190;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;68868:372:0;68856:384;;69251:13;69267:375;;;;;;;;;69287:3;69267:375;;;;;;69292:3;69267:375;;;;;;69297:3;69267:375;;;;;;69302:3;69267:375;;;;;;69307:3;69267:375;;;;;;69312:3;69267:375;;;;;;69317:3;69267:375;;;;;;69322:3;69267:375;;;;;;69327:3;69267:375;;;;;69627:4;69346:278;69443:16;69486:15;69528:7;69562:5;;69400:190;;;;;;;;;;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;69267:375:0;69669;;;;;;;;69689:3;69669:375;;69694:3;69669:375;;;;;;;;69699:3;69669:375;;;;69704:3;69669:375;;;;;;;;69709:3;69669:375;;;;;;;;;;;;;;;69719:3;69669:375;;;;69724:3;69669:375;;;;69729:3;69669:375;;;;69964:5;;69802:190;;69845:16;69802:190;;;20218:19:1;;;;69888:15:0;20253:12:1;;;20246:28;;;;20290:12;;;20283:28;;;20327:12;;20320:28;;;;69251:391:0;;-1:-1:-1;69653:13:0;;69669:375;;70029:4;;69748:278;;20364:13:1;69802:190:0;20005:378:1;69669:375:0;69653:391;;70055:16;70074:370;;;;;;;;;70094:3;70074:370;;;;;;70099:3;70074:370;;;;;;70104:3;70074:370;;;;;;70109:3;70074:370;;;;;;70114:2;70074:370;;;;;;70118:2;70074:370;;;;;;70122:2;70074:370;;;;;;70126:2;70074:370;;;;;;70130:2;70074:370;;;;;70429:4;70148:278;70245:16;70288:15;70330:7;70364:5;;70202:190;;;;;;;;;;20218:19:1;;;20262:2;20253:12;;20246:28;;;;20299:2;20290:12;;20283:28;20336:2;20327:12;;20320:28;20373:3;20364:13;;20005:378;70074:370:0;70055:389;;70617:1;70610:4;:8;;;:19;;70625:4;70610:19;;;70621:1;70610:19;70603:26;;70656:1;70648:5;:9;;;:21;;70664:5;70648:21;;;70660:1;70648:21;70640:29;;70682:15;70756:14;70765:4;70756:14;;:8;:14::i;:::-;70789:18;70798:8;70789:18;;:8;:18::i;:::-;70826:15;70835:5;70826:15;;:8;:15::i;:::-;70860:13;70869:3;70860:13;;:8;:13::i;:::-;70892:17;70901:7;70892:17;;:8;:17::i;:::-;70928;70937:7;70928:17;;:8;:17::i;:::-;70964:20;70973:10;70964:20;;:8;:20::i;:::-;70721:278;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70682:328;;71046:12;71059:1;71046:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;71042:90;;;71078:5;:7;;;:5;:7;;;:::i;:::-;;;;;;71107:13;71112:7;71107:4;:13::i;:::-;71100:20;67589:3569;-1:-1:-1;;;;;;;;;;67589:3569:0:o;71042:90::-;71149:1;67589:3569;-1:-1:-1;;;;;;;;;67589:3569:0:o;32450:110::-;32526:26;32536:2;32540:7;32526:26;;;;;;;;;;;;:9;:26::i;:::-;32450:110;;:::o;2956:173::-;3031:6;;;-1:-1:-1;;;;;3048:17:0;;;-1:-1:-1;;;;;;3048:17:0;;;;;;;3081:40;;3031:6;;;3048:17;3031:6;;3081:40;;3012:16;;3081:40;3001:128;2956:173;:::o;30838:315::-;30995:28;31005:4;31011:2;31015:7;30995:9;:28::i;:::-;31042:48;31065:4;31071:2;31075:7;31084:5;31042:22;:48::i;:::-;31034:111;;;;-1:-1:-1;;;31034:111:0;;;;;;;:::i;66429:1152::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66835:22:0;;;;:13;:22;;;;;66825:39;;66815:50;;66825:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66859:1;66862;66825:9;:39::i;:::-;66815:9;:50::i;:::-;66778:98;;;;:14;66948:22;;;:13;:22;;;;;66938:39;;66928:50;;66938:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66972:1;66975;66938:9;:39::i;66928:50::-;66887:102;;:18;;;;:102;;;;67058:22;;;;:13;:22;;;;;;67048:39;;67038:50;;67048:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67082:1;67085;67048:9;:39::i;67038:50::-;67000:99;;:15;;;;:99;;;;67166:22;;;;:13;:22;;;67156:39;;67146:50;;67156:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67190:1;67193;67156:9;:39::i;67146:50::-;67110:97;;:13;;;:97;67278:22;;;;:13;:22;;;;;67268:39;;67258:50;;67268:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67302:1;67305;67268:9;:39::i;67258:50::-;67218:101;;:17;;;:101;67390:22;;;;:13;:22;;;;;67380:39;;67370:50;;67380:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67414:1;67417;67380:9;:39::i;67370:50::-;67330:101;;:17;;;:101;67505:22;;;;:13;:22;;;;;67495:39;;67485:50;;67495:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67529:1;67532;67495:9;:39::i;67485:50::-;67442:104;;:20;;;:104;:9;66429:1152;-1:-1:-1;;66429:1152:0:o;77893:723::-;77949:13;78170:10;78166:53;;-1:-1:-1;;78197:10:0;;;;;;;;;;;;-1:-1:-1;;;78197:10:0;;;;;77893:723::o;78166:53::-;78244:5;78229:12;78285:78;78292:9;;78285:78;;78318:8;;;;:::i;:::-;;-1:-1:-1;78341:10:0;;-1:-1:-1;78349:2:0;78341:10;;:::i;:::-;;;78285:78;;;78373:19;78405:6;78395:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78395:17:0;;78373:39;;78423:154;78430:10;;78423:154;;78457:11;78467:1;78457:11;;:::i;:::-;;-1:-1:-1;78526:10:0;78534:2;78526:5;:10;:::i;:::-;78513:24;;:2;:24;:::i;:::-;78500:39;;78483:6;78490;78483:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;78483:56:0;;;;;;;;-1:-1:-1;78554:11:0;78563:2;78554:11;;:::i;:::-;;;78423:154;;62946:3475;63020:13;63205:342;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63205:342:0;;;;;;63532:9;:14;;;63205:342;;;;;;;;;:::i;:::-;;;;;;;;;;63634:395;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;-1:-1:-1;;;63634:395:0;;;;;;;;;;;;-1:-1:-1;;;63634:395:0;;;;-1:-1:-1;;;63634:395:0;;;;64010:18;;;;63205:342;;63634:395;;;;;;;;;;:::i;:::-;;;;;;;;;;64113:389;;;;;;;;;;;;;;;-1:-1:-1;;;64113:389:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64113:389:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64113:389:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64113:389:0;;;;-1:-1:-1;;;64113:389:0;;;;;;;;;;;-1:-1:-1;;;64113:389:0;;;;;;;-1:-1:-1;;;64113:389:0;;;;64486:15;;;63634:395;;64113:389;;;;;;;;;;:::i;:::-;;;;;64597:350;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64597:350:0;;;;;;64933:9;:13;;;64597:350;;;;;;;;;:::i;:::-;;;;;65033:410;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65033:410:0;;;;;;65425:9;:17;;;65033:410;;;;;;;;;:::i;:::-;;;;;65529:370;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65529:370:0;;;;;;65881:9;:17;;;65529:370;;;;;;;;;:::i;:::-;;;;;65988:391;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65988:391:0;;;;;;66358:9;:20;;;65988:391;;;;;;;;;:::i;:::-;;;;;63091:3307;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63046:3367;;62946:3475;;;:::o;75801:228::-;75909:4;76016:1;75998:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;75988:32;;;;;;75967:1;75949:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;75939:32;;;;;;:81;75931:90;;75801:228;;;;:::o;59077:583::-;59166:13;59192:20;59215:32;59228:9;59239:7;59215:12;:32::i;:::-;59192:55;;59258:22;59283:9;:17;;;:22;;59304:1;59283:22;:96;;;;;;;;;;;;;;;-1:-1:-1;;;59283:96:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59283:96:0;;;;59258:121;;59476:6;59579:8;59437:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59392:260;;;;59077:583;;;;:::o;46003:1774::-;46101:11;;46061:13;;46127:8;46123:23;;-1:-1:-1;;46137:9:0;;;;;;;;;-1:-1:-1;46137:9:0;;;46003:1774;-1:-1:-1;46003:1774:0:o;46123:23::-;46198:18;46236:1;46225:7;:3;46231:1;46225:7;:::i;:::-;46224:13;;;;:::i;:::-;46219:19;;:1;:19;:::i;:::-;46198:40;-1:-1:-1;46296:19:0;46328:15;46198:40;46341:2;46328:15;:::i;:::-;46318:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46318:26:0;;46296:48;;46355:18;46376:5;;;;;;;;;;;;;;;;;46355:26;;46445:1;46438:5;46434:13;46490:2;46482:6;46478:15;46539:1;46507:954;46562:3;46559:1;46556:10;46507:954;;;46617:1;46660:12;;;;;46654:19;46753:4;46741:2;46737:14;;;;;46719:40;;46713:47;46905:2;46901:14;;;46897:25;;46883:40;;46877:47;47095:1;47091:13;;;47087:24;;47073:39;;47067:46;47276:16;;;;47262:31;;47256:38;46789:1;46785:11;;;46926:4;46873:58;;;46821:129;46975:11;;47063:57;;;47011:128;;;;47164:11;;47252:49;;47200:120;47349:3;47345:13;47376:22;;47444:1;47429:17;;;;46610:9;46507:954;;;46511:44;47491:1;47486:3;47482:11;47512:1;47507:84;;;;47610:1;47605:82;;;;47475:212;;47507:84;-1:-1:-1;;;;;47540:17:0;;47533:43;47507:84;;47605:82;-1:-1:-1;;;;;47638:17:0;;47631:41;47475:212;-1:-1:-1;;;47701:26:0;;;47708:6;46003:1774;-1:-1:-1;;;;46003:1774:0:o;41270:589::-;-1:-1:-1;;;;;41476:18:0;;41472:187;;41511:40;41543:7;42686:10;:17;;42659:24;;;;:15;:24;;;;;:44;;;42714:24;;;;;;;;;;;;42582:164;41511:40;41472:187;;;41581:2;-1:-1:-1;;;;;41573:10:0;:4;-1:-1:-1;;;;;41573:10:0;;41569:90;;41600:47;41633:4;41639:7;41600:32;:47::i;:::-;-1:-1:-1;;;;;41673:16:0;;41669:183;;41706:45;41743:7;41706:36;:45::i;41669:183::-;41779:4;-1:-1:-1;;;;;41773:10:0;:2;-1:-1:-1;;;;;41773:10:0;;41769:83;;41800:40;41828:2;41832:7;41800:27;:40::i;75655:138::-;75715:7;75777:5;75760:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;75760:23:0;;;;;;;;;75750:34;;75760:23;75750:34;;;;;75655:138;-1:-1:-1;;75655:138:0:o;77228:255::-;77357:4;;77295:5;;;;77349:13;;77373:82;77385:1;77380;:6;77373:82;;77403:5;;;;:::i;:::-;;;;77436:1;77438:3;77436:6;;;;;;;;;:::i;:::-;;;;;77423:20;;77428:15;;77423:20;;:::i;:::-;;;77373:82;;;-1:-1:-1;77472:3:0;77228:255;-1:-1:-1;;;77228:255:0:o;32787:321::-;32917:18;32923:2;32927:7;32917:5;:18::i;:::-;32968:54;32999:1;33003:2;33007:7;33016:5;32968:22;:54::i;:::-;32946:154;;;;-1:-1:-1;;;32946:154:0;;;;;;;:::i;36187:799::-;36342:4;-1:-1:-1;;;;;36363:13:0;;14226:20;14274:8;36359:620;;36399:72;;-1:-1:-1;;;36399:72:0;;-1:-1:-1;;;;;36399:36:0;;;;;:72;;732:10;;36450:4;;36456:7;;36465:5;;36399:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36399:72:0;;;;;;;;-1:-1:-1;;36399:72:0;;;;;;;;;;;;:::i;:::-;;;36395:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36641:13:0;;36637:272;;36684:60;;-1:-1:-1;;;36684:60:0;;;;;;;:::i;36637:272::-;36859:6;36853:13;36844:6;36840:2;36836:15;36829:38;36395:529;-1:-1:-1;;;;;;36522:51:0;-1:-1:-1;;;36522:51:0;;-1:-1:-1;36515:58:0;;36359:620;-1:-1:-1;36963:4:0;36187:799;;;;;;:::o;76696:419::-;76829:13;76885:3;76855:21;76932;76943:10;76932:8;:21;:::i;:::-;76922:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76922:32:0;-1:-1:-1;76900:54:0;-1:-1:-1;76982:10:0;76965:111;76998:8;76994:1;:12;76965:111;;;77053:8;77062:1;77053:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;77053:11:0;77028:6;77035:14;77039:10;77035:1;:14;:::i;:::-;77028:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;77028:36:0;;;;;;;;-1:-1:-1;77008:3:0;;;;:::i;:::-;;;;76965:111;;;-1:-1:-1;77100:6:0;76696:419;-1:-1:-1;;;;;76696:419:0:o;76170:518::-;76229:7;76253:22;76268:1;76253:22;;;;;;;;;;;;;-1:-1:-1;;;76253:22:0;;;:14;:22::i;:::-;76249:36;;;-1:-1:-1;76284:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76249:36::-;76300:22;76315:1;76300:22;;;;;;;;;;;;;-1:-1:-1;;;76300:22:0;;;:14;:22::i;:::-;76296:36;;;-1:-1:-1;76331:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76296:36::-;76347:22;76362:1;76347:22;;;;;;;;;;;;;-1:-1:-1;;;76347:22:0;;;:14;:22::i;:::-;76343:36;;;-1:-1:-1;76378:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76343:36::-;76394:22;76409:1;76394:22;;;;;;;;;;;;;-1:-1:-1;;;76394:22:0;;;:14;:22::i;:::-;76390:36;;;-1:-1:-1;76425:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76390:36::-;76441:22;76456:1;76441:22;;;;;;;;;;;;;-1:-1:-1;;;76441:22:0;;;:14;:22::i;:::-;76437:36;;;-1:-1:-1;76472:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76437:36::-;76488:22;76503:1;76488:22;;;;;;;;;;;;;-1:-1:-1;;;76488:22:0;;;:14;:22::i;:::-;76484:36;;;-1:-1:-1;76519:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76484:36::-;76535:22;76550:1;76535:22;;;;;;;;;;;;;-1:-1:-1;;;76535:22:0;;;:14;:22::i;:::-;76531:36;;;-1:-1:-1;76566:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76531:36::-;76582:22;76597:1;76582:22;;;;;;;;;;;;;-1:-1:-1;;;76582:22:0;;;:14;:22::i;:::-;76578:36;;;-1:-1:-1;76613:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76578:36::-;76629:22;76644:1;76629:22;;;;;;;;;;;;;-1:-1:-1;;;76629:22:0;;;:14;:22::i;:::-;76625:36;;;-1:-1:-1;76660:1:0;;76170:518;-1:-1:-1;76170:518:0:o;76625:36::-;-1:-1:-1;76679:1:0;;76170:518;-1:-1:-1;76170:518:0:o;59668:1025::-;59998:5;;60013:18;;;;59998:34;;-1:-1:-1;;;59998:34:0;;27672:4:1;27660:17;;;59998:34:0;;;27642:36:1;59758:13:0;;59784:15;;-1:-1:-1;;;;;59998:5:0;;;;:14;;27615:18:1;;59998:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59998:34:0;;;;;;;;;;;;:::i;:::-;60120:5;;60138:17;;;;60120:36;;-1:-1:-1;;;60120:36:0;;27672:4:1;27660:17;;;60120:36:0;;;27642::1;-1:-1:-1;;;;;60120:5:0;;;;:17;;27615:18:1;;60120:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60120:36:0;;;;;;;;;;;;:::i;:::-;60233:9;:17;;;:22;;60254:1;60233:22;:331;;60435:5;;60453:17;;;;60435:36;;-1:-1:-1;;;60435:36:0;;27672:4:1;27660:17;;;60435:36:0;;;27642::1;-1:-1:-1;;;;;60435:5:0;;;;:17;;27615:18:1;;60435:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60435:36:0;;;;;;;;;;;;:::i;:::-;60338:203;;;;;;;;:::i;:::-;;;;;;;;;;;;;60233:331;;;;;;;;;;;;;;;;60583:29;60593:9;60604:7;60583:9;:29::i;:::-;59823:832;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;59823:832:0;;;;;;;59668:1025;-1:-1:-1;;;;59668:1025:0:o;43373:988::-;43639:22;43689:1;43664:22;43681:4;43664:16;:22::i;:::-;:26;;;;:::i;:::-;43701:18;43722:26;;;:17;:26;;;;;;43639:51;;-1:-1:-1;43855:28:0;;;43851:328;;-1:-1:-1;;;;;43922:18:0;;43900:19;43922:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43973:30;;;;;;:44;;;44090:30;;:17;:30;;;;;:43;;;43851:328;-1:-1:-1;44275:26:0;;;;:17;:26;;;;;;;;44268:33;;;-1:-1:-1;;;;;44319:18:0;;;;;:12;:18;;;;;:34;;;;;;;44312:41;43373:988::o;44656:1079::-;44934:10;:17;44909:22;;44934:21;;44954:1;;44934:21;:::i;:::-;44966:18;44987:24;;;:15;:24;;;;;;45360:10;:26;;44909:46;;-1:-1:-1;44987:24:0;;44909:46;;45360:26;;;;;;:::i;:::-;;;;;;;;;45338:48;;45424:11;45399:10;45410;45399:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45504:28;;;:15;:28;;;;;;;:41;;;45676:24;;;;;45669:31;45711:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44727:1008;;;44656:1079;:::o;42160:221::-;42245:14;42262:20;42279:2;42262:16;:20::i;:::-;-1:-1:-1;;;;;42293:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42338:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42160:221:0:o;33444:382::-;-1:-1:-1;;;;;33524:16:0;;33516:61;;;;-1:-1:-1;;;33516:61:0;;31355:2:1;33516:61:0;;;31337:21:1;;;31374:18;;;31367:30;31433:34;31413:18;;;31406:62;31485:18;;33516:61:0;31153:356:1;33516:61:0;31531:4;31555:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31555:16:0;:30;33588:58;;;;-1:-1:-1;;;33588:58:0;;31716:2:1;33588:58:0;;;31698:21:1;31755:2;31735:18;;;31728:30;31794;31774:18;;;31767:58;31842:18;;33588:58:0;31514:352:1;33588:58:0;33659:45;33688:1;33692:2;33696:7;33659:20;:45::i;:::-;-1:-1:-1;;;;;33717:13:0;;;;;;:9;:13;;;;;:18;;33734:1;;33717:13;:18;;33734:1;;33717:18;:::i;:::-;;;;-1:-1:-1;;33746:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33746:21:0;-1:-1:-1;;;;;33746:21:0;;;;;;;;33785:33;;33746:16;;;33785:33;;33746:16;;33785:33;33444:382;;:::o;60701:2237::-;60788:13;60856:15;60874:9;:17;;;:22;;60895:1;60874:22;:98;;;;;;;;;;;;;;;-1:-1:-1;;;60874:98:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60874:98:0;;;;61005:5;;61021:15;;;;;61005:32;;-1:-1:-1;;;61005:32:0;;27672:4:1;27660:17;;;61005:32:0;;;27642:36:1;60856:116:0;;-1:-1:-1;60983:19:0;;-1:-1:-1;;;;;61005:5:0;;;;:15;;27615:18:1;;61005:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61005:32:0;;;;;;;;;;;;:::i;:::-;60983:54;;61048:15;61066:25;61081:5;61066:25;;;;;;;;;;;;:14;:25::i;:::-;:283;;61283:5;;61299:15;;;;;61283:32;;-1:-1:-1;;;61283:32:0;;27672:4:1;27660:17;;;61283:32:0;;;27642:36:1;61259:1:0;;-1:-1:-1;;;;;61283:5:0;;:15;;27615:18:1;;61283:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61283:32:0;;;;;;;;;;;;:::i;:::-;61150:184;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61066:283;;;;;;;;;;;;;;;;61048:301;-1:-1:-1;61408:15:0;61426:11;61436:1;61426:7;:11;:::i;:::-;:16;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61426:135:0;;;;61408:153;;61572:15;61602:9;:17;;;:22;;61623:1;61602:22;61598:1314;;;61789:5;;61804:20;;;;61789:36;;-1:-1:-1;;;61789:36:0;;27672:4:1;27660:17;;;61789:36:0;;;27642::1;-1:-1:-1;;;;;61789:5:0;;;;:14;;27615:18:1;;61789:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61789:36:0;;;;;;;;;;;;:::i;:::-;61880:17;61889:7;61880:8;:17::i;:::-;62016:5;;62031:14;;62016:30;;-1:-1:-1;;;62016:30:0;;27672:4:1;27660:17;;;62016:30:0;;;27642:36:1;-1:-1:-1;;;;;62016:5:0;;;;:14;;27615:18:1;;62016:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62016:30:0;;;;;;;;;;;;:::i;:::-;62118:1;61670:502;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61641:546;;61598:1314;;;62368:5;;62383:20;;;;62368:36;;-1:-1:-1;;;62368:36:0;;27672:4:1;27660:17;;;62368:36:0;;;27642::1;-1:-1:-1;;;;;62368:5:0;;;;:14;;27615:18:1;;62368:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62368:36:0;;;;;;;;;;;;:::i;:::-;62459:17;62468:7;62459:8;:17::i;:::-;62605:5;;62619:13;;;;62605:28;;-1:-1:-1;;;62605:28:0;;27672:4:1;27660:17;;;62605:28:0;;;27642:36:1;-1:-1:-1;;;;;62605:5:0;;;;:13;;27615:18:1;;62605:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62605:28:0;;;;;;;;;;;;:::i;:::-;62739:5;;62754:14;;62739:30;;-1:-1:-1;;;62739:30:0;;27672:4:1;27660:17;;;62739:30:0;;;27642:36:1;-1:-1:-1;;;;;62739:5:0;;;;:14;;27615:18:1;;62739:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62739:30:0;;;;;;;;;;;;:::i;:::-;62841:1;62865;62249:636;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62220:680;;61598:1314;62929:1;60701:2237;-1:-1:-1;;;;;;;60701:2237:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2710:127::-;2771:10;2766:3;2762:20;2759:1;2752:31;2802:4;2799:1;2792:15;2826:4;2823:1;2816:15;2842:275;2913:2;2907:9;2978:2;2959:13;;-1:-1:-1;;2955:27:1;2943:40;;3013:18;2998:34;;3034:22;;;2995:62;2992:88;;;3060:18;;:::i;:::-;3096:2;3089:22;2842:275;;-1:-1:-1;2842:275:1:o;3122:187::-;3171:4;3204:18;3196:6;3193:30;3190:56;;;3226:18;;:::i;:::-;-1:-1:-1;3292:2:1;3271:15;-1:-1:-1;;3267:29:1;3298:4;3263:40;;3122:187::o;3314:338::-;3379:5;3408:53;3424:36;3453:6;3424:36;:::i;:::-;3408:53;:::i;:::-;3399:62;;3484:6;3477:5;3470:21;3524:3;3515:6;3510:3;3506:16;3503:25;3500:45;;;3541:1;3538;3531:12;3500:45;3590:6;3585:3;3578:4;3571:5;3567:16;3554:43;3644:1;3637:4;3628:6;3621:5;3617:18;3613:29;3606:40;3314:338;;;;;:::o;3657:519::-;3735:6;3743;3796:2;3784:9;3775:7;3771:23;3767:32;3764:52;;;3812:1;3809;3802:12;3764:52;3848:9;3835:23;3825:33;;3909:2;3898:9;3894:18;3881:32;3936:18;3928:6;3925:30;3922:50;;;3968:1;3965;3958:12;3922:50;3991:22;;4044:4;4036:13;;4032:27;-1:-1:-1;4022:55:1;;4073:1;4070;4063:12;4022:55;4096:74;4162:7;4157:2;4144:16;4139:2;4135;4131:11;4096:74;:::i;:::-;4086:84;;;3657:519;;;;;:::o;4181:186::-;4240:6;4293:2;4281:9;4272:7;4268:23;4264:32;4261:52;;;4309:1;4306;4299:12;4261:52;4332:29;4351:9;4332:29;:::i;4372:347::-;4437:6;4445;4498:2;4486:9;4477:7;4473:23;4469:32;4466:52;;;4514:1;4511;4504:12;4466:52;4537:29;4556:9;4537:29;:::i;:::-;4527:39;;4616:2;4605:9;4601:18;4588:32;4663:5;4656:13;4649:21;4642:5;4639:32;4629:60;;4685:1;4682;4675:12;4629:60;4708:5;4698:15;;;4372:347;;;;;:::o;4724:667::-;4819:6;4827;4835;4843;4896:3;4884:9;4875:7;4871:23;4867:33;4864:53;;;4913:1;4910;4903:12;4864:53;4936:29;4955:9;4936:29;:::i;:::-;4926:39;;4984:38;5018:2;5007:9;5003:18;4984:38;:::i;:::-;4974:48;;5069:2;5058:9;5054:18;5041:32;5031:42;;5124:2;5113:9;5109:18;5096:32;5151:18;5143:6;5140:30;5137:50;;;5183:1;5180;5173:12;5137:50;5206:22;;5259:4;5251:13;;5247:27;-1:-1:-1;5237:55:1;;5288:1;5285;5278:12;5237:55;5311:74;5377:7;5372:2;5359:16;5354:2;5350;5346:11;5311:74;:::i;:::-;5301:84;;;4724:667;;;;;;;:::o;5396:260::-;5464:6;5472;5525:2;5513:9;5504:7;5500:23;5496:32;5493:52;;;5541:1;5538;5531:12;5493:52;5564:29;5583:9;5564:29;:::i;:::-;5554:39;;5612:38;5646:2;5635:9;5631:18;5612:38;:::i;:::-;5602:48;;5396:260;;;;;:::o;5846:380::-;5925:1;5921:12;;;;5968;;;5989:61;;6043:4;6035:6;6031:17;6021:27;;5989:61;6096:2;6088:6;6085:14;6065:18;6062:38;6059:161;;;6142:10;6137:3;6133:20;6130:1;6123:31;6177:4;6174:1;6167:15;6205:4;6202:1;6195:15;6059:161;;5846:380;;;:::o;7471:413::-;7673:2;7655:21;;;7712:2;7692:18;;;7685:30;7751:34;7746:2;7731:18;;7724:62;-1:-1:-1;;;7817:2:1;7802:18;;7795:47;7874:3;7859:19;;7471:413::o;7889:355::-;8091:2;8073:21;;;8130:2;8110:18;;;8103:30;8169:33;8164:2;8149:18;;8142:61;8235:2;8220:18;;7889:355::o;9010:185::-;9052:3;9090:5;9084:12;9105:52;9150:6;9145:3;9138:4;9131:5;9127:16;9105:52;:::i;:::-;9173:16;;;;;9010:185;-1:-1:-1;;9010:185:1:o;9200:276::-;9331:3;9369:6;9363:13;9385:53;9431:6;9426:3;9419:4;9411:6;9407:17;9385:53;:::i;:::-;9454:16;;;;;9200:276;-1:-1:-1;;9200:276:1:o;11121:127::-;11182:10;11177:3;11173:20;11170:1;11163:31;11213:4;11210:1;11203:15;11237:4;11234:1;11227:15;11253:128;11293:3;11324:1;11320:6;11317:1;11314:13;11311:39;;;11330:18;;:::i;:::-;-1:-1:-1;11366:9:1;;11253:128::o;11818:168::-;11858:7;11924:1;11920;11916:6;11912:14;11909:1;11906:21;11901:1;11894:9;11887:17;11883:45;11880:71;;;11931:18;;:::i;:::-;-1:-1:-1;11971:9:1;;11818:168::o;12342:135::-;12381:3;-1:-1:-1;;12402:17:1;;12399:43;;;12422:18;;:::i;:::-;-1:-1:-1;12469:1:1;12458:13;;12342:135::o;12482:127::-;12543:10;12538:3;12534:20;12531:1;12524:31;12574:4;12571:1;12564:15;12598:4;12595:1;12588:15;12614:120;12654:1;12680;12670:35;;12685:18;;:::i;:::-;-1:-1:-1;12719:9:1;;12614:120::o;12739:356::-;12941:2;12923:21;;;12960:18;;;12953:30;13019:34;13014:2;12999:18;;12992:62;13086:2;13071:18;;12739:356::o;13940:127::-;14001:10;13996:3;13992:20;13989:1;13982:31;14032:4;14029:1;14022:15;14056:4;14053:1;14046:15;15663:430;-1:-1:-1;;;15920:3:1;15913:26;15895:3;15968:6;15962:13;15984:62;16039:6;16034:2;16029:3;16025:12;16018:4;16010:6;16006:17;15984:62;:::i;:::-;16066:16;;;;16084:2;16062:25;;15663:430;-1:-1:-1;;15663:430:1:o;16098:1684::-;-1:-1:-1;;;16795:45:1;;16863:13;;16777:3;;16885:62;16863:13;16935:2;16926:12;;16919:4;16907:17;;16885:62;:::i;:::-;17007:13;;16966:16;;;;17029:63;17007:13;17078:2;17070:11;;17063:4;17051:17;;17029:63;:::i;:::-;17157:66;17152:2;17111:17;;;;17144:11;;;17137:87;-1:-1:-1;;;17248:2:1;17240:11;;17233:43;17301:13;;17323:63;17301:13;17372:2;17364:11;;17357:4;17345:17;;17323:63;:::i;:::-;17451:66;17446:2;17405:17;;;;17438:11;;;17431:87;-1:-1:-1;;;17542:2:1;17534:11;;17527:32;17584:13;;17606:63;17584:13;17655:2;17647:11;;17640:4;17628:17;;17606:63;:::i;:::-;-1:-1:-1;;;17729:2:1;17688:17;;;;17721:11;;;17714:35;17773:2;17765:11;;16098:1684;-1:-1:-1;;;;;;16098:1684:1:o;17787:448::-;18049:31;18044:3;18037:44;18019:3;18110:6;18104:13;18126:62;18181:6;18176:2;18171:3;18167:12;18160:4;18152:6;18148:17;18126:62;:::i;:::-;18208:16;;;;18226:2;18204:25;;17787:448;-1:-1:-1;;17787:448:1:o;19875:125::-;19915:4;19943:1;19940;19937:8;19934:34;;;19948:18;;:::i;:::-;-1:-1:-1;19985:9:1;;19875:125::o;20388:112::-;20420:1;20446;20436:35;;20451:18;;:::i;:::-;-1:-1:-1;20485:9:1;;20388:112::o;20505:1449::-;20924:3;20962:6;20956:13;20988:4;21001:51;21045:6;21040:3;21035:2;21027:6;21023:15;21001:51;:::i;:::-;21115:13;;21074:16;;;;21137:55;21115:13;21074:16;21159:15;;;21137:55;:::i;:::-;21259:13;;21214:20;;;21281:55;21259:13;21214:20;21303:15;;;21281:55;:::i;:::-;21403:13;;21358:20;;;21425:55;21403:13;21358:20;21447:15;;;21425:55;:::i;:::-;21547:13;;21502:20;;;21569:55;21547:13;21502:20;21591:15;;;21569:55;:::i;:::-;21691:13;;21646:20;;;21713:55;21691:13;21646:20;21735:15;;;21713:55;:::i;:::-;21835:13;;21790:20;;;21857:55;21835:13;21790:20;21879:15;;;21857:55;:::i;:::-;21928:20;;;;;20505:1449;-1:-1:-1;;;;;;;;;;20505:1449:1:o;21959:414::-;22161:2;22143:21;;;22200:2;22180:18;;;22173:30;22239:34;22234:2;22219:18;;22212:62;-1:-1:-1;;;22305:2:1;22290:18;;22283:48;22363:3;22348:19;;21959:414::o;23354:2275::-;24510:66;24505:3;24498:79;24616:38;24611:3;24607:48;24602:2;24597:3;24593:12;24586:70;24480:3;24685:6;24679:13;24701:60;24754:6;24749:2;24744:3;24740:12;24735:2;24727:6;24723:15;24701:60;:::i;:::-;24825:66;24820:2;24780:16;;;24812:11;;;24805:87;-1:-1:-1;;;24916:2:1;24908:11;;24901:47;24973:13;;24995:61;24973:13;25042:2;25034:11;;25029:2;25017:15;;24995:61;:::i;:::-;25121:66;25116:2;25075:17;;;;25108:11;;;25101:87;-1:-1:-1;;;25212:3:1;25204:12;;25197:42;25264:13;;25286:62;25264:13;25333:3;25325:12;;25320:2;25308:15;;25286:62;:::i;:::-;25364:259;25390:232;25420:201;25446:174;25476:143;25502:116;25532:85;25558:58;25611:3;25600:8;25596:2;25592:17;25588:27;22455:66;22443:79;;-1:-1:-1;;;22547:2:1;22538:12;;22531:64;22620:2;22611:12;;22378:251;25558:58;25550:6;25532:85;:::i;:::-;22711:66;22699:79;;-1:-1:-1;;;22803:2:1;22794:12;;22787:46;22858:2;22849:12;;22634:233;25502:116;25494:6;25476:143;:::i;:::-;22949:66;22937:79;;-1:-1:-1;;;23041:2:1;23032:12;;23025:46;23096:2;23087:12;;22872:233;25446:174;25438:6;25420:201;:::i;:::-;23187:66;23175:79;;-1:-1:-1;;;23279:2:1;23270:12;;23263:52;23340:2;23331:12;;23110:239;25390:232;25382:6;25364:259;:::i;:::-;25357:266;23354:2275;-1:-1:-1;;;;;;;;;;;23354:2275:1:o;25634:920::-;26015:3;26053:6;26047:13;26069:53;26115:6;26110:3;26103:4;26095:6;26091:17;26069:53;:::i;:::-;26153:6;26148:3;26144:16;26131:29;;26183:66;26176:5;26169:81;26293:36;26288:3;26284:46;26277:4;26270:5;26266:16;26259:72;26362:6;26356:13;26378:66;26435:8;26430:2;26423:5;26419:14;26412:4;26404:6;26400:17;26378:66;:::i;:::-;-1:-1:-1;;;26507:2:1;26463:20;;;;26499:11;;;26492:29;26545:2;26537:11;;25634:920;-1:-1:-1;;;;25634:920:1:o;26559:175::-;26596:3;26640:4;26633:5;26629:16;26669:4;26660:7;26657:17;26654:43;;;26677:18;;:::i;:::-;26726:1;26713:15;;26559:175;-1:-1:-1;;26559:175:1:o;26739:500::-;-1:-1:-1;;;;;27008:15:1;;;26990:34;;27060:15;;27055:2;27040:18;;27033:43;27107:2;27092:18;;27085:34;;;27155:3;27150:2;27135:18;;27128:31;;;26933:4;;27176:57;;27213:19;;27205:6;27176:57;:::i;:::-;27168:65;26739:500;-1:-1:-1;;;;;;26739:500:1:o;27244:249::-;27313:6;27366:2;27354:9;27345:7;27341:23;27337:32;27334:52;;;27382:1;27379;27372:12;27334:52;27414:9;27408:16;27433:30;27457:5;27433:30;:::i;27689:636::-;27769:6;27822:2;27810:9;27801:7;27797:23;27793:32;27790:52;;;27838:1;27835;27828:12;27790:52;27871:9;27865:16;27904:18;27896:6;27893:30;27890:50;;;27936:1;27933;27926:12;27890:50;27959:22;;28012:4;28004:13;;28000:27;-1:-1:-1;27990:55:1;;28041:1;28038;28031:12;27990:55;28070:2;28064:9;28095:49;28111:32;28140:2;28111:32;:::i;28095:49::-;28167:2;28160:5;28153:17;28207:7;28202:2;28197;28193;28189:11;28185:20;28182:33;28179:53;;;28228:1;28225;28218:12;28179:53;28241:54;28292:2;28287;28280:5;28276:14;28271:2;28267;28263:11;28241:54;:::i;:::-;28314:5;27689:636;-1:-1:-1;;;;;27689:636:1:o;28330:627::-;-1:-1:-1;;;28681:59:1;;28763:13;;28663:3;;28785:62;28763:13;28835:2;28826:12;;28819:4;28807:17;;28785:62;:::i;:::-;-1:-1:-1;;;28906:2:1;28866:16;;;;28898:11;;;28891:33;-1:-1:-1;28948:2:1;28940:11;;28330:627;-1:-1:-1;28330:627:1:o;29087:1929::-;29998:66;29993:3;29986:79;30095:66;30090:2;30085:3;30081:12;30074:88;30192:66;30187:2;30182:3;30178:12;30171:88;30289:25;30284:2;30279:3;30275:12;30268:47;29968:3;30344:6;30338:13;30360:61;30414:6;30408:3;30403;30399:13;30394:2;30386:6;30382:15;30360:61;:::i;:::-;-1:-1:-1;;;30480:3:1;30440:16;;;30472:12;;;30465:62;-1:-1:-1;;;30551:3:1;30543:12;;30536:37;30598:13;;30620:62;30598:13;30667:3;30659:12;;30654:2;30642:15;;30620:62;:::i;:::-;-1:-1:-1;;;30742:3:1;30701:17;;;;30734:12;;;30727:34;-1:-1:-1;;;30785:3:1;30777:12;;30770:30;30825:13;;30847:62;30825:13;30894:3;30886:12;;30881:2;30869:15;;30847:62;:::i;:::-;30925:85;30955:54;31004:3;30993:8;30989:2;30985:17;30981:27;30973:6;30955:54;:::i;:::-;-1:-1:-1;;;29027:22:1;;29074:1;29065:11;;28962:120;30925:85;30918:92;29087:1929;-1:-1:-1;;;;;;;;29087:1929:1:o;31021:127::-;31082:10;31077:3;31073:20;31070:1;31063:31;31113:4;31110:1;31103:15;31137:4;31134:1;31127:15;31871:710;32181:34;32176:3;32169:47;32255:28;32250:3;32246:38;32241:2;32236:3;32232:12;32225:60;32151:3;32314:6;32308:13;32330:60;32383:6;32378:2;32373:3;32369:12;32364:2;32356:6;32352:15;32330:60;:::i;:::-;32450:13;;32409:16;;;;32472:61;32450:13;32519:2;32511:11;;32506:2;32494:15;;32472:61;:::i;:::-;32553:17;32572:2;32549:26;;31871:710;-1:-1:-1;;;;31871:710:1:o;32891:2051::-;-1:-1:-1;;;33891:57:1;;-1:-1:-1;;;33973:2:1;33964:12;;33957:38;34018:13;;-1:-1:-1;;34040:62:1;34018:13;34090:2;34081:12;;34074:4;34062:17;;34040:62;:::i;:::-;-1:-1:-1;;;34161:2:1;34121:16;;;34153:11;;;34146:47;34218:13;;34240:63;34218:13;34289:2;34281:11;;34274:4;34262:17;;34240:63;:::i;:::-;-1:-1:-1;;;34363:2:1;34322:17;;;;34355:11;;;34348:65;34442:66;34437:2;34429:11;;34422:87;34534:13;;34556:63;34534:13;34605:2;34597:11;;34590:4;34578:17;;34556:63;:::i;:::-;34684:66;34679:2;34638:17;;;;34671:11;;;34664:87;34776:13;;34798:64;34776:13;34847:3;34839:12;;34832:4;34820:17;;34798:64;:::i;:::-;34878:58;34931:3;34920:8;34916:2;34912:17;34908:27;-1:-1:-1;;;32829:24:1;;32878:1;32869:11;;32764:122;35251:2200;-1:-1:-1;;;36448:57:1;;-1:-1:-1;;;36530:2:1;36521:12;;36514:38;36575:13;;-1:-1:-1;;36597:62:1;36575:13;36647:2;36638:12;;36631:4;36619:17;;36597:62;:::i;:::-;-1:-1:-1;;;36718:2:1;36678:16;;;36710:11;;;36703:47;36775:13;;36797:63;36775:13;36846:2;36838:11;;36831:4;36819:17;;36797:63;:::i;:::-;-1:-1:-1;;;36920:2:1;36879:17;;;;36912:11;;;36905:65;36999:66;36994:2;36986:11;;36979:87;-1:-1:-1;;;37090:2:1;37082:11;;37075:49;37149:13;;37171:63;37149:13;37220:2;37212:11;;37205:4;37193:17;;37171:63;:::i;:::-;37250:195;37276:168;37302:141;37332:110;37358:83;37383:57;37436:2;37425:8;37421:2;37417:17;37413:26;-1:-1:-1;;;35012:18:1;;35055:1;35046:11;;34947:116;37383:57;32658:66;32646:79;;32750:2;32741:12;;32586:173;37358:83;37350:6;37332:110;:::i;:::-;35145:66;35133:79;;35237:2;35228:12;;35068:178;37302:141;37294:6;37276:168;:::i
Swarm Source
ipfs://7afc78c6365ec8d517f56b7a18b569387ac64c8a466cca90c59d4f7dfdd949d1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,629.91 | 0.0075 | $19.72 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.