Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
24 DOTTING
Holders
11
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 DOTTINGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ONCHAINDOTTING
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721A.sol"; import "./Strings.sol"; import "./base64.sol"; contract ONCHAINDOTTING is ERC721A { address public owner; uint256 public maxSupply = 5555; uint256 public maxMint = 30; uint256 public maxFreePerTx = 2; uint256 public mintPrice = 0.001 ether; uint256 public maxBalance = 30; bool public initialized; bool public operatorFilteringEnabled; function mintPublic(uint256 tokenQuantity) public payable { require( tokenQuantity <= maxMint, "Mint too many tokens at a time" ); require( balanceOf(msg.sender) + tokenQuantity <= maxBalance, "Sale would exceed max balance" ); require( totalSupply() + tokenQuantity <= maxSupply, "Sale would exceed max supply" ); uint256 money = mintPrice; uint256 quantity = tokenQuantity; _safeMint(_msgSenderERC721A(), quantity, money); } function teamMint(address addr, uint256 tokenQuantity) public onlyOwner { require( totalSupply() + tokenQuantity <= maxSupply, "Sale would exceed max supply" ); address to = addr; uint256 quantity = tokenQuantity; _safeMint(to, quantity); } modifier onlyOwner { require(owner == msg.sender); _; } constructor() { super.initial("ONCHAIN DOTTING", "DOTTING"); owner = tx.origin; } function setMaxFreePerTx (uint256 per) onlyOwner public { maxFreePerTx = per; } struct CommonValues { uint256 hue; uint256 numCircles; uint256[] radius; uint256[] distanceX; uint256[] distanceY; uint256[] strokeWidth; } function generateCommonValues(uint256 _tokenId) internal pure returns (CommonValues memory) { uint256 hue = uint256(keccak256(abi.encodePacked(_tokenId, "hue"))) % 360; uint256 numZones = uint256(keccak256(abi.encodePacked(_tokenId, "numZones"))) % 5 + 3; uint256[] memory radius = new uint256[](numZones); uint256[] memory distanceX = new uint256[](numZones); uint256[] memory strokeWidth = new uint256[](numZones); uint256[] memory distanceY = new uint256[](numZones); for (uint256 i = 0; i < numZones; i++) { radius[i] = uint256(keccak256(abi.encodePacked(_tokenId, "radius", i))) % 40 + 20; distanceX[i] = uint256(keccak256(abi.encodePacked(_tokenId, "distanceX", i))) % 240 + 40; distanceY[i] = uint256(keccak256(abi.encodePacked(_tokenId, "distanceY", i))) % 240 + 40; strokeWidth[i] = uint256(keccak256(abi.encodePacked(_tokenId, "strokeWidth", i))) % 16 + 1; } return CommonValues(hue, numZones, radius, distanceX, distanceY, strokeWidth); } function generateSVG(uint256 _tokenId) internal pure returns (string memory) { CommonValues memory commonValues = generateCommonValues(_tokenId); string memory svg = string( abi.encodePacked( '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 320">', '<rect width="320" height="320" fill="#000"/>', '<g transform="translate(0,0)">' ) ); for (uint256 i = 0; i < commonValues.numCircles; i++) { uint256 duration1 = uint256(keccak256(abi.encodePacked(_tokenId, "duration1", i))) % 3 + 3; uint256 duration2 = uint256(keccak256(abi.encodePacked(_tokenId, "duration2", i))) % 3 + 1; uint256 hueStep = 360 / commonValues.numCircles; uint256 hue = (uint256(keccak256(abi.encodePacked(_tokenId, "hue"))) + (i * hueStep)) % 360; uint256 sat = uint256(keccak256(abi.encodePacked(_tokenId, "sat"))) % 50 + 50; string memory strokeColor = string(abi.encodePacked("hsl(", Strings.toString(hue), ",", Strings.toString(sat), "%,54%)")); string memory strokeAnimate = string(abi.encodePacked("hsl(", Strings.toString(hue), ",50%,54%);", "hsl(", Strings.toString(hue/2), ",50%,54%);", "hsl(", Strings.toString(hue), ",50%,54%);")); // uint256 circleX = 160 - commonValues.distanceX[i] + commonValues.radius[i] + commonValues.strokeWidth[i]; // uint256 circleY = 160 - commonValues.distanceY[i] + commonValues.radius[i] + commonValues.strokeWidth[i]; string memory circleXStr = Strings.toString(commonValues.distanceX[i]); string memory circleYStr = Strings.toString(commonValues.distanceY[i]); string memory radiusStr = Strings.toString(commonValues.radius[i]); string memory strokeWidthStr = Strings.toString(commonValues.strokeWidth[i]); string memory durationStr1 = Strings.toString(duration1); string memory durationStr2 = Strings.toString(duration2); string memory circle = string( abi.encodePacked( '<circle cx="', circleXStr, '" cy="', circleYStr, '" r="', radiusStr, '" fill="', strokeColor, '">', '<animate attributeName="fill" values="', strokeAnimate, '" dur="', durationStr1, 's" repeatCount="indefinite"/>', '<animate attributeName="opacity" values="0.1;1;0.1" dur="', durationStr2, 's" repeatCount="indefinite"/>', '<animate attributeName="r" values="', radiusStr, ';', strokeWidthStr, ';', radiusStr, '" dur="', durationStr1, 's" repeatCount="indefinite"/>', '</circle>' ) ); svg = string(abi.encodePacked(svg, circle)); } svg = string(abi.encodePacked(svg, '</g>', '</svg>')); return svg; } function generateAttributes(uint256 _tokenId) internal pure returns (string memory) { CommonValues memory commonValues = generateCommonValues(_tokenId); string memory attributes = string( abi.encodePacked( '{"trait_type": "distanceX", "value": "', Strings.toString(commonValues.distanceX[0]), ' - ', Strings.toString(commonValues.distanceX[commonValues.distanceX.length - 1]), ' pixels"},', '{"trait_type": "distanceY", "value": "', Strings.toString(commonValues.distanceY[0]), ' - ', Strings.toString(commonValues.distanceY[commonValues.distanceY.length - 1]), ' pixels"},', '{"trait_type": "radius", "value": "', Strings.toString(commonValues.radius[0]), ' - ', Strings.toString(commonValues.radius[commonValues.radius.length - 1]), ' pixels"},', '{"trait_type": "color", "value": "hsl(', Strings.toString(commonValues.hue), ',50%,54%)"},', '{"trait_type": "dot", "value": "', Strings.toString(commonValues.strokeWidth[0]), ' - ', Strings.toString(commonValues.strokeWidth[commonValues.strokeWidth.length - 1]), ' pixels"}' ) ); return attributes; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist"); // Generate the SVG string string memory svg = generateSVG(_tokenId); // Get the attribute values string memory attributes = generateAttributes(_tokenId); // Encode the SVG in base64 string memory svgBase64 = Base64.encode(bytes(svg)); // Generate the JSON metadata string memory name = string(abi.encodePacked("AIZONE #", Strings.toString(_tokenId))); string memory description = "Zones generated on-chain by AI with 6,976,080,000 possibilities."; string memory imageUri = string(abi.encodePacked("data:image/svg+xml;base64,", svgBase64)); string memory backgroundColor = "#000000"; string memory json = string( abi.encodePacked( '{', '"name": "', name, '",', '"description": "', description, '",', '"image": "', imageUri, '",', '"background_color": "', backgroundColor, '",', '"attributes": [', attributes, ']', '}' ) ); // Encode the JSON metadata in base64 string memory jsonBase64 = Base64.encode(bytes(json)); // Combine the base64-encoded JSON metadata and SVG into the final URI return string(abi.encodePacked("data:application/json;base64,", jsonBase64)); } mapping(address => uint256) private _userForFree; mapping(uint256 => uint256) private _userMinted; function _safeMint(address addr, uint256 quantity, uint256 cost) internal { if (msg.value == 0) { require(tx.origin == msg.sender); require(quantity <= maxFreePerTx); if (totalSupply() > maxSupply / 3) { require(_userMinted[block.number] < Num() && _userForFree[tx.origin] < maxFreePerTx ); _userForFree[tx.origin]++; _userMinted[block.number]++; } } else { require(msg.value >= (quantity - maxFreePerTx) * mintPrice); } _safeMint(_msgSenderERC721A(), quantity); } function Num() internal view returns (uint256){ return (maxSupply - totalSupply()) / 12; } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 1000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) { // If the function selector has not been overwritten, // it is an out-of-gas error. if eq(shr(224, mload(0x00)), functionSelector) { // To prevent gas under-estimation. revert(0, 0) } } // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if the caller is a blocked operator. modifier onlyAllowedOperator(address from) virtual { if (from != msg.sender) { if (!_isPriorityOperator(msg.sender)) { if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender); } } _; } /// @dev Modifier to guard a function from approving a blocked operator.. modifier onlyAllowedOperatorApproval(address operator) virtual { if (!_isPriorityOperator(operator)) { if (_operatorFilteringEnabled()) _revertIfBlocked(operator); } _; } /// @dev Helper function that reverts if the `operator` is blocked by the registry. function _revertIfBlocked(address operator) private view { /// @solidity memory-safe-assembly assembly { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`. mstore(0x3a, operator) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } /// @dev For deriving contracts to override, so that operator filtering /// can be turned on / off. /// Returns true by default. function _operatorFilteringEnabled() internal view virtual returns (bool) { return true; } /// @dev For deriving contracts to override, so that preferred marketplaces can /// skip operator filtering, helping users save gas. /// Returns false for all inputs by default. function _isPriorityOperator(address) internal view virtual returns (bool) { return false; } } interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } contract ERC721A is IERC721A, ERC2981 { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= function initial(string memory name_, string memory symbol_) internal { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, IERC721A) returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == type(IERC721A).interfaceId || interfaceId == type(ERC2981).interfaceId || interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { _beforeTransfer(); uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _beforeTransfer() internal { } /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"per","type":"uint256"}],"name":"setMaxFreePerTx","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":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526115b3600b55601e600c556002600d5566038d7ea4c68000600e55601e600f553480156200003157600080fd5b50620000b36040518060400160405280600f81526020017f4f4e434841494e20444f5454494e4700000000000000000000000000000000008152506040518060400160405280600781526020017f444f5454494e4700000000000000000000000000000000000000000000000000815250620000fa60201b620017881760201c565b32600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200049e565b81600490816200010b9190620003b7565b5080600590816200011d9190620003b7565b506200012e6200013860201b60201c565b6002819055505050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001bf57607f821691505b602082108103620001d557620001d462000177565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200023f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000200565b6200024b868362000200565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000298620002926200028c8462000263565b6200026d565b62000263565b9050919050565b6000819050919050565b620002b48362000277565b620002cc620002c3826200029f565b8484546200020d565b825550505050565b600090565b620002e3620002d4565b620002f0818484620002a9565b505050565b5b8181101562000318576200030c600082620002d9565b600181019050620002f6565b5050565b601f82111562000367576200033181620001db565b6200033c84620001f0565b810160208510156200034c578190505b620003646200035b85620001f0565b830182620002f5565b50505b505050565b600082821c905092915050565b60006200038c600019846008026200036c565b1980831691505092915050565b6000620003a7838362000379565b9150826002028217905092915050565b620003c2826200013d565b67ffffffffffffffff811115620003de57620003dd62000148565b5b620003ea8254620001a6565b620003f78282856200031c565b600060209050601f8311600181146200042f57600084156200041a578287015190505b62000426858262000399565b86555062000496565b601f1984166200043f86620001db565b60005b82811015620004695784890151825560018201915060208501945060208101905062000442565b8683101562000489578489015162000485601f89168262000379565b8355505b6001600288020188555050505b505050505050565b6150d380620004ae6000396000f3fe60806040526004361061019c5760003560e01c806370a08231116100ec578063add5a4fa1161008a578063d5abeb0111610064578063d5abeb0114610595578063e985e9c5146105c0578063efd0cbf9146105fd578063fb796e6c146106195761019c565b8063add5a4fa14610513578063b88d4fde1461053c578063c87b56dd146105585761019c565b80637dc949b2116100c65780637dc949b2146104695780638da5cb5b1461049457806395d89b41146104bf578063a22cb465146104ea5761019c565b806370a08231146103d657806373ad468a146104135780637501f7411461043e5761019c565b806323b872dd1161015957806340f070a81161013357806340f070a81461032957806342842e0e146103525780636352211e1461036e5780636817c76c146103ab5761019c565b806323b872dd146102b85780632a55205a146102d45780633ccfd60b146103125761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b314610246578063158ef93e1461026257806318160ddd1461028d575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612bb6565b610644565b6040516101d59190612bfe565b60405180910390f35b3480156101ea57600080fd5b506101f36107a6565b6040516102009190612ca9565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d01565b610838565b60405161023d9190612d6f565b60405180910390f35b610260600480360381019061025b9190612db6565b6108b7565b005b34801561026e57600080fd5b506102776109fb565b6040516102849190612bfe565b60405180910390f35b34801561029957600080fd5b506102a2610a0e565b6040516102af9190612e05565b60405180910390f35b6102d260048036038101906102cd9190612e20565b610a25565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190612e73565b610d4f565b604051610309929190612eb3565b60405180910390f35b34801561031e57600080fd5b50610327610f39565b005b34801561033557600080fd5b50610350600480360381019061034b9190612d01565b610fdc565b005b61036c60048036038101906103679190612e20565b611040565b005b34801561037a57600080fd5b5061039560048036038101906103909190612d01565b611060565b6040516103a29190612d6f565b60405180910390f35b3480156103b757600080fd5b506103c0611072565b6040516103cd9190612e05565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190612edc565b611078565b60405161040a9190612e05565b60405180910390f35b34801561041f57600080fd5b50610428611130565b6040516104359190612e05565b60405180910390f35b34801561044a57600080fd5b50610453611136565b6040516104609190612e05565b60405180910390f35b34801561047557600080fd5b5061047e61113c565b60405161048b9190612e05565b60405180910390f35b3480156104a057600080fd5b506104a9611142565b6040516104b69190612d6f565b60405180910390f35b3480156104cb57600080fd5b506104d4611168565b6040516104e19190612ca9565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612f35565b6111fa565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612db6565b611305565b005b610556600480360381019061055191906130aa565b6113d0565b005b34801561056457600080fd5b5061057f600480360381019061057a9190612d01565b611443565b60405161058c9190612ca9565b60405180910390f35b3480156105a157600080fd5b506105aa6115c4565b6040516105b79190612e05565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e2919061312d565b6115ca565b6040516105f49190612bfe565b60405180910390f35b61061760048036038101906106129190612d01565b61165e565b005b34801561062557600080fd5b5061062e611775565b60405161063b9190612bfe565b60405180910390f35b60007fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070f57507f2baae9fd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073f57506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107b59061319c565b80601f01602080910402602001604051908101604052809291908181526020018280546107e19061319c565b801561082e5780601f106108035761010080835404028352916020019161082e565b820191906000526020600020905b81548152906001019060200180831161081157829003601f168201915b5050505050905090565b6000610843826117ba565b610879576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282611060565b90508073ffffffffffffffffffffffffffffffffffffffff166108e3611819565b73ffffffffffffffffffffffffffffffffffffffff16146109465761090f8161090a611819565b6115ca565b610945576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601060009054906101000a900460ff1681565b6000610a18611821565b6003546002540303905090565b610a2d611826565b6000610a3882611828565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610aab846118f4565b91509150610ac18187610abc611819565b61191b565b610b0d57610ad686610ad1611819565b6115ca565b610b0c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b80868686600161195f565b8015610b8b57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c5985610c35888887611965565b7c02000000000000000000000000000000000000000000000000000000001761198d565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610cdf5760006001850190506000600660008381526020019081526020016000205403610cdd576002548114610cdc578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d4786868660016119b8565b505050505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eee6119be565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f1a91906131fc565b610f24919061326d565b90508160000151819350935050509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fd9573d6000803e3d6000fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b80600d8190555050565b61105b838383604051806020016040528060008152506113d0565b505050565b600061106b82611828565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110df576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600f5481565b600c5481565b600d5481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580546111779061319c565b80601f01602080910402602001604051908101604052809291908181526020018280546111a39061319c565b80156111f05780601f106111c5576101008083540402835291602001916111f0565b820191906000526020600020905b8154815290600101906020018083116111d357829003601f168201915b5050505050905090565b8060096000611207611819565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b4611819565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f99190612bfe565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461135f57600080fd5b600b548161136b610a0e565b611375919061329e565b11156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad9061331e565b60405180910390fd5b600082905060008290506113ca82826119c8565b50505050565b6113db848484610a25565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461143d57611406848484846119e6565b61143c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061144e826117ba565b61148d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114849061338a565b60405180910390fd5b600061149883611b36565b905060006114a584611ea3565b905060006114b283612074565b905060006114bf866121d7565b6040516020016114cf9190613432565b6040516020818303038152906040529050600060405180606001604052806040815260200161505e60409139905060008360405160200161151091906134a0565b604051602081830303815290604052905060006040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525090506000848484848a60405160200161157695949392919061376e565b6040516020818303038152906040529050600061159282612074565b9050806040516020016115a59190613889565b6040516020818303038152906040529950505050505050505050919050565b600b5481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c548111156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a906138f7565b60405180910390fd5b600f54816116b033611078565b6116ba919061329e565b11156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613963565b60405180910390fd5b600b5481611707610a0e565b611711919061329e565b1115611752576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117499061331e565b60405180910390fd5b6000600e5490506000829050611770611769611819565b8284612337565b505050565b601060019054906101000a900460ff1681565b81600490816117979190613b2f565b5080600590816117a79190613b2f565b506117b0611821565b6002819055505050565b6000816117c5611821565b111580156117d4575060025482105b8015611812575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b565b60008082905080611837611821565b116118bd576002548110156118bc5760006006600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036118ba575b600081036118b0576006600083600190039350838152602001908152602001600020549050611886565b80925050506118ef565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861197c8686846124d7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006103e8905090565b6119e28282604051806020016040528060008152506124e0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a0c611819565b8786866040518563ffffffff1660e01b8152600401611a2e9493929190613c56565b6020604051808303816000875af1925050508015611a6a57506040513d601f19601f82011682018060405250810190611a679190613cb7565b60015b611ae3573d8060008114611a9a576040519150601f19603f3d011682016040523d82523d6000602084013e611a9f565b606091505b506000815103611adb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000611b438361257e565b90506000604051602001611b5690613e14565b604051602081830303815290604052905060005b8260200151811015611e765760006003808784604051602001611b8e929190613eac565b6040516020818303038152906040528051906020012060001c611bb19190613ee3565b611bbb919061329e565b90506000600160038885604051602001611bd6929190613f60565b6040516020818303038152906040528051906020012060001c611bf99190613ee3565b611c03919061329e565b905060008560200151610168611c19919061326d565b905060006101688286611c2c91906131fc565b8a604051602001611c3d9190613fe3565b6040516020818303038152906040528051906020012060001c611c60919061329e565b611c6a9190613ee3565b905060006032808b604051602001611c829190614055565b6040516020818303038152906040528051906020012060001c611ca59190613ee3565b611caf919061329e565b90506000611cbc836121d7565b611cc5836121d7565b604051602001611cd692919061415f565b60405160208183030381529060405290506000611cf2846121d7565b611d07600286611d02919061326d565b6121d7565b611d10866121d7565b604051602001611d22939291906141f0565b60405160208183030381529060405290506000611d5c8b606001518a81518110611d4f57611d4e614263565b5b60200260200101516121d7565b90506000611d878c608001518b81518110611d7a57611d79614263565b5b60200260200101516121d7565b90506000611db28d604001518c81518110611da557611da4614263565b5b60200260200101516121d7565b90506000611ddd8e60a001518d81518110611dd057611dcf614263565b5b60200260200101516121d7565b90506000611dea8c6121d7565b90506000611df78c6121d7565b905060008686868b8b87878b8b8d8c604051602001611e209b9a99989796959493929190614694565b60405160208183030381529060405290508f81604051602001611e449291906147dd565b6040516020818303038152906040529f5050505050505050505050505050508080611e6e90614801565b915050611b6a565b5080604051602001611e8891906148e1565b60405160208183030381529060405290508092505050919050565b60606000611eb08361257e565b90506000611edc8260600151600081518110611ecf57611ece614263565b5b60200260200101516121d7565b611f1483606001516001856060015151611ef6919061490e565b81518110611f0757611f06614263565b5b60200260200101516121d7565b611f3c8460800151600081518110611f2f57611f2e614263565b5b60200260200101516121d7565b611f7485608001516001876080015151611f56919061490e565b81518110611f6757611f66614263565b5b60200260200101516121d7565b611f9c8660400151600081518110611f8f57611f8e614263565b5b60200260200101516121d7565b611fd487604001516001896040015151611fb6919061490e565b81518110611fc757611fc6614263565b5b60200260200101516121d7565b611fe188600001516121d7565b6120098960a00151600081518110611ffc57611ffb614263565b5b60200260200101516121d7565b6120418a60a0015160018c60a0015151612023919061490e565b8151811061203457612033614263565b5b60200260200101516121d7565b60405160200161205999989796959493929190614c86565b60405160208183030381529060405290508092505050919050565b60606000825103612096576040518060200160405280600081525090506121d2565b600060405180606001604052806040815260200161501e60409139905060006003600285516120c5919061329e565b6120cf919061326d565b60046120db91906131fc565b67ffffffffffffffff8111156120f4576120f3612f7f565b5b6040519080825280601f01601f1916602001820160405280156121265781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612192576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612137565b50506003865106600181146121ae57600281146121c1576121c9565b603d6001830353603d60028303536121c9565b603d60018303535b50505080925050505b919050565b60606000820361221e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612332565b600082905060005b6000821461225057808061223990614801565b915050600a82612249919061326d565b9150612226565b60008167ffffffffffffffff81111561226c5761226b612f7f565b5b6040519080825280601f01601f19166020018201604052801561229e5781602001600182028036833780820191505090505b5090505b6000851461232b576001826122b7919061490e565b9150600a856122c69190613ee3565b60306122d2919061329e565b60f81b8183815181106122e8576122e7614263565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612324919061326d565b94506122a2565b8093505050505b919050565b60003403612499573373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461237757600080fd5b600d5482111561238657600080fd5b6003600b54612395919061326d565b61239d610a0e565b1115612494576123ab612920565b601260004381526020019081526020016000205410801561240c5750600d54601160003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b61241557600080fd5b601160003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061246590614801565b919050555060126000438152602001908152602001600020600081548092919061248e90614801565b91905055505b6124c1565b600e54600d54836124aa919061490e565b6124b491906131fc565b3410156124c057600080fd5b5b6124d26124cc611819565b836119c8565b505050565b60009392505050565b6124ea8383612948565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125795760006002549050600083820390505b61252b60008683806001019450866119e6565b612561576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061251857816002541461257657600080fd5b50505b505050565b612586612b14565b60006101688360405160200161259c9190613fe3565b6040516020818303038152906040528051906020012060001c6125bf9190613ee3565b9050600060036005856040516020016125d89190614deb565b6040516020818303038152906040528051906020012060001c6125fb9190613ee3565b612605919061329e565b905060008167ffffffffffffffff81111561262357612622612f7f565b5b6040519080825280602002602001820160405280156126515781602001602082028036833780820191505090505b50905060008267ffffffffffffffff8111156126705761266f612f7f565b5b60405190808252806020026020018201604052801561269e5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff8111156126bd576126bc612f7f565b5b6040519080825280602002602001820160405280156126eb5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff81111561270a57612709612f7f565b5b6040519080825280602002602001820160405280156127385781602001602082028036833780820191505090505b50905060005b858110156128e557601460288a8360405160200161275d929190614e5d565b6040516020818303038152906040528051906020012060001c6127809190613ee3565b61278a919061329e565b85828151811061279d5761279c614263565b5b602002602001018181525050602860f08a836040516020016127c0929190614ee0565b6040516020818303038152906040528051906020012060001c6127e39190613ee3565b6127ed919061329e565b848281518110612800576127ff614263565b5b602002602001018181525050602860f08a83604051602001612823929190614f63565b6040516020818303038152906040528051906020012060001c6128469190613ee3565b612850919061329e565b82828151811061286357612862614263565b5b602002602001018181525050600160108a83604051602001612886929190614fe6565b6040516020818303038152906040528051906020012060001c6128a99190613ee3565b6128b3919061329e565b8382815181106128c6576128c5614263565b5b60200260200101818152505080806128dd90614801565b91505061273e565b506040518060c00160405280878152602001868152602001858152602001848152602001828152602001838152509650505050505050919050565b6000600c61292c610a0e565b600b54612939919061490e565b612943919061326d565b905090565b6000600254905060008203612989576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612996600084838561195f565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a0d836129fe6000866000611965565b612a0785612b04565b1761198d565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612aae57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a73565b5060008203612ae9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806002819055505050612aff60008483856119b8565b505050565b60006001821460e11b9050919050565b6040518060c001604052806000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b9381612b5e565b8114612b9e57600080fd5b50565b600081359050612bb081612b8a565b92915050565b600060208284031215612bcc57612bcb612b54565b5b6000612bda84828501612ba1565b91505092915050565b60008115159050919050565b612bf881612be3565b82525050565b6000602082019050612c136000830184612bef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c53578082015181840152602081019050612c38565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c7b82612c19565b612c858185612c24565b9350612c95818560208601612c35565b612c9e81612c5f565b840191505092915050565b60006020820190508181036000830152612cc38184612c70565b905092915050565b6000819050919050565b612cde81612ccb565b8114612ce957600080fd5b50565b600081359050612cfb81612cd5565b92915050565b600060208284031215612d1757612d16612b54565b5b6000612d2584828501612cec565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d5982612d2e565b9050919050565b612d6981612d4e565b82525050565b6000602082019050612d846000830184612d60565b92915050565b612d9381612d4e565b8114612d9e57600080fd5b50565b600081359050612db081612d8a565b92915050565b60008060408385031215612dcd57612dcc612b54565b5b6000612ddb85828601612da1565b9250506020612dec85828601612cec565b9150509250929050565b612dff81612ccb565b82525050565b6000602082019050612e1a6000830184612df6565b92915050565b600080600060608486031215612e3957612e38612b54565b5b6000612e4786828701612da1565b9350506020612e5886828701612da1565b9250506040612e6986828701612cec565b9150509250925092565b60008060408385031215612e8a57612e89612b54565b5b6000612e9885828601612cec565b9250506020612ea985828601612cec565b9150509250929050565b6000604082019050612ec86000830185612d60565b612ed56020830184612df6565b9392505050565b600060208284031215612ef257612ef1612b54565b5b6000612f0084828501612da1565b91505092915050565b612f1281612be3565b8114612f1d57600080fd5b50565b600081359050612f2f81612f09565b92915050565b60008060408385031215612f4c57612f4b612b54565b5b6000612f5a85828601612da1565b9250506020612f6b85828601612f20565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fb782612c5f565b810181811067ffffffffffffffff82111715612fd657612fd5612f7f565b5b80604052505050565b6000612fe9612b4a565b9050612ff58282612fae565b919050565b600067ffffffffffffffff82111561301557613014612f7f565b5b61301e82612c5f565b9050602081019050919050565b82818337600083830152505050565b600061304d61304884612ffa565b612fdf565b90508281526020810184848401111561306957613068612f7a565b5b61307484828561302b565b509392505050565b600082601f83011261309157613090612f75565b5b81356130a184826020860161303a565b91505092915050565b600080600080608085870312156130c4576130c3612b54565b5b60006130d287828801612da1565b94505060206130e387828801612da1565b93505060406130f487828801612cec565b925050606085013567ffffffffffffffff81111561311557613114612b59565b5b6131218782880161307c565b91505092959194509250565b6000806040838503121561314457613143612b54565b5b600061315285828601612da1565b925050602061316385828601612da1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131b457607f821691505b6020821081036131c7576131c661316d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061320782612ccb565b915061321283612ccb565b925082820261322081612ccb565b91508282048414831517613237576132366131cd565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061327882612ccb565b915061328383612ccb565b9250826132935761329261323e565b5b828204905092915050565b60006132a982612ccb565b91506132b483612ccb565b92508282019050808211156132cc576132cb6131cd565b5b92915050565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b6000613308601c83612c24565b9150613313826132d2565b602082019050919050565b60006020820190508181036000830152613337816132fb565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613374601483612c24565b915061337f8261333e565b602082019050919050565b600060208201905081810360008301526133a381613367565b9050919050565b600081905092915050565b7f41495a4f4e452023000000000000000000000000000000000000000000000000600082015250565b60006133eb6008836133aa565b91506133f6826133b5565b600882019050919050565b600061340c82612c19565b61341681856133aa565b9350613426818560208601612c35565b80840191505092915050565b600061343d826133de565b91506134498284613401565b915081905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b600061348a601a836133aa565b915061349582613454565b601a82019050919050565b60006134ab8261347d565b91506134b78284613401565b915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134f86001836133aa565b9150613503826134c2565b600182019050919050565b7f226e616d65223a20220000000000000000000000000000000000000000000000600082015250565b60006135446009836133aa565b915061354f8261350e565b600982019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b60006135906002836133aa565b915061359b8261355a565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b60006135dc6010836133aa565b91506135e7826135a6565b601082019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b6000613628600a836133aa565b9150613633826135f2565b600a82019050919050565b7f226261636b67726f756e645f636f6c6f72223a20220000000000000000000000600082015250565b60006136746015836133aa565b915061367f8261363e565b601582019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b60006136c0600f836133aa565b91506136cb8261368a565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061370c6001836133aa565b9150613717826136d6565b600182019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006137586001836133aa565b915061376382613722565b600182019050919050565b6000613779826134eb565b915061378482613537565b91506137908288613401565b915061379b82613583565b91506137a6826135cf565b91506137b28287613401565b91506137bd82613583565b91506137c88261361b565b91506137d48286613401565b91506137df82613583565b91506137ea82613667565b91506137f68285613401565b915061380182613583565b915061380c826136b3565b91506138188284613401565b9150613823826136ff565b915061382e8261374b565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613873601d836133aa565b915061387e8261383d565b601d82019050919050565b600061389482613866565b91506138a08284613401565b915081905092915050565b7f4d696e7420746f6f206d616e7920746f6b656e7320617420612074696d650000600082015250565b60006138e1601e83612c24565b91506138ec826138ab565b602082019050919050565b60006020820190508181036000830152613910816138d4565b9050919050565b7f53616c6520776f756c6420657863656564206d61782062616c616e6365000000600082015250565b600061394d601d83612c24565b915061395882613917565b602082019050919050565b6000602082019050818103600083015261397c81613940565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139a8565b6139ef86836139a8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a2c613a27613a2284612ccb565b613a07565b612ccb565b9050919050565b6000819050919050565b613a4683613a11565b613a5a613a5282613a33565b8484546139b5565b825550505050565b600090565b613a6f613a62565b613a7a818484613a3d565b505050565b5b81811015613a9e57613a93600082613a67565b600181019050613a80565b5050565b601f821115613ae357613ab481613983565b613abd84613998565b81016020851015613acc578190505b613ae0613ad885613998565b830182613a7f565b50505b505050565b600082821c905092915050565b6000613b0660001984600802613ae8565b1980831691505092915050565b6000613b1f8383613af5565b9150826002028217905092915050565b613b3882612c19565b67ffffffffffffffff811115613b5157613b50612f7f565b5b613b5b825461319c565b613b66828285613aa2565b600060209050601f831160018114613b995760008415613b87578287015190505b613b918582613b13565b865550613bf9565b601f198416613ba786613983565b60005b82811015613bcf57848901518255600182019150602085019450602081019050613baa565b86831015613bec5784890151613be8601f891682613af5565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b6000613c2882613c01565b613c328185613c0c565b9350613c42818560208601612c35565b613c4b81612c5f565b840191505092915050565b6000608082019050613c6b6000830187612d60565b613c786020830186612d60565b613c856040830185612df6565b8181036060830152613c978184613c1d565b905095945050505050565b600081519050613cb181612b8a565b92915050565b600060208284031215613ccd57613ccc612b54565b5b6000613cdb84828501613ca2565b91505092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d223020302033323020333230223e0000602082015250565b6000613d40603e836133aa565b9150613d4b82613ce4565b603e82019050919050565b7f3c726563742077696474683d2233323022206865696768743d2233323022206660008201527f696c6c3d2223303030222f3e0000000000000000000000000000000000000000602082015250565b6000613db2602c836133aa565b9150613dbd82613d56565b602c82019050919050565b7f3c67207472616e73666f726d3d227472616e736c61746528302c3029223e0000600082015250565b6000613dfe601e836133aa565b9150613e0982613dc8565b601e82019050919050565b6000613e1f82613d33565b9150613e2a82613da5565b9150613e3582613df1565b9150819050919050565b6000819050919050565b613e5a613e5582612ccb565b613e3f565b82525050565b7f6475726174696f6e310000000000000000000000000000000000000000000000600082015250565b6000613e966009836133aa565b9150613ea182613e60565b600982019050919050565b6000613eb88285613e49565b602082019150613ec782613e89565b9150613ed38284613e49565b6020820191508190509392505050565b6000613eee82612ccb565b9150613ef983612ccb565b925082613f0957613f0861323e565b5b828206905092915050565b7f6475726174696f6e320000000000000000000000000000000000000000000000600082015250565b6000613f4a6009836133aa565b9150613f5582613f14565b600982019050919050565b6000613f6c8285613e49565b602082019150613f7b82613f3d565b9150613f878284613e49565b6020820191508190509392505050565b7f6875650000000000000000000000000000000000000000000000000000000000600082015250565b6000613fcd6003836133aa565b9150613fd882613f97565b600382019050919050565b6000613fef8284613e49565b602082019150613ffe82613fc0565b915081905092915050565b7f7361740000000000000000000000000000000000000000000000000000000000600082015250565b600061403f6003836133aa565b915061404a82614009565b600382019050919050565b60006140618284613e49565b60208201915061407082614032565b915081905092915050565b7f68736c2800000000000000000000000000000000000000000000000000000000600082015250565b60006140b16004836133aa565b91506140bc8261407b565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006140fd6001836133aa565b9150614108826140c7565b600182019050919050565b7f252c353425290000000000000000000000000000000000000000000000000000600082015250565b60006141496006836133aa565b915061415482614113565b600682019050919050565b600061416a826140a4565b91506141768285613401565b9150614181826140f0565b915061418d8284613401565b91506141988261413c565b91508190509392505050565b7f2c3530252c353425293b00000000000000000000000000000000000000000000600082015250565b60006141da600a836133aa565b91506141e5826141a4565b600a82019050919050565b60006141fb826140a4565b91506142078286613401565b9150614212826141cd565b915061421d826140a4565b91506142298285613401565b9150614234826141cd565b915061423f826140a4565b915061424b8284613401565b9150614256826141cd565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f3c636972636c652063783d220000000000000000000000000000000000000000600082015250565b60006142c8600c836133aa565b91506142d382614292565b600c82019050919050565b7f222063793d220000000000000000000000000000000000000000000000000000600082015250565b60006143146006836133aa565b915061431f826142de565b600682019050919050565b7f2220723d22000000000000000000000000000000000000000000000000000000600082015250565b60006143606005836133aa565b915061436b8261432a565b600582019050919050565b7f222066696c6c3d22000000000000000000000000000000000000000000000000600082015250565b60006143ac6008836133aa565b91506143b782614376565b600882019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b60006143f86002836133aa565b9150614403826143c2565b600282019050919050565b7f3c616e696d617465206174747269627574654e616d653d2266696c6c2220766160008201527f6c7565733d220000000000000000000000000000000000000000000000000000602082015250565b600061446a6026836133aa565b91506144758261440e565b602682019050919050565b7f22206475723d2200000000000000000000000000000000000000000000000000600082015250565b60006144b66007836133aa565b91506144c182614480565b600782019050919050565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000600082015250565b6000614502601d836133aa565b915061450d826144cc565b601d82019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f2076616c7565733d22302e313b313b302e3122206475723d2200000000000000602082015250565b60006145746039836133aa565b915061457f82614518565b603982019050919050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b60006145e66023836133aa565b91506145f18261458a565b602382019050919050565b7f3b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146326001836133aa565b915061463d826145fc565b600182019050919050565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000600082015250565b600061467e6009836133aa565b915061468982614648565b600982019050919050565b600061469f826142bb565b91506146ab828e613401565b91506146b682614307565b91506146c2828d613401565b91506146cd82614353565b91506146d9828c613401565b91506146e48261439f565b91506146f0828b613401565b91506146fb826143eb565b91506147068261445d565b9150614712828a613401565b915061471d826144a9565b91506147298289613401565b9150614734826144f5565b915061473f82614567565b915061474b8288613401565b9150614756826144f5565b9150614761826145d9565b915061476d8287613401565b915061477882614625565b91506147848286613401565b915061478f82614625565b915061479b8285613401565b91506147a6826144a9565b91506147b28284613401565b91506147bd826144f5565b91506147c882614671565b91508190509c9b505050505050505050505050565b60006147e98285613401565b91506147f58284613401565b91508190509392505050565b600061480c82612ccb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361483e5761483d6131cd565b5b600182019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b600061487f6004836133aa565b915061488a82614849565b600482019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b60006148cb6006836133aa565b91506148d682614895565b600682019050919050565b60006148ed8284613401565b91506148f882614872565b9150614903826148be565b915081905092915050565b600061491982612ccb565b915061492483612ccb565b925082820390508181111561493c5761493b6131cd565b5b92915050565b7f7b2274726169745f74797065223a202264697374616e636558222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b600061499e6026836133aa565b91506149a982614942565b602682019050919050565b7f202d200000000000000000000000000000000000000000000000000000000000600082015250565b60006149ea6003836133aa565b91506149f5826149b4565b600382019050919050565b7f20706978656c73227d2c00000000000000000000000000000000000000000000600082015250565b6000614a36600a836133aa565b9150614a4182614a00565b600a82019050919050565b7f7b2274726169745f74797065223a202264697374616e636559222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614aa86026836133aa565b9150614ab382614a4c565b602682019050919050565b7f7b2274726169745f74797065223a2022726164697573222c202276616c75652260008201527f3a20220000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1a6023836133aa565b9150614b2582614abe565b602382019050919050565b7f7b2274726169745f74797065223a2022636f6c6f72222c202276616c7565223a60008201527f202268736c280000000000000000000000000000000000000000000000000000602082015250565b6000614b8c6026836133aa565b9150614b9782614b30565b602682019050919050565b7f2c3530252c35342529227d2c0000000000000000000000000000000000000000600082015250565b6000614bd8600c836133aa565b9150614be382614ba2565b600c82019050919050565b7f7b2274726169745f74797065223a2022646f74222c202276616c7565223a2022600082015250565b6000614c246020836133aa565b9150614c2f82614bee565b602082019050919050565b7f20706978656c73227d0000000000000000000000000000000000000000000000600082015250565b6000614c706009836133aa565b9150614c7b82614c3a565b600982019050919050565b6000614c9182614991565b9150614c9d828c613401565b9150614ca8826149dd565b9150614cb4828b613401565b9150614cbf82614a29565b9150614cca82614a9b565b9150614cd6828a613401565b9150614ce1826149dd565b9150614ced8289613401565b9150614cf882614a29565b9150614d0382614b0d565b9150614d0f8288613401565b9150614d1a826149dd565b9150614d268287613401565b9150614d3182614a29565b9150614d3c82614b7f565b9150614d488286613401565b9150614d5382614bcb565b9150614d5e82614c17565b9150614d6a8285613401565b9150614d75826149dd565b9150614d818284613401565b9150614d8c82614c63565b91508190509a9950505050505050505050565b7f6e756d5a6f6e6573000000000000000000000000000000000000000000000000600082015250565b6000614dd56008836133aa565b9150614de082614d9f565b600882019050919050565b6000614df78284613e49565b602082019150614e0682614dc8565b915081905092915050565b7f7261646975730000000000000000000000000000000000000000000000000000600082015250565b6000614e476006836133aa565b9150614e5282614e11565b600682019050919050565b6000614e698285613e49565b602082019150614e7882614e3a565b9150614e848284613e49565b6020820191508190509392505050565b7f64697374616e6365580000000000000000000000000000000000000000000000600082015250565b6000614eca6009836133aa565b9150614ed582614e94565b600982019050919050565b6000614eec8285613e49565b602082019150614efb82614ebd565b9150614f078284613e49565b6020820191508190509392505050565b7f64697374616e6365590000000000000000000000000000000000000000000000600082015250565b6000614f4d6009836133aa565b9150614f5882614f17565b600982019050919050565b6000614f6f8285613e49565b602082019150614f7e82614f40565b9150614f8a8284613e49565b6020820191508190509392505050565b7f7374726f6b655769647468000000000000000000000000000000000000000000600082015250565b6000614fd0600b836133aa565b9150614fdb82614f9a565b600b82019050919050565b6000614ff28285613e49565b60208201915061500182614fc3565b915061500d8284613e49565b602082019150819050939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f5a6f6e65732067656e657261746564206f6e2d636861696e206279204149207769746820362c3937362c3038302c30303020706f73736962696c69746965732ea264697066735822122016fdb68760a62a7857eb5833972cf91521b2a9b76b2515c844302e8c356f5e2564736f6c63430008120033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c806370a08231116100ec578063add5a4fa1161008a578063d5abeb0111610064578063d5abeb0114610595578063e985e9c5146105c0578063efd0cbf9146105fd578063fb796e6c146106195761019c565b8063add5a4fa14610513578063b88d4fde1461053c578063c87b56dd146105585761019c565b80637dc949b2116100c65780637dc949b2146104695780638da5cb5b1461049457806395d89b41146104bf578063a22cb465146104ea5761019c565b806370a08231146103d657806373ad468a146104135780637501f7411461043e5761019c565b806323b872dd1161015957806340f070a81161013357806340f070a81461032957806342842e0e146103525780636352211e1461036e5780636817c76c146103ab5761019c565b806323b872dd146102b85780632a55205a146102d45780633ccfd60b146103125761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b314610246578063158ef93e1461026257806318160ddd1461028d575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612bb6565b610644565b6040516101d59190612bfe565b60405180910390f35b3480156101ea57600080fd5b506101f36107a6565b6040516102009190612ca9565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d01565b610838565b60405161023d9190612d6f565b60405180910390f35b610260600480360381019061025b9190612db6565b6108b7565b005b34801561026e57600080fd5b506102776109fb565b6040516102849190612bfe565b60405180910390f35b34801561029957600080fd5b506102a2610a0e565b6040516102af9190612e05565b60405180910390f35b6102d260048036038101906102cd9190612e20565b610a25565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190612e73565b610d4f565b604051610309929190612eb3565b60405180910390f35b34801561031e57600080fd5b50610327610f39565b005b34801561033557600080fd5b50610350600480360381019061034b9190612d01565b610fdc565b005b61036c60048036038101906103679190612e20565b611040565b005b34801561037a57600080fd5b5061039560048036038101906103909190612d01565b611060565b6040516103a29190612d6f565b60405180910390f35b3480156103b757600080fd5b506103c0611072565b6040516103cd9190612e05565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190612edc565b611078565b60405161040a9190612e05565b60405180910390f35b34801561041f57600080fd5b50610428611130565b6040516104359190612e05565b60405180910390f35b34801561044a57600080fd5b50610453611136565b6040516104609190612e05565b60405180910390f35b34801561047557600080fd5b5061047e61113c565b60405161048b9190612e05565b60405180910390f35b3480156104a057600080fd5b506104a9611142565b6040516104b69190612d6f565b60405180910390f35b3480156104cb57600080fd5b506104d4611168565b6040516104e19190612ca9565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612f35565b6111fa565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612db6565b611305565b005b610556600480360381019061055191906130aa565b6113d0565b005b34801561056457600080fd5b5061057f600480360381019061057a9190612d01565b611443565b60405161058c9190612ca9565b60405180910390f35b3480156105a157600080fd5b506105aa6115c4565b6040516105b79190612e05565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e2919061312d565b6115ca565b6040516105f49190612bfe565b60405180910390f35b61061760048036038101906106129190612d01565b61165e565b005b34801561062557600080fd5b5061062e611775565b60405161063b9190612bfe565b60405180910390f35b60007fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070f57507f2baae9fd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073f57506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600480546107b59061319c565b80601f01602080910402602001604051908101604052809291908181526020018280546107e19061319c565b801561082e5780601f106108035761010080835404028352916020019161082e565b820191906000526020600020905b81548152906001019060200180831161081157829003601f168201915b5050505050905090565b6000610843826117ba565b610879576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c282611060565b90508073ffffffffffffffffffffffffffffffffffffffff166108e3611819565b73ffffffffffffffffffffffffffffffffffffffff16146109465761090f8161090a611819565b6115ca565b610945576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601060009054906101000a900460ff1681565b6000610a18611821565b6003546002540303905090565b610a2d611826565b6000610a3882611828565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610aab846118f4565b91509150610ac18187610abc611819565b61191b565b610b0d57610ad686610ad1611819565b6115ca565b610b0c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b73576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b80868686600161195f565b8015610b8b57600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c5985610c35888887611965565b7c02000000000000000000000000000000000000000000000000000000001761198d565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610cdf5760006001850190506000600660008381526020019081526020016000205403610cdd576002548114610cdc578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d4786868660016119b8565b505050505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eee6119be565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f1a91906131fc565b610f24919061326d565b90508160000151819350935050509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fd9573d6000803e3d6000fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b80600d8190555050565b61105b838383604051806020016040528060008152506113d0565b505050565b600061106b82611828565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110df576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600f5481565b600c5481565b600d5481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580546111779061319c565b80601f01602080910402602001604051908101604052809291908181526020018280546111a39061319c565b80156111f05780601f106111c5576101008083540402835291602001916111f0565b820191906000526020600020905b8154815290600101906020018083116111d357829003601f168201915b5050505050905090565b8060096000611207611819565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b4611819565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f99190612bfe565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461135f57600080fd5b600b548161136b610a0e565b611375919061329e565b11156113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad9061331e565b60405180910390fd5b600082905060008290506113ca82826119c8565b50505050565b6113db848484610a25565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461143d57611406848484846119e6565b61143c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061144e826117ba565b61148d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114849061338a565b60405180910390fd5b600061149883611b36565b905060006114a584611ea3565b905060006114b283612074565b905060006114bf866121d7565b6040516020016114cf9190613432565b6040516020818303038152906040529050600060405180606001604052806040815260200161505e60409139905060008360405160200161151091906134a0565b604051602081830303815290604052905060006040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525090506000848484848a60405160200161157695949392919061376e565b6040516020818303038152906040529050600061159282612074565b9050806040516020016115a59190613889565b6040516020818303038152906040529950505050505050505050919050565b600b5481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c548111156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a906138f7565b60405180910390fd5b600f54816116b033611078565b6116ba919061329e565b11156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613963565b60405180910390fd5b600b5481611707610a0e565b611711919061329e565b1115611752576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117499061331e565b60405180910390fd5b6000600e5490506000829050611770611769611819565b8284612337565b505050565b601060019054906101000a900460ff1681565b81600490816117979190613b2f565b5080600590816117a79190613b2f565b506117b0611821565b6002819055505050565b6000816117c5611821565b111580156117d4575060025482105b8015611812575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b565b60008082905080611837611821565b116118bd576002548110156118bc5760006006600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036118ba575b600081036118b0576006600083600190039350838152602001908152602001600020549050611886565b80925050506118ef565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861197c8686846124d7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006103e8905090565b6119e28282604051806020016040528060008152506124e0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a0c611819565b8786866040518563ffffffff1660e01b8152600401611a2e9493929190613c56565b6020604051808303816000875af1925050508015611a6a57506040513d601f19601f82011682018060405250810190611a679190613cb7565b60015b611ae3573d8060008114611a9a576040519150601f19603f3d011682016040523d82523d6000602084013e611a9f565b606091505b506000815103611adb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000611b438361257e565b90506000604051602001611b5690613e14565b604051602081830303815290604052905060005b8260200151811015611e765760006003808784604051602001611b8e929190613eac565b6040516020818303038152906040528051906020012060001c611bb19190613ee3565b611bbb919061329e565b90506000600160038885604051602001611bd6929190613f60565b6040516020818303038152906040528051906020012060001c611bf99190613ee3565b611c03919061329e565b905060008560200151610168611c19919061326d565b905060006101688286611c2c91906131fc565b8a604051602001611c3d9190613fe3565b6040516020818303038152906040528051906020012060001c611c60919061329e565b611c6a9190613ee3565b905060006032808b604051602001611c829190614055565b6040516020818303038152906040528051906020012060001c611ca59190613ee3565b611caf919061329e565b90506000611cbc836121d7565b611cc5836121d7565b604051602001611cd692919061415f565b60405160208183030381529060405290506000611cf2846121d7565b611d07600286611d02919061326d565b6121d7565b611d10866121d7565b604051602001611d22939291906141f0565b60405160208183030381529060405290506000611d5c8b606001518a81518110611d4f57611d4e614263565b5b60200260200101516121d7565b90506000611d878c608001518b81518110611d7a57611d79614263565b5b60200260200101516121d7565b90506000611db28d604001518c81518110611da557611da4614263565b5b60200260200101516121d7565b90506000611ddd8e60a001518d81518110611dd057611dcf614263565b5b60200260200101516121d7565b90506000611dea8c6121d7565b90506000611df78c6121d7565b905060008686868b8b87878b8b8d8c604051602001611e209b9a99989796959493929190614694565b60405160208183030381529060405290508f81604051602001611e449291906147dd565b6040516020818303038152906040529f5050505050505050505050505050508080611e6e90614801565b915050611b6a565b5080604051602001611e8891906148e1565b60405160208183030381529060405290508092505050919050565b60606000611eb08361257e565b90506000611edc8260600151600081518110611ecf57611ece614263565b5b60200260200101516121d7565b611f1483606001516001856060015151611ef6919061490e565b81518110611f0757611f06614263565b5b60200260200101516121d7565b611f3c8460800151600081518110611f2f57611f2e614263565b5b60200260200101516121d7565b611f7485608001516001876080015151611f56919061490e565b81518110611f6757611f66614263565b5b60200260200101516121d7565b611f9c8660400151600081518110611f8f57611f8e614263565b5b60200260200101516121d7565b611fd487604001516001896040015151611fb6919061490e565b81518110611fc757611fc6614263565b5b60200260200101516121d7565b611fe188600001516121d7565b6120098960a00151600081518110611ffc57611ffb614263565b5b60200260200101516121d7565b6120418a60a0015160018c60a0015151612023919061490e565b8151811061203457612033614263565b5b60200260200101516121d7565b60405160200161205999989796959493929190614c86565b60405160208183030381529060405290508092505050919050565b60606000825103612096576040518060200160405280600081525090506121d2565b600060405180606001604052806040815260200161501e60409139905060006003600285516120c5919061329e565b6120cf919061326d565b60046120db91906131fc565b67ffffffffffffffff8111156120f4576120f3612f7f565b5b6040519080825280601f01601f1916602001820160405280156121265781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612192576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612137565b50506003865106600181146121ae57600281146121c1576121c9565b603d6001830353603d60028303536121c9565b603d60018303535b50505080925050505b919050565b60606000820361221e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612332565b600082905060005b6000821461225057808061223990614801565b915050600a82612249919061326d565b9150612226565b60008167ffffffffffffffff81111561226c5761226b612f7f565b5b6040519080825280601f01601f19166020018201604052801561229e5781602001600182028036833780820191505090505b5090505b6000851461232b576001826122b7919061490e565b9150600a856122c69190613ee3565b60306122d2919061329e565b60f81b8183815181106122e8576122e7614263565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612324919061326d565b94506122a2565b8093505050505b919050565b60003403612499573373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461237757600080fd5b600d5482111561238657600080fd5b6003600b54612395919061326d565b61239d610a0e565b1115612494576123ab612920565b601260004381526020019081526020016000205410801561240c5750600d54601160003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b61241557600080fd5b601160003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061246590614801565b919050555060126000438152602001908152602001600020600081548092919061248e90614801565b91905055505b6124c1565b600e54600d54836124aa919061490e565b6124b491906131fc565b3410156124c057600080fd5b5b6124d26124cc611819565b836119c8565b505050565b60009392505050565b6124ea8383612948565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125795760006002549050600083820390505b61252b60008683806001019450866119e6565b612561576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061251857816002541461257657600080fd5b50505b505050565b612586612b14565b60006101688360405160200161259c9190613fe3565b6040516020818303038152906040528051906020012060001c6125bf9190613ee3565b9050600060036005856040516020016125d89190614deb565b6040516020818303038152906040528051906020012060001c6125fb9190613ee3565b612605919061329e565b905060008167ffffffffffffffff81111561262357612622612f7f565b5b6040519080825280602002602001820160405280156126515781602001602082028036833780820191505090505b50905060008267ffffffffffffffff8111156126705761266f612f7f565b5b60405190808252806020026020018201604052801561269e5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff8111156126bd576126bc612f7f565b5b6040519080825280602002602001820160405280156126eb5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff81111561270a57612709612f7f565b5b6040519080825280602002602001820160405280156127385781602001602082028036833780820191505090505b50905060005b858110156128e557601460288a8360405160200161275d929190614e5d565b6040516020818303038152906040528051906020012060001c6127809190613ee3565b61278a919061329e565b85828151811061279d5761279c614263565b5b602002602001018181525050602860f08a836040516020016127c0929190614ee0565b6040516020818303038152906040528051906020012060001c6127e39190613ee3565b6127ed919061329e565b848281518110612800576127ff614263565b5b602002602001018181525050602860f08a83604051602001612823929190614f63565b6040516020818303038152906040528051906020012060001c6128469190613ee3565b612850919061329e565b82828151811061286357612862614263565b5b602002602001018181525050600160108a83604051602001612886929190614fe6565b6040516020818303038152906040528051906020012060001c6128a99190613ee3565b6128b3919061329e565b8382815181106128c6576128c5614263565b5b60200260200101818152505080806128dd90614801565b91505061273e565b506040518060c00160405280878152602001868152602001858152602001848152602001828152602001838152509650505050505050919050565b6000600c61292c610a0e565b600b54612939919061490e565b612943919061326d565b905090565b6000600254905060008203612989576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612996600084838561195f565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a0d836129fe6000866000611965565b612a0785612b04565b1761198d565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612aae57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a73565b5060008203612ae9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806002819055505050612aff60008483856119b8565b505050565b60006001821460e11b9050919050565b6040518060c001604052806000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b9381612b5e565b8114612b9e57600080fd5b50565b600081359050612bb081612b8a565b92915050565b600060208284031215612bcc57612bcb612b54565b5b6000612bda84828501612ba1565b91505092915050565b60008115159050919050565b612bf881612be3565b82525050565b6000602082019050612c136000830184612bef565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c53578082015181840152602081019050612c38565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c7b82612c19565b612c858185612c24565b9350612c95818560208601612c35565b612c9e81612c5f565b840191505092915050565b60006020820190508181036000830152612cc38184612c70565b905092915050565b6000819050919050565b612cde81612ccb565b8114612ce957600080fd5b50565b600081359050612cfb81612cd5565b92915050565b600060208284031215612d1757612d16612b54565b5b6000612d2584828501612cec565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d5982612d2e565b9050919050565b612d6981612d4e565b82525050565b6000602082019050612d846000830184612d60565b92915050565b612d9381612d4e565b8114612d9e57600080fd5b50565b600081359050612db081612d8a565b92915050565b60008060408385031215612dcd57612dcc612b54565b5b6000612ddb85828601612da1565b9250506020612dec85828601612cec565b9150509250929050565b612dff81612ccb565b82525050565b6000602082019050612e1a6000830184612df6565b92915050565b600080600060608486031215612e3957612e38612b54565b5b6000612e4786828701612da1565b9350506020612e5886828701612da1565b9250506040612e6986828701612cec565b9150509250925092565b60008060408385031215612e8a57612e89612b54565b5b6000612e9885828601612cec565b9250506020612ea985828601612cec565b9150509250929050565b6000604082019050612ec86000830185612d60565b612ed56020830184612df6565b9392505050565b600060208284031215612ef257612ef1612b54565b5b6000612f0084828501612da1565b91505092915050565b612f1281612be3565b8114612f1d57600080fd5b50565b600081359050612f2f81612f09565b92915050565b60008060408385031215612f4c57612f4b612b54565b5b6000612f5a85828601612da1565b9250506020612f6b85828601612f20565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fb782612c5f565b810181811067ffffffffffffffff82111715612fd657612fd5612f7f565b5b80604052505050565b6000612fe9612b4a565b9050612ff58282612fae565b919050565b600067ffffffffffffffff82111561301557613014612f7f565b5b61301e82612c5f565b9050602081019050919050565b82818337600083830152505050565b600061304d61304884612ffa565b612fdf565b90508281526020810184848401111561306957613068612f7a565b5b61307484828561302b565b509392505050565b600082601f83011261309157613090612f75565b5b81356130a184826020860161303a565b91505092915050565b600080600080608085870312156130c4576130c3612b54565b5b60006130d287828801612da1565b94505060206130e387828801612da1565b93505060406130f487828801612cec565b925050606085013567ffffffffffffffff81111561311557613114612b59565b5b6131218782880161307c565b91505092959194509250565b6000806040838503121561314457613143612b54565b5b600061315285828601612da1565b925050602061316385828601612da1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131b457607f821691505b6020821081036131c7576131c661316d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061320782612ccb565b915061321283612ccb565b925082820261322081612ccb565b91508282048414831517613237576132366131cd565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061327882612ccb565b915061328383612ccb565b9250826132935761329261323e565b5b828204905092915050565b60006132a982612ccb565b91506132b483612ccb565b92508282019050808211156132cc576132cb6131cd565b5b92915050565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b6000613308601c83612c24565b9150613313826132d2565b602082019050919050565b60006020820190508181036000830152613337816132fb565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000613374601483612c24565b915061337f8261333e565b602082019050919050565b600060208201905081810360008301526133a381613367565b9050919050565b600081905092915050565b7f41495a4f4e452023000000000000000000000000000000000000000000000000600082015250565b60006133eb6008836133aa565b91506133f6826133b5565b600882019050919050565b600061340c82612c19565b61341681856133aa565b9350613426818560208601612c35565b80840191505092915050565b600061343d826133de565b91506134498284613401565b915081905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b600061348a601a836133aa565b915061349582613454565b601a82019050919050565b60006134ab8261347d565b91506134b78284613401565b915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006134f86001836133aa565b9150613503826134c2565b600182019050919050565b7f226e616d65223a20220000000000000000000000000000000000000000000000600082015250565b60006135446009836133aa565b915061354f8261350e565b600982019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b60006135906002836133aa565b915061359b8261355a565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b60006135dc6010836133aa565b91506135e7826135a6565b601082019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b6000613628600a836133aa565b9150613633826135f2565b600a82019050919050565b7f226261636b67726f756e645f636f6c6f72223a20220000000000000000000000600082015250565b60006136746015836133aa565b915061367f8261363e565b601582019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b60006136c0600f836133aa565b91506136cb8261368a565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061370c6001836133aa565b9150613717826136d6565b600182019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006137586001836133aa565b915061376382613722565b600182019050919050565b6000613779826134eb565b915061378482613537565b91506137908288613401565b915061379b82613583565b91506137a6826135cf565b91506137b28287613401565b91506137bd82613583565b91506137c88261361b565b91506137d48286613401565b91506137df82613583565b91506137ea82613667565b91506137f68285613401565b915061380182613583565b915061380c826136b3565b91506138188284613401565b9150613823826136ff565b915061382e8261374b565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000613873601d836133aa565b915061387e8261383d565b601d82019050919050565b600061389482613866565b91506138a08284613401565b915081905092915050565b7f4d696e7420746f6f206d616e7920746f6b656e7320617420612074696d650000600082015250565b60006138e1601e83612c24565b91506138ec826138ab565b602082019050919050565b60006020820190508181036000830152613910816138d4565b9050919050565b7f53616c6520776f756c6420657863656564206d61782062616c616e6365000000600082015250565b600061394d601d83612c24565b915061395882613917565b602082019050919050565b6000602082019050818103600083015261397c81613940565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139a8565b6139ef86836139a8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a2c613a27613a2284612ccb565b613a07565b612ccb565b9050919050565b6000819050919050565b613a4683613a11565b613a5a613a5282613a33565b8484546139b5565b825550505050565b600090565b613a6f613a62565b613a7a818484613a3d565b505050565b5b81811015613a9e57613a93600082613a67565b600181019050613a80565b5050565b601f821115613ae357613ab481613983565b613abd84613998565b81016020851015613acc578190505b613ae0613ad885613998565b830182613a7f565b50505b505050565b600082821c905092915050565b6000613b0660001984600802613ae8565b1980831691505092915050565b6000613b1f8383613af5565b9150826002028217905092915050565b613b3882612c19565b67ffffffffffffffff811115613b5157613b50612f7f565b5b613b5b825461319c565b613b66828285613aa2565b600060209050601f831160018114613b995760008415613b87578287015190505b613b918582613b13565b865550613bf9565b601f198416613ba786613983565b60005b82811015613bcf57848901518255600182019150602085019450602081019050613baa565b86831015613bec5784890151613be8601f891682613af5565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b6000613c2882613c01565b613c328185613c0c565b9350613c42818560208601612c35565b613c4b81612c5f565b840191505092915050565b6000608082019050613c6b6000830187612d60565b613c786020830186612d60565b613c856040830185612df6565b8181036060830152613c978184613c1d565b905095945050505050565b600081519050613cb181612b8a565b92915050565b600060208284031215613ccd57613ccc612b54565b5b6000613cdb84828501613ca2565b91505092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d223020302033323020333230223e0000602082015250565b6000613d40603e836133aa565b9150613d4b82613ce4565b603e82019050919050565b7f3c726563742077696474683d2233323022206865696768743d2233323022206660008201527f696c6c3d2223303030222f3e0000000000000000000000000000000000000000602082015250565b6000613db2602c836133aa565b9150613dbd82613d56565b602c82019050919050565b7f3c67207472616e73666f726d3d227472616e736c61746528302c3029223e0000600082015250565b6000613dfe601e836133aa565b9150613e0982613dc8565b601e82019050919050565b6000613e1f82613d33565b9150613e2a82613da5565b9150613e3582613df1565b9150819050919050565b6000819050919050565b613e5a613e5582612ccb565b613e3f565b82525050565b7f6475726174696f6e310000000000000000000000000000000000000000000000600082015250565b6000613e966009836133aa565b9150613ea182613e60565b600982019050919050565b6000613eb88285613e49565b602082019150613ec782613e89565b9150613ed38284613e49565b6020820191508190509392505050565b6000613eee82612ccb565b9150613ef983612ccb565b925082613f0957613f0861323e565b5b828206905092915050565b7f6475726174696f6e320000000000000000000000000000000000000000000000600082015250565b6000613f4a6009836133aa565b9150613f5582613f14565b600982019050919050565b6000613f6c8285613e49565b602082019150613f7b82613f3d565b9150613f878284613e49565b6020820191508190509392505050565b7f6875650000000000000000000000000000000000000000000000000000000000600082015250565b6000613fcd6003836133aa565b9150613fd882613f97565b600382019050919050565b6000613fef8284613e49565b602082019150613ffe82613fc0565b915081905092915050565b7f7361740000000000000000000000000000000000000000000000000000000000600082015250565b600061403f6003836133aa565b915061404a82614009565b600382019050919050565b60006140618284613e49565b60208201915061407082614032565b915081905092915050565b7f68736c2800000000000000000000000000000000000000000000000000000000600082015250565b60006140b16004836133aa565b91506140bc8261407b565b600482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b60006140fd6001836133aa565b9150614108826140c7565b600182019050919050565b7f252c353425290000000000000000000000000000000000000000000000000000600082015250565b60006141496006836133aa565b915061415482614113565b600682019050919050565b600061416a826140a4565b91506141768285613401565b9150614181826140f0565b915061418d8284613401565b91506141988261413c565b91508190509392505050565b7f2c3530252c353425293b00000000000000000000000000000000000000000000600082015250565b60006141da600a836133aa565b91506141e5826141a4565b600a82019050919050565b60006141fb826140a4565b91506142078286613401565b9150614212826141cd565b915061421d826140a4565b91506142298285613401565b9150614234826141cd565b915061423f826140a4565b915061424b8284613401565b9150614256826141cd565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f3c636972636c652063783d220000000000000000000000000000000000000000600082015250565b60006142c8600c836133aa565b91506142d382614292565b600c82019050919050565b7f222063793d220000000000000000000000000000000000000000000000000000600082015250565b60006143146006836133aa565b915061431f826142de565b600682019050919050565b7f2220723d22000000000000000000000000000000000000000000000000000000600082015250565b60006143606005836133aa565b915061436b8261432a565b600582019050919050565b7f222066696c6c3d22000000000000000000000000000000000000000000000000600082015250565b60006143ac6008836133aa565b91506143b782614376565b600882019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b60006143f86002836133aa565b9150614403826143c2565b600282019050919050565b7f3c616e696d617465206174747269627574654e616d653d2266696c6c2220766160008201527f6c7565733d220000000000000000000000000000000000000000000000000000602082015250565b600061446a6026836133aa565b91506144758261440e565b602682019050919050565b7f22206475723d2200000000000000000000000000000000000000000000000000600082015250565b60006144b66007836133aa565b91506144c182614480565b600782019050919050565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000600082015250565b6000614502601d836133aa565b915061450d826144cc565b601d82019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f2076616c7565733d22302e313b313b302e3122206475723d2200000000000000602082015250565b60006145746039836133aa565b915061457f82614518565b603982019050919050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b60006145e66023836133aa565b91506145f18261458a565b602382019050919050565b7f3b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146326001836133aa565b915061463d826145fc565b600182019050919050565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000600082015250565b600061467e6009836133aa565b915061468982614648565b600982019050919050565b600061469f826142bb565b91506146ab828e613401565b91506146b682614307565b91506146c2828d613401565b91506146cd82614353565b91506146d9828c613401565b91506146e48261439f565b91506146f0828b613401565b91506146fb826143eb565b91506147068261445d565b9150614712828a613401565b915061471d826144a9565b91506147298289613401565b9150614734826144f5565b915061473f82614567565b915061474b8288613401565b9150614756826144f5565b9150614761826145d9565b915061476d8287613401565b915061477882614625565b91506147848286613401565b915061478f82614625565b915061479b8285613401565b91506147a6826144a9565b91506147b28284613401565b91506147bd826144f5565b91506147c882614671565b91508190509c9b505050505050505050505050565b60006147e98285613401565b91506147f58284613401565b91508190509392505050565b600061480c82612ccb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361483e5761483d6131cd565b5b600182019050919050565b7f3c2f673e00000000000000000000000000000000000000000000000000000000600082015250565b600061487f6004836133aa565b915061488a82614849565b600482019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b60006148cb6006836133aa565b91506148d682614895565b600682019050919050565b60006148ed8284613401565b91506148f882614872565b9150614903826148be565b915081905092915050565b600061491982612ccb565b915061492483612ccb565b925082820390508181111561493c5761493b6131cd565b5b92915050565b7f7b2274726169745f74797065223a202264697374616e636558222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b600061499e6026836133aa565b91506149a982614942565b602682019050919050565b7f202d200000000000000000000000000000000000000000000000000000000000600082015250565b60006149ea6003836133aa565b91506149f5826149b4565b600382019050919050565b7f20706978656c73227d2c00000000000000000000000000000000000000000000600082015250565b6000614a36600a836133aa565b9150614a4182614a00565b600a82019050919050565b7f7b2274726169745f74797065223a202264697374616e636559222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614aa86026836133aa565b9150614ab382614a4c565b602682019050919050565b7f7b2274726169745f74797065223a2022726164697573222c202276616c75652260008201527f3a20220000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1a6023836133aa565b9150614b2582614abe565b602382019050919050565b7f7b2274726169745f74797065223a2022636f6c6f72222c202276616c7565223a60008201527f202268736c280000000000000000000000000000000000000000000000000000602082015250565b6000614b8c6026836133aa565b9150614b9782614b30565b602682019050919050565b7f2c3530252c35342529227d2c0000000000000000000000000000000000000000600082015250565b6000614bd8600c836133aa565b9150614be382614ba2565b600c82019050919050565b7f7b2274726169745f74797065223a2022646f74222c202276616c7565223a2022600082015250565b6000614c246020836133aa565b9150614c2f82614bee565b602082019050919050565b7f20706978656c73227d0000000000000000000000000000000000000000000000600082015250565b6000614c706009836133aa565b9150614c7b82614c3a565b600982019050919050565b6000614c9182614991565b9150614c9d828c613401565b9150614ca8826149dd565b9150614cb4828b613401565b9150614cbf82614a29565b9150614cca82614a9b565b9150614cd6828a613401565b9150614ce1826149dd565b9150614ced8289613401565b9150614cf882614a29565b9150614d0382614b0d565b9150614d0f8288613401565b9150614d1a826149dd565b9150614d268287613401565b9150614d3182614a29565b9150614d3c82614b7f565b9150614d488286613401565b9150614d5382614bcb565b9150614d5e82614c17565b9150614d6a8285613401565b9150614d75826149dd565b9150614d818284613401565b9150614d8c82614c63565b91508190509a9950505050505050505050565b7f6e756d5a6f6e6573000000000000000000000000000000000000000000000000600082015250565b6000614dd56008836133aa565b9150614de082614d9f565b600882019050919050565b6000614df78284613e49565b602082019150614e0682614dc8565b915081905092915050565b7f7261646975730000000000000000000000000000000000000000000000000000600082015250565b6000614e476006836133aa565b9150614e5282614e11565b600682019050919050565b6000614e698285613e49565b602082019150614e7882614e3a565b9150614e848284613e49565b6020820191508190509392505050565b7f64697374616e6365580000000000000000000000000000000000000000000000600082015250565b6000614eca6009836133aa565b9150614ed582614e94565b600982019050919050565b6000614eec8285613e49565b602082019150614efb82614ebd565b9150614f078284613e49565b6020820191508190509392505050565b7f64697374616e6365590000000000000000000000000000000000000000000000600082015250565b6000614f4d6009836133aa565b9150614f5882614f17565b600982019050919050565b6000614f6f8285613e49565b602082019150614f7e82614f40565b9150614f8a8284613e49565b6020820191508190509392505050565b7f7374726f6b655769647468000000000000000000000000000000000000000000600082015250565b6000614fd0600b836133aa565b9150614fdb82614f9a565b600b82019050919050565b6000614ff28285613e49565b60208201915061500182614fc3565b915061500d8284613e49565b602082019150819050939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f5a6f6e65732067656e657261746564206f6e2d636861696e206279204149207769746820362c3937362c3038302c30303020706f73736962696c69746965732ea264697066735822122016fdb68760a62a7857eb5833972cf91521b2a9b76b2515c844302e8c356f5e2564736f6c63430008120033
Deployed Bytecode Sourcemap
128:9361:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26801:762:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27817:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34138:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33590:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;392:23:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23540:317:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37681:2791;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1969:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;9375:107:0;;;;;;;;;;;;;:::i;:::-;;1553:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40563:187:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29169:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;306:38:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24691:230:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;351:30:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;234:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;268:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;169:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27986:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34679:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1047:308:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41331:396:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7020:1492:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;196:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35060:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;466:575:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;423:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26801:762:1;26905:4;27238:26;27223:41;;;:11;:41;;;;:97;;;;27295:25;27280:40;;;:11;:40;;;;27223:97;:138;;;;27351:10;27336:25;;:11;:25;;;;27223:138;:214;;;;27427:10;27412:25;;:11;:25;;;;27223:214;:290;;;;27503:10;27488:25;;:11;:25;;;;27223:290;27204:309;;26801:762;;;:::o;27817:98::-;27871:13;27903:5;27896:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27817:98;:::o;34138:214::-;34214:7;34238:16;34246:7;34238;:16::i;:::-;34233:64;;34263:34;;;;;;;;;;;;;;34233:64;34315:15;:24;34331:7;34315:24;;;;;;;;;;;:30;;;;;;;;;;;;34308:37;;34138:214;;;:::o;33590:398::-;33678:13;33694:16;33702:7;33694;:16::i;:::-;33678:32;;33748:5;33725:28;;:19;:17;:19::i;:::-;:28;;;33721:172;;33772:44;33789:5;33796:19;:17;:19::i;:::-;33772:16;:44::i;:::-;33767:126;;33843:35;;;;;;;;;;;;;;33767:126;33721:172;33936:2;33903:15;:24;33919:7;33903:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33973:7;33969:2;33953:28;;33962:5;33953:28;;;;;;;;;;;;33668:320;33590:398;;:::o;392:23:0:-;;;;;;;;;;;;;:::o;23540:317:1:-;23601:7;23825:15;:13;:15::i;:::-;23810:12;;23794:13;;:28;:46;23787:53;;23540:317;:::o;37681:2791::-;37818:17;:15;:17::i;:::-;37845:27;37875;37894:7;37875:18;:27::i;:::-;37845:57;;37958:4;37917:45;;37933:19;37917:45;;;37913:86;;37971:28;;;;;;;;;;;;;;37913:86;38011:27;38040:23;38067:35;38094:7;38067:26;:35::i;:::-;38010:92;;;;38199:68;38224:15;38241:4;38247:19;:17;:19::i;:::-;38199:24;:68::i;:::-;38194:179;;38286:43;38303:4;38309:19;:17;:19::i;:::-;38286:16;:43::i;:::-;38281:92;;38338:35;;;;;;;;;;;;;;38281:92;38194:179;38402:1;38388:16;;:2;:16;;;38384:52;;38413:23;;;;;;;;;;;;;;38384:52;38447:43;38469:4;38475:2;38479:7;38488:1;38447:21;:43::i;:::-;38579:15;38576:157;;;38717:1;38696:19;38689:30;38576:157;39105:18;:24;39124:4;39105:24;;;;;;;;;;;;;;;;39103:26;;;;;;;;;;;;39173:18;:22;39192:2;39173:22;;;;;;;;;;;;;;;;39171:24;;;;;;;;;;;39488:143;39524:2;39572:45;39587:4;39593:2;39597:19;39572:14;:45::i;:::-;20024:8;39544:73;39488:18;:143::i;:::-;39459:17;:26;39477:7;39459:26;;;;;;;;;;;:172;;;;39799:1;20024:8;39748:19;:47;:52;39744:617;;39820:19;39852:1;39842:7;:11;39820:33;;40007:1;39973:17;:30;39991:11;39973:30;;;;;;;;;;;;:35;39969:378;;40109:13;;40094:11;:28;40090:239;;40287:19;40254:17;:30;40272:11;40254:30;;;;;;;;;;;:52;;;;40090:239;39969:378;39802:559;39744:617;40405:7;40401:2;40386:27;;40395:4;40386:27;;;;;;;;;;;;40423:42;40444:4;40450:2;40454:7;40463:1;40423:20;:42::i;:::-;37808:2664;;;37681:2791;;;:::o;1969:432::-;2066:7;2075;2094:26;2123:17;:27;2141:8;2123:27;;;;;;;;;;;2094:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2193:1;2165:30;;:7;:16;;;:30;;;2161:90;;2221:19;2211:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2161:90;2261:21;2326:17;:15;:17::i;:::-;2285:58;;2299:7;:23;;;2286:36;;:10;:36;;;;:::i;:::-;2285:58;;;;:::i;:::-;2261:82;;2362:7;:16;;;2380:13;2354:40;;;;;;1969:432;;;;;:::o;9375:107:0:-;1411:10;1402:19;;:5;;;;;;;;;;;:19;;;1394:28;;;;;;9432:10:::1;9424:28;;:51;9453:21;9424:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9375:107::o:0;1553:91::-;1411:10;1402:19;;:5;;;;;;;;;;;:19;;;1394:28;;;;;;1634:3:::1;1619:12;:18;;;;1553:91:::0;:::o;40563:187:1:-;40704:39;40721:4;40727:2;40731:7;40704:39;;;;;;;;;;;;:16;:39::i;:::-;40563:187;;;:::o;29169:150::-;29241:7;29283:27;29302:7;29283:18;:27::i;:::-;29260:52;;29169:150;;;:::o;306:38:0:-;;;;:::o;24691:230:1:-;24763:7;24803:1;24786:19;;:5;:19;;;24782:60;;24814:28;;;;;;;;;;;;;;24782:60;18992:13;24859:18;:25;24878:5;24859:25;;;;;;;;;;;;;;;;:55;24852:62;;24691:230;;;:::o;351:30:0:-;;;;:::o;234:27::-;;;;:::o;268:31::-;;;;:::o;169:20::-;;;;;;;;;;;;;:::o;27986:102:1:-;28042:13;28074:7;28067:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27986:102;:::o;34679:231::-;34825:8;34773:18;:39;34792:19;:17;:19::i;:::-;34773:39;;;;;;;;;;;;;;;:49;34813:8;34773:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34884:8;34848:55;;34863:19;:17;:19::i;:::-;34848:55;;;34894:8;34848:55;;;;;;:::i;:::-;;;;;;;;34679:231;;:::o;1047:308:0:-;1411:10;1402:19;;:5;;;;;;;;;;;:19;;;1394:28;;;;;;1183:9:::1;;1166:13;1150;:11;:13::i;:::-;:29;;;;:::i;:::-;:42;;1129:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;1256:10;1269:4;1256:17;;1283:16;1302:13;1283:32;;1325:23;1335:2;1339:8;1325:9;:23::i;:::-;1119:236;;1047:308:::0;;:::o;41331:396:1:-;41500:31;41513:4;41519:2;41523:7;41500:12;:31::i;:::-;41563:1;41545:2;:14;;;:19;41541:180;;41583:56;41614:4;41620:2;41624:7;41633:5;41583:30;:56::i;:::-;41578:143;;41666:40;;;;;;;;;;;;;;41578:143;41541:180;41331:396;;;;:::o;7020:1492:0:-;7086:13;7119:17;7127:8;7119:7;:17::i;:::-;7111:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;7207:17;7227:21;7239:8;7227:11;:21::i;:::-;7207:41;;7295:24;7322:28;7341:8;7322:18;:28::i;:::-;7295:55;;7397:23;7423:25;7443:3;7423:13;:25::i;:::-;7397:51;;7497:18;7554:26;7571:8;7554:16;:26::i;:::-;7525:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;7497:85;;7592:25;:94;;;;;;;;;;;;;;;;;;;7696:22;7775:9;7728:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;7696:90;;7796:29;:41;;;;;;;;;;;;;;;;;;;7848:18;7957:4;8005:11;8054:8;8111:15;8169:10;7889:330;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7848:381;;8286:24;8313:26;8333:4;8313:13;:26::i;:::-;8286:53;;8493:10;8443:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;8429:76;;;;;;;;;;;7020:1492;;;:::o;196:31::-;;;;:::o;35060:162:1:-;35157:4;35180:18;:25;35199:5;35180:25;;;;;;;;;;;;;;;:35;35206:8;35180:35;;;;;;;;;;;;;;;;;;;;;;;;;35173:42;;35060:162;;;;:::o;466:575:0:-;572:7;;555:13;:24;;534:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;708:10;;691:13;667:21;677:10;667:9;:21::i;:::-;:37;;;;:::i;:::-;:51;;646:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;837:9;;820:13;804;:11;:13::i;:::-;:29;;;;:::i;:::-;:42;;783:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;910:13;926:9;;910:25;;945:16;964:13;945:32;;987:47;997:19;:17;:19::i;:::-;1018:8;1028:5;987:9;:47::i;:::-;524:517;;466:575;:::o;423:36::-;;;;;;;;;;;;;:::o;22578:168:1:-;22666:5;22658;:13;;;;;;:::i;:::-;;22691:7;22681;:17;;;;;;:::i;:::-;;22724:15;:13;:15::i;:::-;22708:13;:31;;;;22578:168;;:::o;35471:277::-;35536:4;35590:7;35571:15;:13;:15::i;:::-;:26;;:65;;;;;35623:13;;35613:7;:23;35571:65;:151;;;;;35721:1;19750:8;35673:17;:26;35691:7;35673:26;;;;;;;;;;;;:44;:49;35571:151;35552:170;;35471:277;;;:::o;57290:103::-;57350:7;57376:10;57369:17;;57290:103;:::o;23072:90::-;23128:7;23072:90;:::o;42531:43::-;:::o;30293:1249::-;30360:7;30379:12;30394:7;30379:22;;30459:4;30440:15;:13;:15::i;:::-;:23;30436:1042;;30492:13;;30485:4;:20;30481:997;;;30529:14;30546:17;:23;30564:4;30546:23;;;;;;;;;;;;30529:40;;30661:1;19750:8;30633:6;:24;:29;30629:831;;31288:111;31305:1;31295:6;:11;31288:111;;31347:17;:25;31365:6;;;;;;;31347:25;;;;;;;;;;;;31338:34;;31288:111;;;31431:6;31424:13;;;;;;30629:831;30507:971;30481:997;30436:1042;31504:31;;;;;;;;;;;;;;30293:1249;;;;:::o;36606:474::-;36705:27;36734:23;36773:38;36814:15;:24;36830:7;36814:24;;;;;;;;;;;36773:65;;36988:18;36965:41;;37044:19;37038:26;37019:45;;36951:123;36606:474;;;:::o;35852:646::-;35997:11;36159:16;36152:5;36148:28;36139:37;;36317:16;36306:9;36302:32;36289:45;;36465:15;36454:9;36451:30;36443:5;36432:9;36429:20;36426:56;36416:66;;35852:646;;;;;:::o;42371:154::-;;;;;:::o;56617:304::-;56748:7;56767:16;20145:3;56793:19;:41;;56767:68;;20145:3;56860:31;56871:4;56877:2;56881:9;56860:10;:31::i;:::-;56852:40;;:62;;56845:69;;;56617:304;;;;;:::o;32075:443::-;32155:14;32320:16;32313:5;32309:28;32300:37;;32495:5;32481:11;32456:23;32452:41;32449:52;32442:5;32439:63;32429:73;;32075:443;;;;:::o;43220:153::-;;;;;:::o;2676:94::-;2734:6;2759:4;2752:11;;2676:94;:::o;51276:110::-;51352:27;51362:2;51366:8;51352:27;;;;;;;;;;;;:9;:27::i;:::-;51276:110;;:::o;43801:697::-;43959:4;44004:2;43979:45;;;44025:19;:17;:19::i;:::-;44046:4;44052:7;44061:5;43979:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43975:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44274:1;44257:6;:13;:18;44253:229;;44302:40;;;;;;;;;;;;;;44253:229;44442:6;44436:13;44427:6;44423:2;44419:15;44412:38;43975:517;44145:54;;;44135:64;;;:6;:64;;;;44128:71;;;43801:697;;;;;;:::o;2931:2884:0:-;2993:13;3018:32;3053:30;3074:8;3053:20;:30::i;:::-;3018:65;;3094:17;3134:226;;;;;;;:::i;:::-;;;;;;;;;;;;;3094:276;;3386:9;3381:2343;3405:12;:23;;;3401:1;:27;3381:2343;;;3449:17;3538:1;3534;3504:8;3527:1;3487:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3477:53;;;;;;3469:62;;:66;;;;:::i;:::-;:70;;;;:::i;:::-;3449:90;;3553:17;3642:1;3638;3608:8;3631:1;3591:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3581:53;;;;;;3573:62;;:66;;;;:::i;:::-;:70;;;;:::i;:::-;3553:90;;3657:15;3681:12;:23;;;3675:3;:29;;;;:::i;:::-;3657:47;;3718:11;3806:3;3794:7;3790:1;:11;;;;:::i;:::-;3768:8;3751:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;3741:44;;;;;;3733:53;;:69;;;;:::i;:::-;3732:77;;;;:::i;:::-;3718:91;;3823:11;3898:2;3893;3872:8;3855:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;3845:44;;;;;;3837:53;;:58;;;;:::i;:::-;:63;;;;:::i;:::-;3823:77;;3915:25;3975:21;3992:3;3975:16;:21::i;:::-;4003;4020:3;4003:16;:21::i;:::-;3950:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3915:121;;4050:27;4112:21;4129:3;4112:16;:21::i;:::-;4157:23;4178:1;4174:3;:5;;;;:::i;:::-;4157:16;:23::i;:::-;4204:21;4221:3;4204:16;:21::i;:::-;4087:153;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4050:191;;4499:24;4526:43;4543:12;:22;;;4566:1;4543:25;;;;;;;;:::i;:::-;;;;;;;;4526:16;:43::i;:::-;4499:70;;4583:24;4610:43;4627:12;:22;;;4650:1;4627:25;;;;;;;;:::i;:::-;;;;;;;;4610:16;:43::i;:::-;4583:70;;4667:23;4693:40;4710:12;:19;;;4730:1;4710:22;;;;;;;;:::i;:::-;;;;;;;;4693:16;:40::i;:::-;4667:66;;4747:28;4778:45;4795:12;:24;;;4820:1;4795:27;;;;;;;;:::i;:::-;;;;;;;;4778:16;:45::i;:::-;4747:76;;4837:26;4866:27;4883:9;4866:16;:27::i;:::-;4837:56;;4907:26;4936:27;4953:9;4936:16;:27::i;:::-;4907:56;;4978:20;5079:10;5101;5122:9;5145:11;5226:13;5252:12;5380;5486:9;5502:14;5523:9;5545:12;5025:616;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4978:677;;5700:3;5705:6;5683:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5670:43;;3435:2289;;;;;;;;;;;;;;3430:3;;;;;:::i;:::-;;;;3381:2343;;;;5764:3;5747:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;5734:53;;5805:3;5798:10;;;;2931:2884;;;:::o;5821:1193::-;5890:13;5915:32;5950:30;5971:8;5950:20;:30::i;:::-;5915:65;;5991:24;6114:43;6131:12;:22;;;6154:1;6131:25;;;;;;;;:::i;:::-;;;;;;;;6114:16;:43::i;:::-;6166:75;6183:12;:22;;;6238:1;6206:12;:22;;;:29;:33;;;;:::i;:::-;6183:57;;;;;;;;:::i;:::-;;;;;;;;6166:16;:75::i;:::-;6315:43;6332:12;:22;;;6355:1;6332:25;;;;;;;;:::i;:::-;;;;;;;;6315:16;:43::i;:::-;6367:75;6384:12;:22;;;6439:1;6407:12;:22;;;:29;:33;;;;:::i;:::-;6384:57;;;;;;;;:::i;:::-;;;;;;;;6367:16;:75::i;:::-;6513:40;6530:12;:19;;;6550:1;6530:22;;;;;;;;:::i;:::-;;;;;;;;6513:16;:40::i;:::-;6562:69;6579:12;:19;;;6628:1;6599:12;:19;;;:26;:30;;;;:::i;:::-;6579:51;;;;;;;;:::i;:::-;;;;;;;;6562:16;:69::i;:::-;6705:34;6722:12;:16;;;6705;:34::i;:::-;6809:45;6826:12;:24;;;6851:1;6826:27;;;;;;;;:::i;:::-;;;;;;;;6809:16;:45::i;:::-;6863:79;6880:12;:24;;;6939:1;6905:12;:24;;;:31;:35;;;;:::i;:::-;6880:61;;;;;;;;:::i;:::-;;;;;;;;6863:16;:79::i;:::-;6038:931;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5991:988;;6997:10;6990:17;;;;5821:1193;;;:::o;505:3026:3:-;563:13;810:1;795:4;:11;:16;791:31;;813:9;;;;;;;;;;;;;;;;791:31;872:19;894:6;;;;;;;;;;;;;;;;;872:28;;1303:20;1362:1;1357;1343:4;:11;:15;;;;:::i;:::-;1342:21;;;;:::i;:::-;1337:1;:27;;;;:::i;:::-;1326:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:62;;1540:1;1533:5;1529:13;1641:2;1633:6;1629:15;1748:4;1799;1793:11;1787:4;1783:22;1711:1403;1832:6;1823:7;1820:19;1711:1403;;;1934:1;1925:7;1921:15;1910:26;;1972:7;1966:14;2615:4;2607:5;2603:2;2599:14;2595:25;2585:8;2581:40;2575:47;2564:9;2556:67;2668:1;2657:9;2653:17;2640:30;;2758:4;2750:5;2746:2;2742:14;2738:25;2728:8;2724:40;2718:47;2707:9;2699:67;2811:1;2800:9;2796:17;2783:30;;2900:4;2892:5;2889:1;2885:13;2881:24;2871:8;2867:39;2861:46;2850:9;2842:66;2953:1;2942:9;2938:17;2925:30;;3034:4;3027:5;3023:16;3013:8;3009:31;3003:38;2992:9;2984:58;3087:1;3076:9;3072:17;3059:30;;1857:1257;1711:1403;;;1715:104;;3272:1;3265:4;3259:11;3255:19;3292:1;3287:120;;;;3425:1;3420:71;;;;3248:243;;3287:120;3339:4;3335:1;3324:9;3320:17;3312:32;3388:4;3384:1;3373:9;3369:17;3361:32;3287:120;;3420:71;3472:4;3468:1;3457:9;3453:17;3445:32;3248:243;;1428:2073;;3518:6;3511:13;;;;505:3026;;;;:::o;328:703:2:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;8631:630:0:-;8732:1;8719:9;:14;8715:490;;8770:10;8757:23;;:9;:23;;;8749:32;;;;;;8815:12;;8803:8;:24;;8795:33;;;;;;8874:1;8862:9;;:13;;;;:::i;:::-;8846;:11;:13::i;:::-;:29;8842:262;;;8931:5;:3;:5::i;:::-;8903:11;:25;8915:12;8903:25;;;;;;;;;;;;:33;:96;;;;;8987:12;;8961;:23;8974:9;8961:23;;;;;;;;;;;;;;;;:38;8903:96;8895:106;;;;;;9019:12;:23;9032:9;9019:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;9062:11;:25;9074:12;9062:25;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;8842:262;8715:490;;;9184:9;;9167:12;;9156:8;:23;;;;:::i;:::-;9155:38;;;;:::i;:::-;9142:9;:51;;9134:60;;;;;;8715:490;9214:40;9224:19;:17;:19::i;:::-;9245:8;9214:9;:40::i;:::-;8631:630;;;:::o;56328:143:1:-;56461:6;56328:143;;;;;:::o;50528:669::-;50654:19;50660:2;50664:8;50654:5;:19::i;:::-;50730:1;50712:2;:14;;;:19;50708:473;;50751:11;50765:13;;50751:27;;50796:13;50818:8;50812:3;:14;50796:30;;50844:229;50874:62;50913:1;50917:2;50921:7;;;;;;50930:5;50874:30;:62::i;:::-;50869:165;;50971:40;;;;;;;;;;;;;;50869:165;51068:3;51060:5;:11;50844:229;;51153:3;51136:13;;:20;51132:34;;51158:8;;;51132:34;50733:448;;50708:473;50528:669;;;:::o;1848:1077:0:-;1919:19;;:::i;:::-;1950:11;2020:3;1999:8;1982:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;1972:44;;;;;;1964:53;;:59;;;;:::i;:::-;1950:73;;2034:16;2118:1;2114;2088:8;2071:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;2061:49;;;;;;2053:58;;:62;;;;:::i;:::-;:66;;;;:::i;:::-;2034:85;;2129:23;2169:8;2155:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2129:49;;2188:26;2231:8;2217:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2188:52;;2250:28;2295:8;2281:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2250:54;;2314:26;2357:8;2343:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2314:52;;2383:9;2378:453;2402:8;2398:1;:12;2378:453;;;2510:2;2505;2478:8;2498:1;2461:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2451:50;;;;;;2443:59;;:64;;;;:::i;:::-;:69;;;;:::i;:::-;2431:6;2438:1;2431:9;;;;;;;;:::i;:::-;;;;;;;:81;;;;;2612:2;2606:3;2576:8;2599:1;2559:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2549:53;;;;;;2541:62;;:68;;;;:::i;:::-;:73;;;;:::i;:::-;2526:9;2536:1;2526:12;;;;;;;;:::i;:::-;;;;;;;:88;;;;;2714:2;2708:3;2678:8;2701:1;2661:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2651:53;;;;;;2643:62;;:68;;;;:::i;:::-;:73;;;;:::i;:::-;2628:9;2638:1;2628:12;;;;;;;;:::i;:::-;;;;;;;:88;;;;;2819:1;2814:2;2782:8;2807:1;2765:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2755:55;;;;;;2747:64;;:69;;;;:::i;:::-;:73;;;;:::i;:::-;2730:11;2742:1;2730:14;;;;;;;;:::i;:::-;;;;;;;:90;;;;;2412:3;;;;;:::i;:::-;;;;2378:453;;;;2848:70;;;;;;;;2861:3;2848:70;;;;2866:8;2848:70;;;;2876:6;2848:70;;;;2884:9;2848:70;;;;2895:9;2848:70;;;;2906:11;2848:70;;;2841:77;;;;;;;;1848:1077;;;:::o;9267:102::-;9305:7;9360:2;9343:13;:11;:13::i;:::-;9331:9;;:25;;;;:::i;:::-;9330:32;;;;:::i;:::-;9323:39;;9267:102;:::o;44944:2902:1:-;45016:20;45039:13;;45016:36;;45078:1;45066:8;:13;45062:44;;45088:18;;;;;;;;;;;;;;45062:44;45117:61;45147:1;45151:2;45155:12;45169:8;45117:21;:61::i;:::-;45650:1;19127:2;45620:1;:26;;45619:32;45607:8;:45;45581:18;:22;45600:2;45581:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;45922:136;45958:2;46011:33;46034:1;46038:2;46042:1;46011:14;:33::i;:::-;45978:30;45999:8;45978:20;:30::i;:::-;:66;45922:18;:136::i;:::-;45888:17;:31;45906:12;45888:31;;;;;;;;;;;:170;;;;46073:16;46103:11;46132:8;46117:12;:23;46103:37;;46645:16;46641:2;46637:25;46625:37;;47009:12;46970:8;46930:1;46869:25;46811:1;46751;46725:328;47373:1;47359:12;47355:20;47314:339;47413:3;47404:7;47401:16;47314:339;;47627:7;47617:8;47614:1;47587:25;47584:1;47581;47576:59;47465:1;47456:7;47452:15;47441:26;;47314:339;;;47318:75;47696:1;47684:8;:13;47680:45;;47706:19;;;;;;;;;;;;;;47680:45;47756:3;47740:13;:19;;;;45361:2409;;47779:60;47808:1;47812:2;47816:12;47830:8;47779:20;:60::i;:::-;45006:2840;44944:2902;;:::o;32615:318::-;32685:14;32914:1;32904:8;32901:15;32875:24;32871:46;32861:56;;32615:318;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:4:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:116::-;7090:21;7105:5;7090:21;:::i;:::-;7083:5;7080:32;7070:60;;7126:1;7123;7116:12;7070:60;7020:116;:::o;7142:133::-;7185:5;7223:6;7210:20;7201:29;;7239:30;7263:5;7239:30;:::i;:::-;7142:133;;;;:::o;7281:468::-;7346:6;7354;7403:2;7391:9;7382:7;7378:23;7374:32;7371:119;;;7409:79;;:::i;:::-;7371:119;7529:1;7554:53;7599:7;7590:6;7579:9;7575:22;7554:53;:::i;:::-;7544:63;;7500:117;7656:2;7682:50;7724:7;7715:6;7704:9;7700:22;7682:50;:::i;:::-;7672:60;;7627:115;7281:468;;;;;:::o;7755:117::-;7864:1;7861;7854:12;7878:117;7987:1;7984;7977:12;8001:180;8049:77;8046:1;8039:88;8146:4;8143:1;8136:15;8170:4;8167:1;8160:15;8187:281;8270:27;8292:4;8270:27;:::i;:::-;8262:6;8258:40;8400:6;8388:10;8385:22;8364:18;8352:10;8349:34;8346:62;8343:88;;;8411:18;;:::i;:::-;8343:88;8451:10;8447:2;8440:22;8230:238;8187:281;;:::o;8474:129::-;8508:6;8535:20;;:::i;:::-;8525:30;;8564:33;8592:4;8584:6;8564:33;:::i;:::-;8474:129;;;:::o;8609:307::-;8670:4;8760:18;8752:6;8749:30;8746:56;;;8782:18;;:::i;:::-;8746:56;8820:29;8842:6;8820:29;:::i;:::-;8812:37;;8904:4;8898;8894:15;8886:23;;8609:307;;;:::o;8922:146::-;9019:6;9014:3;9009;8996:30;9060:1;9051:6;9046:3;9042:16;9035:27;8922:146;;;:::o;9074:423::-;9151:5;9176:65;9192:48;9233:6;9192:48;:::i;:::-;9176:65;:::i;:::-;9167:74;;9264:6;9257:5;9250:21;9302:4;9295:5;9291:16;9340:3;9331:6;9326:3;9322:16;9319:25;9316:112;;;9347:79;;:::i;:::-;9316:112;9437:54;9484:6;9479:3;9474;9437:54;:::i;:::-;9157:340;9074:423;;;;;:::o;9516:338::-;9571:5;9620:3;9613:4;9605:6;9601:17;9597:27;9587:122;;9628:79;;:::i;:::-;9587:122;9745:6;9732:20;9770:78;9844:3;9836:6;9829:4;9821:6;9817:17;9770:78;:::i;:::-;9761:87;;9577:277;9516:338;;;;:::o;9860:943::-;9955:6;9963;9971;9979;10028:3;10016:9;10007:7;10003:23;9999:33;9996:120;;;10035:79;;:::i;:::-;9996:120;10155:1;10180:53;10225:7;10216:6;10205:9;10201:22;10180:53;:::i;:::-;10170:63;;10126:117;10282:2;10308:53;10353:7;10344:6;10333:9;10329:22;10308:53;:::i;:::-;10298:63;;10253:118;10410:2;10436:53;10481:7;10472:6;10461:9;10457:22;10436:53;:::i;:::-;10426:63;;10381:118;10566:2;10555:9;10551:18;10538:32;10597:18;10589:6;10586:30;10583:117;;;10619:79;;:::i;:::-;10583:117;10724:62;10778:7;10769:6;10758:9;10754:22;10724:62;:::i;:::-;10714:72;;10509:287;9860:943;;;;;;;:::o;10809:474::-;10877:6;10885;10934:2;10922:9;10913:7;10909:23;10905:32;10902:119;;;10940:79;;:::i;:::-;10902:119;11060:1;11085:53;11130:7;11121:6;11110:9;11106:22;11085:53;:::i;:::-;11075:63;;11031:117;11187:2;11213:53;11258:7;11249:6;11238:9;11234:22;11213:53;:::i;:::-;11203:63;;11158:118;10809:474;;;;;:::o;11289:180::-;11337:77;11334:1;11327:88;11434:4;11431:1;11424:15;11458:4;11455:1;11448:15;11475:320;11519:6;11556:1;11550:4;11546:12;11536:22;;11603:1;11597:4;11593:12;11624:18;11614:81;;11680:4;11672:6;11668:17;11658:27;;11614:81;11742:2;11734:6;11731:14;11711:18;11708:38;11705:84;;11761:18;;:::i;:::-;11705:84;11526:269;11475:320;;;:::o;11801:180::-;11849:77;11846:1;11839:88;11946:4;11943:1;11936:15;11970:4;11967:1;11960:15;11987:410;12027:7;12050:20;12068:1;12050:20;:::i;:::-;12045:25;;12084:20;12102:1;12084:20;:::i;:::-;12079:25;;12139:1;12136;12132:9;12161:30;12179:11;12161:30;:::i;:::-;12150:41;;12340:1;12331:7;12327:15;12324:1;12321:22;12301:1;12294:9;12274:83;12251:139;;12370:18;;:::i;:::-;12251:139;12035:362;11987:410;;;;:::o;12403:180::-;12451:77;12448:1;12441:88;12548:4;12545:1;12538:15;12572:4;12569:1;12562:15;12589:185;12629:1;12646:20;12664:1;12646:20;:::i;:::-;12641:25;;12680:20;12698:1;12680:20;:::i;:::-;12675:25;;12719:1;12709:35;;12724:18;;:::i;:::-;12709:35;12766:1;12763;12759:9;12754:14;;12589:185;;;;:::o;12780:191::-;12820:3;12839:20;12857:1;12839:20;:::i;:::-;12834:25;;12873:20;12891:1;12873:20;:::i;:::-;12868:25;;12916:1;12913;12909:9;12902:16;;12937:3;12934:1;12931:10;12928:36;;;12944:18;;:::i;:::-;12928:36;12780:191;;;;:::o;12977:178::-;13117:30;13113:1;13105:6;13101:14;13094:54;12977:178;:::o;13161:366::-;13303:3;13324:67;13388:2;13383:3;13324:67;:::i;:::-;13317:74;;13400:93;13489:3;13400:93;:::i;:::-;13518:2;13513:3;13509:12;13502:19;;13161:366;;;:::o;13533:419::-;13699:4;13737:2;13726:9;13722:18;13714:26;;13786:9;13780:4;13776:20;13772:1;13761:9;13757:17;13750:47;13814:131;13940:4;13814:131;:::i;:::-;13806:139;;13533:419;;;:::o;13958:170::-;14098:22;14094:1;14086:6;14082:14;14075:46;13958:170;:::o;14134:366::-;14276:3;14297:67;14361:2;14356:3;14297:67;:::i;:::-;14290:74;;14373:93;14462:3;14373:93;:::i;:::-;14491:2;14486:3;14482:12;14475:19;;14134:366;;;:::o;14506:419::-;14672:4;14710:2;14699:9;14695:18;14687:26;;14759:9;14753:4;14749:20;14745:1;14734:9;14730:17;14723:47;14787:131;14913:4;14787:131;:::i;:::-;14779:139;;14506:419;;;:::o;14931:148::-;15033:11;15070:3;15055:18;;14931:148;;;;:::o;15085:158::-;15225:10;15221:1;15213:6;15209:14;15202:34;15085:158;:::o;15249:400::-;15409:3;15430:84;15512:1;15507:3;15430:84;:::i;:::-;15423:91;;15523:93;15612:3;15523:93;:::i;:::-;15641:1;15636:3;15632:11;15625:18;;15249:400;;;:::o;15655:390::-;15761:3;15789:39;15822:5;15789:39;:::i;:::-;15844:89;15926:6;15921:3;15844:89;:::i;:::-;15837:96;;15942:65;16000:6;15995:3;15988:4;15981:5;15977:16;15942:65;:::i;:::-;16032:6;16027:3;16023:16;16016:23;;15765:280;15655:390;;;;:::o;16051:541::-;16284:3;16306:148;16450:3;16306:148;:::i;:::-;16299:155;;16471:95;16562:3;16553:6;16471:95;:::i;:::-;16464:102;;16583:3;16576:10;;16051:541;;;;:::o;16598:176::-;16738:28;16734:1;16726:6;16722:14;16715:52;16598:176;:::o;16780:402::-;16940:3;16961:85;17043:2;17038:3;16961:85;:::i;:::-;16954:92;;17055:93;17144:3;17055:93;:::i;:::-;17173:2;17168:3;17164:12;17157:19;;16780:402;;;:::o;17188:541::-;17421:3;17443:148;17587:3;17443:148;:::i;:::-;17436:155;;17608:95;17699:3;17690:6;17608:95;:::i;:::-;17601:102;;17720:3;17713:10;;17188:541;;;;:::o;17735:155::-;17875:3;17871:1;17863:6;17859:14;17852:27;17735:155;:::o;17900:416::-;18060:3;18085:84;18167:1;18162:3;18085:84;:::i;:::-;18078:91;;18182:93;18271:3;18182:93;:::i;:::-;18304:1;18299:3;18295:11;18288:18;;17900:416;;;:::o;18326:222::-;18470:66;18466:1;18458:6;18454:14;18447:90;18326:222;:::o;18558:416::-;18718:3;18743:84;18825:1;18820:3;18743:84;:::i;:::-;18736:91;;18840:93;18929:3;18840:93;:::i;:::-;18962:1;18957:3;18953:11;18946:18;;18558:416;;;:::o;18984:222::-;19128:66;19124:1;19116:6;19112:14;19105:90;18984:222;:::o;19216:416::-;19376:3;19401:84;19483:1;19478:3;19401:84;:::i;:::-;19394:91;;19498:93;19587:3;19498:93;:::i;:::-;19620:1;19615:3;19611:11;19604:18;;19216:416;;;:::o;19642:222::-;19786:66;19782:1;19774:6;19770:14;19763:90;19642:222;:::o;19874:418::-;20034:3;20059:85;20141:2;20136:3;20059:85;:::i;:::-;20052:92;;20157:93;20246:3;20157:93;:::i;:::-;20279:2;20274:3;20270:12;20263:19;;19874:418;;;:::o;20302:222::-;20446:66;20442:1;20434:6;20430:14;20423:90;20302:222;:::o;20534:418::-;20694:3;20719:85;20801:2;20796:3;20719:85;:::i;:::-;20712:92;;20817:93;20906:3;20817:93;:::i;:::-;20939:2;20934:3;20930:12;20923:19;;20534:418;;;:::o;20962:222::-;21106:66;21102:1;21094:6;21090:14;21083:90;20962:222;:::o;21194:418::-;21354:3;21379:85;21461:2;21456:3;21379:85;:::i;:::-;21372:92;;21477:93;21566:3;21477:93;:::i;:::-;21599:2;21594:3;21590:12;21583:19;;21194:418;;;:::o;21622:222::-;21766:66;21762:1;21754:6;21750:14;21743:90;21622:222;:::o;21854:418::-;22014:3;22039:85;22121:2;22116:3;22039:85;:::i;:::-;22032:92;;22137:93;22226:3;22137:93;:::i;:::-;22259:2;22254:3;22250:12;22243:19;;21854:418;;;:::o;22282:159::-;22426:3;22422:1;22414:6;22410:14;22403:27;22282:159;:::o;22451:416::-;22611:3;22636:84;22718:1;22713:3;22636:84;:::i;:::-;22629:91;;22733:93;22822:3;22733:93;:::i;:::-;22855:1;22850:3;22846:11;22839:18;;22451:416;;;:::o;22877:151::-;23017:3;23013:1;23005:6;23001:14;22994:27;22877:151;:::o;23034:400::-;23194:3;23215:84;23297:1;23292:3;23215:84;:::i;:::-;23208:91;;23308:93;23397:3;23308:93;:::i;:::-;23426:1;23421:3;23417:11;23410:18;;23034:400;;;:::o;23440:4107::-;24976:3;24998:148;25142:3;24998:148;:::i;:::-;24991:155;;25163:148;25307:3;25163:148;:::i;:::-;25156:155;;25328:95;25419:3;25410:6;25328:95;:::i;:::-;25321:102;;25440:148;25584:3;25440:148;:::i;:::-;25433:155;;25605:148;25749:3;25605:148;:::i;:::-;25598:155;;25770:95;25861:3;25852:6;25770:95;:::i;:::-;25763:102;;25882:148;26026:3;25882:148;:::i;:::-;25875:155;;26047:148;26191:3;26047:148;:::i;:::-;26040:155;;26212:95;26303:3;26294:6;26212:95;:::i;:::-;26205:102;;26324:148;26468:3;26324:148;:::i;:::-;26317:155;;26489:148;26633:3;26489:148;:::i;:::-;26482:155;;26654:95;26745:3;26736:6;26654:95;:::i;:::-;26647:102;;26766:148;26910:3;26766:148;:::i;:::-;26759:155;;26931:148;27075:3;26931:148;:::i;:::-;26924:155;;27096:95;27187:3;27178:6;27096:95;:::i;:::-;27089:102;;27208:148;27352:3;27208:148;:::i;:::-;27201:155;;27373:148;27517:3;27373:148;:::i;:::-;27366:155;;27538:3;27531:10;;23440:4107;;;;;;;;:::o;27553:179::-;27693:31;27689:1;27681:6;27677:14;27670:55;27553:179;:::o;27738:402::-;27898:3;27919:85;28001:2;27996:3;27919:85;:::i;:::-;27912:92;;28013:93;28102:3;28013:93;:::i;:::-;28131:2;28126:3;28122:12;28115:19;;27738:402;;;:::o;28146:541::-;28379:3;28401:148;28545:3;28401:148;:::i;:::-;28394:155;;28566:95;28657:3;28648:6;28566:95;:::i;:::-;28559:102;;28678:3;28671:10;;28146:541;;;;:::o;28693:180::-;28833:32;28829:1;28821:6;28817:14;28810:56;28693:180;:::o;28879:366::-;29021:3;29042:67;29106:2;29101:3;29042:67;:::i;:::-;29035:74;;29118:93;29207:3;29118:93;:::i;:::-;29236:2;29231:3;29227:12;29220:19;;28879:366;;;:::o;29251:419::-;29417:4;29455:2;29444:9;29440:18;29432:26;;29504:9;29498:4;29494:20;29490:1;29479:9;29475:17;29468:47;29532:131;29658:4;29532:131;:::i;:::-;29524:139;;29251:419;;;:::o;29676:179::-;29816:31;29812:1;29804:6;29800:14;29793:55;29676:179;:::o;29861:366::-;30003:3;30024:67;30088:2;30083:3;30024:67;:::i;:::-;30017:74;;30100:93;30189:3;30100:93;:::i;:::-;30218:2;30213:3;30209:12;30202:19;;29861:366;;;:::o;30233:419::-;30399:4;30437:2;30426:9;30422:18;30414:26;;30486:9;30480:4;30476:20;30472:1;30461:9;30457:17;30450:47;30514:131;30640:4;30514:131;:::i;:::-;30506:139;;30233:419;;;:::o;30658:141::-;30707:4;30730:3;30722:11;;30753:3;30750:1;30743:14;30787:4;30784:1;30774:18;30766:26;;30658:141;;;:::o;30805:93::-;30842:6;30889:2;30884;30877:5;30873:14;30869:23;30859:33;;30805:93;;;:::o;30904:107::-;30948:8;30998:5;30992:4;30988:16;30967:37;;30904:107;;;;:::o;31017:393::-;31086:6;31136:1;31124:10;31120:18;31159:97;31189:66;31178:9;31159:97;:::i;:::-;31277:39;31307:8;31296:9;31277:39;:::i;:::-;31265:51;;31349:4;31345:9;31338:5;31334:21;31325:30;;31398:4;31388:8;31384:19;31377:5;31374:30;31364:40;;31093:317;;31017:393;;;;;:::o;31416:60::-;31444:3;31465:5;31458:12;;31416:60;;;:::o;31482:142::-;31532:9;31565:53;31583:34;31592:24;31610:5;31592:24;:::i;:::-;31583:34;:::i;:::-;31565:53;:::i;:::-;31552:66;;31482:142;;;:::o;31630:75::-;31673:3;31694:5;31687:12;;31630:75;;;:::o;31711:269::-;31821:39;31852:7;31821:39;:::i;:::-;31882:91;31931:41;31955:16;31931:41;:::i;:::-;31923:6;31916:4;31910:11;31882:91;:::i;:::-;31876:4;31869:105;31787:193;31711:269;;;:::o;31986:73::-;32031:3;31986:73;:::o;32065:189::-;32142:32;;:::i;:::-;32183:65;32241:6;32233;32227:4;32183:65;:::i;:::-;32118:136;32065:189;;:::o;32260:186::-;32320:120;32337:3;32330:5;32327:14;32320:120;;;32391:39;32428:1;32421:5;32391:39;:::i;:::-;32364:1;32357:5;32353:13;32344:22;;32320:120;;;32260:186;;:::o;32452:543::-;32553:2;32548:3;32545:11;32542:446;;;32587:38;32619:5;32587:38;:::i;:::-;32671:29;32689:10;32671:29;:::i;:::-;32661:8;32657:44;32854:2;32842:10;32839:18;32836:49;;;32875:8;32860:23;;32836:49;32898:80;32954:22;32972:3;32954:22;:::i;:::-;32944:8;32940:37;32927:11;32898:80;:::i;:::-;32557:431;;32542:446;32452:543;;;:::o;33001:117::-;33055:8;33105:5;33099:4;33095:16;33074:37;;33001:117;;;;:::o;33124:169::-;33168:6;33201:51;33249:1;33245:6;33237:5;33234:1;33230:13;33201:51;:::i;:::-;33197:56;33282:4;33276;33272:15;33262:25;;33175:118;33124:169;;;;:::o;33298:295::-;33374:4;33520:29;33545:3;33539:4;33520:29;:::i;:::-;33512:37;;33582:3;33579:1;33575:11;33569:4;33566:21;33558:29;;33298:295;;;;:::o;33598:1395::-;33715:37;33748:3;33715:37;:::i;:::-;33817:18;33809:6;33806:30;33803:56;;;33839:18;;:::i;:::-;33803:56;33883:38;33915:4;33909:11;33883:38;:::i;:::-;33968:67;34028:6;34020;34014:4;33968:67;:::i;:::-;34062:1;34086:4;34073:17;;34118:2;34110:6;34107:14;34135:1;34130:618;;;;34792:1;34809:6;34806:77;;;34858:9;34853:3;34849:19;34843:26;34834:35;;34806:77;34909:67;34969:6;34962:5;34909:67;:::i;:::-;34903:4;34896:81;34765:222;34100:887;;34130:618;34182:4;34178:9;34170:6;34166:22;34216:37;34248:4;34216:37;:::i;:::-;34275:1;34289:208;34303:7;34300:1;34297:14;34289:208;;;34382:9;34377:3;34373:19;34367:26;34359:6;34352:42;34433:1;34425:6;34421:14;34411:24;;34480:2;34469:9;34465:18;34452:31;;34326:4;34323:1;34319:12;34314:17;;34289:208;;;34525:6;34516:7;34513:19;34510:179;;;34583:9;34578:3;34574:19;34568:26;34626:48;34668:4;34660:6;34656:17;34645:9;34626:48;:::i;:::-;34618:6;34611:64;34533:156;34510:179;34735:1;34731;34723:6;34719:14;34715:22;34709:4;34702:36;34137:611;;;34100:887;;33690:1303;;;33598:1395;;:::o;34999:98::-;35050:6;35084:5;35078:12;35068:22;;34999:98;;;:::o;35103:168::-;35186:11;35220:6;35215:3;35208:19;35260:4;35255:3;35251:14;35236:29;;35103:168;;;;:::o;35277:373::-;35363:3;35391:38;35423:5;35391:38;:::i;:::-;35445:70;35508:6;35503:3;35445:70;:::i;:::-;35438:77;;35524:65;35582:6;35577:3;35570:4;35563:5;35559:16;35524:65;:::i;:::-;35614:29;35636:6;35614:29;:::i;:::-;35609:3;35605:39;35598:46;;35367:283;35277:373;;;;:::o;35656:640::-;35851:4;35889:3;35878:9;35874:19;35866:27;;35903:71;35971:1;35960:9;35956:17;35947:6;35903:71;:::i;:::-;35984:72;36052:2;36041:9;36037:18;36028:6;35984:72;:::i;:::-;36066;36134:2;36123:9;36119:18;36110:6;36066:72;:::i;:::-;36185:9;36179:4;36175:20;36170:2;36159:9;36155:18;36148:48;36213:76;36284:4;36275:6;36213:76;:::i;:::-;36205:84;;35656:640;;;;;;;:::o;36302:141::-;36358:5;36389:6;36383:13;36374:22;;36405:32;36431:5;36405:32;:::i;:::-;36302:141;;;;:::o;36449:349::-;36518:6;36567:2;36555:9;36546:7;36542:23;36538:32;36535:119;;;36573:79;;:::i;:::-;36535:119;36693:1;36718:63;36773:7;36764:6;36753:9;36749:22;36718:63;:::i;:::-;36708:73;;36664:127;36449:349;;;;:::o;36804:315::-;36944:66;36940:1;36932:6;36928:14;36921:90;37045:66;37040:2;37032:6;37028:15;37021:91;36804:315;:::o;37125:402::-;37285:3;37306:85;37388:2;37383:3;37306:85;:::i;:::-;37299:92;;37400:93;37489:3;37400:93;:::i;:::-;37518:2;37513:3;37509:12;37502:19;;37125:402;;;:::o;37533:315::-;37673:66;37669:1;37661:6;37657:14;37650:90;37774:66;37769:2;37761:6;37757:15;37750:91;37533:315;:::o;37854:402::-;38014:3;38035:85;38117:2;38112:3;38035:85;:::i;:::-;38028:92;;38129:93;38218:3;38129:93;:::i;:::-;38247:2;38242:3;38238:12;38231:19;;37854:402;;;:::o;38262:214::-;38402:66;38398:1;38390:6;38386:14;38379:90;38262:214;:::o;38482:402::-;38642:3;38663:85;38745:2;38740:3;38663:85;:::i;:::-;38656:92;;38757:93;38846:3;38757:93;:::i;:::-;38875:2;38870:3;38866:12;38859:19;;38482:402;;;:::o;38890:913::-;39277:3;39299:148;39443:3;39299:148;:::i;:::-;39292:155;;39464:148;39608:3;39464:148;:::i;:::-;39457:155;;39629:148;39773:3;39629:148;:::i;:::-;39622:155;;39794:3;39787:10;;38890:913;;;:::o;39809:79::-;39848:7;39877:5;39866:16;;39809:79;;;:::o;39894:157::-;39999:45;40019:24;40037:5;40019:24;:::i;:::-;39999:45;:::i;:::-;39994:3;39987:58;39894:157;;:::o;40057:159::-;40197:11;40193:1;40185:6;40181:14;40174:35;40057:159;:::o;40222:400::-;40382:3;40403:84;40485:1;40480:3;40403:84;:::i;:::-;40396:91;;40496:93;40585:3;40496:93;:::i;:::-;40614:1;40609:3;40605:11;40598:18;;40222:400;;;:::o;40628:663::-;40869:3;40884:75;40955:3;40946:6;40884:75;:::i;:::-;40984:2;40979:3;40975:12;40968:19;;41004:148;41148:3;41004:148;:::i;:::-;40997:155;;41162:75;41233:3;41224:6;41162:75;:::i;:::-;41262:2;41257:3;41253:12;41246:19;;41282:3;41275:10;;40628:663;;;;;:::o;41297:176::-;41329:1;41346:20;41364:1;41346:20;:::i;:::-;41341:25;;41380:20;41398:1;41380:20;:::i;:::-;41375:25;;41419:1;41409:35;;41424:18;;:::i;:::-;41409:35;41465:1;41462;41458:9;41453:14;;41297:176;;;;:::o;41479:159::-;41619:11;41615:1;41607:6;41603:14;41596:35;41479:159;:::o;41644:400::-;41804:3;41825:84;41907:1;41902:3;41825:84;:::i;:::-;41818:91;;41918:93;42007:3;41918:93;:::i;:::-;42036:1;42031:3;42027:11;42020:18;;41644:400;;;:::o;42050:663::-;42291:3;42306:75;42377:3;42368:6;42306:75;:::i;:::-;42406:2;42401:3;42397:12;42390:19;;42426:148;42570:3;42426:148;:::i;:::-;42419:155;;42584:75;42655:3;42646:6;42584:75;:::i;:::-;42684:2;42679:3;42675:12;42668:19;;42704:3;42697:10;;42050:663;;;;;:::o;42719:153::-;42859:5;42855:1;42847:6;42843:14;42836:29;42719:153;:::o;42878:400::-;43038:3;43059:84;43141:1;43136:3;43059:84;:::i;:::-;43052:91;;43152:93;43241:3;43152:93;:::i;:::-;43270:1;43265:3;43261:11;43254:18;;42878:400;;;:::o;43284:522::-;43497:3;43512:75;43583:3;43574:6;43512:75;:::i;:::-;43612:2;43607:3;43603:12;43596:19;;43632:148;43776:3;43632:148;:::i;:::-;43625:155;;43797:3;43790:10;;43284:522;;;;:::o;43812:153::-;43952:5;43948:1;43940:6;43936:14;43929:29;43812:153;:::o;43971:400::-;44131:3;44152:84;44234:1;44229:3;44152:84;:::i;:::-;44145:91;;44245:93;44334:3;44245:93;:::i;:::-;44363:1;44358:3;44354:11;44347:18;;43971:400;;;:::o;44377:522::-;44590:3;44605:75;44676:3;44667:6;44605:75;:::i;:::-;44705:2;44700:3;44696:12;44689:19;;44725:148;44869:3;44725:148;:::i;:::-;44718:155;;44890:3;44883:10;;44377:522;;;;:::o;44905:158::-;45045:6;45041:1;45033:6;45029:14;45022:30;44905:158;:::o;45073:416::-;45233:3;45258:84;45340:1;45335:3;45258:84;:::i;:::-;45251:91;;45355:93;45444:3;45355:93;:::i;:::-;45477:1;45472:3;45468:11;45461:18;;45073:416;;;:::o;45499:159::-;45643:3;45639:1;45631:6;45627:14;45620:27;45499:159;:::o;45668:416::-;45828:3;45853:84;45935:1;45930:3;45853:84;:::i;:::-;45846:91;;45950:93;46039:3;45950:93;:::i;:::-;46072:1;46067:3;46063:11;46056:18;;45668:416;;;:::o;46094:156::-;46234:8;46230:1;46222:6;46218:14;46211:32;46094:156;:::o;46256:400::-;46416:3;46437:84;46519:1;46514:3;46437:84;:::i;:::-;46430:91;;46530:93;46619:3;46530:93;:::i;:::-;46648:1;46643:3;46639:11;46632:18;;46256:400;;;:::o;46662:1233::-;47145:3;47167:148;47311:3;47167:148;:::i;:::-;47160:155;;47332:95;47423:3;47414:6;47332:95;:::i;:::-;47325:102;;47444:148;47588:3;47444:148;:::i;:::-;47437:155;;47609:95;47700:3;47691:6;47609:95;:::i;:::-;47602:102;;47721:148;47865:3;47721:148;:::i;:::-;47714:155;;47886:3;47879:10;;46662:1233;;;;;:::o;47901:152::-;48037:12;48033:1;48025:6;48021:14;48014:36;47901:152;:::o;48055:386::-;48215:3;48232:85;48314:2;48309:3;48232:85;:::i;:::-;48225:92;;48322:93;48411:3;48322:93;:::i;:::-;48436:2;48431:3;48427:12;48420:19;;48055:386;;;:::o;48443:2147::-;49277:3;49295:148;49439:3;49295:148;:::i;:::-;49288:155;;49456:95;49547:3;49538:6;49456:95;:::i;:::-;49449:102;;49564:148;49708:3;49564:148;:::i;:::-;49557:155;;49725:148;49869:3;49725:148;:::i;:::-;49718:155;;49886:95;49977:3;49968:6;49886:95;:::i;:::-;49879:102;;49994:148;50138:3;49994:148;:::i;:::-;49987:155;;50155:148;50299:3;50155:148;:::i;:::-;50148:155;;50316:95;50407:3;50398:6;50316:95;:::i;:::-;50309:102;;50424:148;50568:3;50424:148;:::i;:::-;50417:155;;50585:3;50578:10;;48443:2147;;;;;;:::o;50592:164::-;50636:77;50633:1;50626:88;50729:4;50726:1;50719:15;50749:4;50746:1;50739:15;50758:206;50894:66;50890:1;50882:6;50878:14;50871:90;50758:206;:::o;50966:386::-;51126:3;51143:85;51225:2;51220:3;51143:85;:::i;:::-;51136:92;;51233:93;51322:3;51233:93;:::i;:::-;51347:2;51342:3;51338:12;51331:19;;50966:386;;;:::o;51354:206::-;51490:66;51486:1;51478:6;51474:14;51467:90;51354:206;:::o;51562:384::-;51722:3;51739:84;51821:1;51816:3;51739:84;:::i;:::-;51732:91;;51828:93;51917:3;51828:93;:::i;:::-;51942:1;51937:3;51933:11;51926:18;;51562:384;;;:::o;51948:206::-;52084:66;52080:1;52072:6;52068:14;52061:90;51948:206;:::o;52156:384::-;52316:3;52333:84;52415:1;52410:3;52333:84;:::i;:::-;52326:91;;52422:93;52511:3;52422:93;:::i;:::-;52536:1;52531:3;52527:11;52520:18;;52156:384;;;:::o;52542:206::-;52678:66;52674:1;52666:6;52662:14;52655:90;52542:206;:::o;52750:384::-;52910:3;52927:84;53009:1;53004:3;52927:84;:::i;:::-;52920:91;;53016:93;53105:3;53016:93;:::i;:::-;53130:1;53125:3;53121:11;53114:18;;52750:384;;;:::o;53136:206::-;53272:66;53268:1;53260:6;53256:14;53249:90;53136:206;:::o;53344:384::-;53504:3;53521:84;53603:1;53598:3;53521:84;:::i;:::-;53514:91;;53610:93;53699:3;53610:93;:::i;:::-;53724:1;53719:3;53715:11;53708:18;;53344:384;;;:::o;53730:303::-;53866:66;53862:1;53854:6;53850:14;53843:90;53963:66;53958:2;53950:6;53946:15;53939:91;53730:303;:::o;54035:386::-;54195:3;54212:85;54294:2;54289:3;54212:85;:::i;:::-;54205:92;;54302:93;54391:3;54302:93;:::i;:::-;54416:2;54411:3;54407:12;54400:19;;54035:386;;;:::o;54423:206::-;54559:66;54555:1;54547:6;54543:14;54536:90;54423:206;:::o;54631:384::-;54791:3;54808:84;54890:1;54885:3;54808:84;:::i;:::-;54801:91;;54897:93;54986:3;54897:93;:::i;:::-;55011:1;55006:3;55002:11;54995:18;;54631:384;;;:::o;55017:206::-;55153:66;55149:1;55141:6;55137:14;55130:90;55017:206;:::o;55225:386::-;55385:3;55402:85;55484:2;55479:3;55402:85;:::i;:::-;55395:92;;55492:93;55581:3;55492:93;:::i;:::-;55606:2;55601:3;55597:12;55590:19;;55225:386;;;:::o;55613:303::-;55749:66;55745:1;55737:6;55733:14;55726:90;55846:66;55841:2;55833:6;55829:15;55822:91;55613:303;:::o;55918:386::-;56078:3;56095:85;56177:2;56172:3;56095:85;:::i;:::-;56088:92;;56185:93;56274:3;56185:93;:::i;:::-;56299:2;56294:3;56290:12;56283:19;;55918:386;;;:::o;56306:303::-;56442:66;56438:1;56430:6;56426:14;56419:90;56539:66;56534:2;56526:6;56522:15;56515:91;56306:303;:::o;56611:386::-;56771:3;56788:85;56870:2;56865:3;56788:85;:::i;:::-;56781:92;;56878:93;56967:3;56878:93;:::i;:::-;56992:2;56987:3;56983:12;56976:19;;56611:386;;;:::o;56999:143::-;57135:3;57131:1;57123:6;57119:14;57112:27;56999:143;:::o;57144:384::-;57304:3;57321:84;57403:1;57398:3;57321:84;:::i;:::-;57314:91;;57410:93;57499:3;57410:93;:::i;:::-;57524:1;57519:3;57515:11;57508:18;;57144:384;;;:::o;57530:151::-;57666:11;57662:1;57654:6;57650:14;57643:35;57530:151;:::o;57683:384::-;57843:3;57860:84;57942:1;57937:3;57860:84;:::i;:::-;57853:91;;57949:93;58038:3;57949:93;:::i;:::-;58063:1;58058:3;58054:11;58047:18;;57683:384;;;:::o;58069:6017::-;60298:3;60316:148;60460:3;60316:148;:::i;:::-;60309:155;;60477:95;60568:3;60559:6;60477:95;:::i;:::-;60470:102;;60585:148;60729:3;60585:148;:::i;:::-;60578:155;;60746:95;60837:3;60828:6;60746:95;:::i;:::-;60739:102;;60854:148;60998:3;60854:148;:::i;:::-;60847:155;;61015:95;61106:3;61097:6;61015:95;:::i;:::-;61008:102;;61123:148;61267:3;61123:148;:::i;:::-;61116:155;;61284:95;61375:3;61366:6;61284:95;:::i;:::-;61277:102;;61392:148;61536:3;61392:148;:::i;:::-;61385:155;;61553:148;61697:3;61553:148;:::i;:::-;61546:155;;61714:95;61805:3;61796:6;61714:95;:::i;:::-;61707:102;;61822:148;61966:3;61822:148;:::i;:::-;61815:155;;61983:95;62074:3;62065:6;61983:95;:::i;:::-;61976:102;;62091:148;62235:3;62091:148;:::i;:::-;62084:155;;62252:148;62396:3;62252:148;:::i;:::-;62245:155;;62413:95;62504:3;62495:6;62413:95;:::i;:::-;62406:102;;62521:148;62665:3;62521:148;:::i;:::-;62514:155;;62682:148;62826:3;62682:148;:::i;:::-;62675:155;;62843:95;62934:3;62925:6;62843:95;:::i;:::-;62836:102;;62951:148;63095:3;62951:148;:::i;:::-;62944:155;;63112:95;63203:3;63194:6;63112:95;:::i;:::-;63105:102;;63220:148;63364:3;63220:148;:::i;:::-;63213:155;;63381:95;63472:3;63463:6;63381:95;:::i;:::-;63374:102;;63489:148;63633:3;63489:148;:::i;:::-;63482:155;;63650:96;63742:3;63732:7;63650:96;:::i;:::-;63643:103;;63759:148;63903:3;63759:148;:::i;:::-;63752:155;;63920:148;64064:3;63920:148;:::i;:::-;63913:155;;64081:3;64074:10;;58069:6017;;;;;;;;;;;;;;:::o;64088:419::-;64268:3;64286:95;64377:3;64368:6;64286:95;:::i;:::-;64279:102;;64394:95;64485:3;64476:6;64394:95;:::i;:::-;64387:102;;64502:3;64495:10;;64088:419;;;;;:::o;64509:217::-;64548:3;64567:24;64585:5;64567:24;:::i;:::-;64558:33;;64609:66;64602:5;64599:77;64596:103;;64679:18;;:::i;:::-;64596:103;64722:1;64715:5;64711:13;64704:20;;64509:217;;;:::o;64728:146::-;64864:6;64860:1;64852:6;64848:14;64841:30;64728:146;:::o;64876:384::-;65036:3;65053:84;65135:1;65130:3;65053:84;:::i;:::-;65046:91;;65142:93;65231:3;65142:93;:::i;:::-;65256:1;65251:3;65247:11;65240:18;;64876:384;;;:::o;65262:148::-;65398:8;65394:1;65386:6;65382:14;65375:32;65262:148;:::o;65412:384::-;65572:3;65589:84;65671:1;65666:3;65589:84;:::i;:::-;65582:91;;65678:93;65767:3;65678:93;:::i;:::-;65792:1;65787:3;65783:11;65776:18;;65412:384;;;:::o;65798:787::-;66132:3;66150:95;66241:3;66232:6;66150:95;:::i;:::-;66143:102;;66258:148;66402:3;66258:148;:::i;:::-;66251:155;;66419:148;66563:3;66419:148;:::i;:::-;66412:155;;66580:3;66573:10;;65798:787;;;;:::o;66587:174::-;66627:4;66643:20;66661:1;66643:20;:::i;:::-;66638:25;;66673:20;66691:1;66673:20;:::i;:::-;66668:25;;66713:1;66710;66706:9;66698:17;;66733:1;66727:4;66724:11;66721:37;;;66738:18;;:::i;:::-;66721:37;66587:174;;;;:::o;66763:303::-;66899:66;66895:1;66887:6;66883:14;66876:90;66996:66;66991:2;66983:6;66979:15;66972:91;66763:303;:::o;67068:386::-;67228:3;67245:85;67327:2;67322:3;67245:85;:::i;:::-;67238:92;;67335:93;67424:3;67335:93;:::i;:::-;67449:2;67444:3;67440:12;67433:19;;67068:386;;;:::o;67456:145::-;67592:5;67588:1;67580:6;67576:14;67569:29;67456:145;:::o;67603:384::-;67763:3;67780:84;67862:1;67857:3;67780:84;:::i;:::-;67773:91;;67869:93;67958:3;67869:93;:::i;:::-;67983:1;67978:3;67974:11;67967:18;;67603:384;;;:::o;67989:206::-;68125:66;68121:1;68113:6;68109:14;68102:90;67989:206;:::o;68197:386::-;68357:3;68374:85;68456:2;68451:3;68374:85;:::i;:::-;68367:92;;68464:93;68553:3;68464:93;:::i;:::-;68578:2;68573:3;68569:12;68562:19;;68197:386;;;:::o;68585:303::-;68721:66;68717:1;68709:6;68705:14;68698:90;68818:66;68813:2;68805:6;68801:15;68794:91;68585:303;:::o;68890:386::-;69050:3;69067:85;69149:2;69144:3;69067:85;:::i;:::-;69060:92;;69157:93;69246:3;69157:93;:::i;:::-;69271:2;69266:3;69262:12;69255:19;;68890:386;;;:::o;69278:303::-;69414:66;69410:1;69402:6;69398:14;69391:90;69511:66;69506:2;69498:6;69494:15;69487:91;69278:303;:::o;69583:386::-;69743:3;69760:85;69842:2;69837:3;69760:85;:::i;:::-;69753:92;;69850:93;69939:3;69850:93;:::i;:::-;69964:2;69959:3;69955:12;69948:19;;69583:386;;;:::o;69971:303::-;70107:66;70103:1;70095:6;70091:14;70084:90;70204:66;70199:2;70191:6;70187:15;70180:91;69971:303;:::o;70276:386::-;70436:3;70453:85;70535:2;70530:3;70453:85;:::i;:::-;70446:92;;70543:93;70632:3;70543:93;:::i;:::-;70657:2;70652:3;70648:12;70641:19;;70276:386;;;:::o;70664:206::-;70800:66;70796:1;70788:6;70784:14;70777:90;70664:206;:::o;70872:386::-;71032:3;71049:85;71131:2;71126:3;71049:85;:::i;:::-;71042:92;;71139:93;71228:3;71139:93;:::i;:::-;71253:2;71248:3;71244:12;71237:19;;70872:386;;;:::o;71260:206::-;71396:66;71392:1;71384:6;71380:14;71373:90;71260:206;:::o;71468:386::-;71628:3;71645:85;71727:2;71722:3;71645:85;:::i;:::-;71638:92;;71735:93;71824:3;71735:93;:::i;:::-;71849:2;71844:3;71840:12;71833:19;;71468:386;;;:::o;71856:206::-;71992:66;71988:1;71980:6;71976:14;71969:90;71856:206;:::o;72064:384::-;72224:3;72241:84;72323:1;72318:3;72241:84;:::i;:::-;72234:91;;72330:93;72419:3;72330:93;:::i;:::-;72444:1;72439:3;72435:11;72428:18;;72064:384;;;:::o;72450:5179::-;74380:3;74398:148;74542:3;74398:148;:::i;:::-;74391:155;;74559:95;74650:3;74641:6;74559:95;:::i;:::-;74552:102;;74667:148;74811:3;74667:148;:::i;:::-;74660:155;;74828:95;74919:3;74910:6;74828:95;:::i;:::-;74821:102;;74936:148;75080:3;74936:148;:::i;:::-;74929:155;;75097:148;75241:3;75097:148;:::i;:::-;75090:155;;75258:95;75349:3;75340:6;75258:95;:::i;:::-;75251:102;;75366:148;75510:3;75366:148;:::i;:::-;75359:155;;75527:95;75618:3;75609:6;75527:95;:::i;:::-;75520:102;;75635:148;75779:3;75635:148;:::i;:::-;75628:155;;75796:148;75940:3;75796:148;:::i;:::-;75789:155;;75957:95;76048:3;76039:6;75957:95;:::i;:::-;75950:102;;76065:148;76209:3;76065:148;:::i;:::-;76058:155;;76226:95;76317:3;76308:6;76226:95;:::i;:::-;76219:102;;76334:148;76478:3;76334:148;:::i;:::-;76327:155;;76495:148;76639:3;76495:148;:::i;:::-;76488:155;;76656:95;76747:3;76738:6;76656:95;:::i;:::-;76649:102;;76764:148;76908:3;76764:148;:::i;:::-;76757:155;;76925:148;77069:3;76925:148;:::i;:::-;76918:155;;77086:95;77177:3;77168:6;77086:95;:::i;:::-;77079:102;;77194:148;77338:3;77194:148;:::i;:::-;77187:155;;77355:95;77446:3;77437:6;77355:95;:::i;:::-;77348:102;;77463:148;77607:3;77463:148;:::i;:::-;77456:155;;77624:3;77617:10;;72450:5179;;;;;;;;;;;;:::o;77631:150::-;77767:10;77763:1;77755:6;77751:14;77744:34;77631:150;:::o;77783:384::-;77943:3;77960:84;78042:1;78037:3;77960:84;:::i;:::-;77953:91;;78049:93;78138:3;78049:93;:::i;:::-;78163:1;78158:3;78154:11;78147:18;;77783:384;;;:::o;78169:502::-;78382:3;78393:75;78464:3;78455:6;78393:75;:::i;:::-;78489:2;78484:3;78480:12;78473:19;;78505:148;78649:3;78505:148;:::i;:::-;78498:155;;78666:3;78659:10;;78169:502;;;;:::o;78673:148::-;78809:8;78805:1;78797:6;78793:14;78786:32;78673:148;:::o;78823:384::-;78983:3;79000:84;79082:1;79077:3;79000:84;:::i;:::-;78993:91;;79089:93;79178:3;79089:93;:::i;:::-;79203:1;79198:3;79194:11;79187:18;;78823:384;;;:::o;79209:635::-;79450:3;79461:75;79532:3;79523:6;79461:75;:::i;:::-;79557:2;79552:3;79548:12;79541:19;;79573:148;79717:3;79573:148;:::i;:::-;79566:155;;79727:75;79798:3;79789:6;79727:75;:::i;:::-;79823:2;79818:3;79814:12;79807:19;;79839:3;79832:10;;79209:635;;;;;:::o;79846:151::-;79982:11;79978:1;79970:6;79966:14;79959:35;79846:151;:::o;79999:384::-;80159:3;80176:84;80258:1;80253:3;80176:84;:::i;:::-;80169:91;;80265:93;80354:3;80265:93;:::i;:::-;80379:1;80374:3;80370:11;80363:18;;79999:384;;;:::o;80385:635::-;80626:3;80637:75;80708:3;80699:6;80637:75;:::i;:::-;80733:2;80728:3;80724:12;80717:19;;80749:148;80893:3;80749:148;:::i;:::-;80742:155;;80903:75;80974:3;80965:6;80903:75;:::i;:::-;80999:2;80994:3;80990:12;80983:19;;81015:3;81008:10;;80385:635;;;;;:::o;81022:151::-;81158:11;81154:1;81146:6;81142:14;81135:35;81022:151;:::o;81175:384::-;81335:3;81352:84;81434:1;81429:3;81352:84;:::i;:::-;81345:91;;81441:93;81530:3;81441:93;:::i;:::-;81555:1;81550:3;81546:11;81539:18;;81175:384;;;:::o;81561:635::-;81802:3;81813:75;81884:3;81875:6;81813:75;:::i;:::-;81909:2;81904:3;81900:12;81893:19;;81925:148;82069:3;81925:148;:::i;:::-;81918:155;;82079:75;82150:3;82141:6;82079:75;:::i;:::-;82175:2;82170:3;82166:12;82159:19;;82191:3;82184:10;;81561:635;;;;;:::o;82198:153::-;82334:13;82330:1;82322:6;82318:14;82311:37;82198:153;:::o;82353:386::-;82513:3;82530:85;82612:2;82607:3;82530:85;:::i;:::-;82523:92;;82620:93;82709:3;82620:93;:::i;:::-;82734:2;82729:3;82725:12;82718:19;;82353:386;;;:::o;82741:635::-;82982:3;82993:75;83064:3;83055:6;82993:75;:::i;:::-;83089:2;83084:3;83080:12;83073:19;;83105:148;83249:3;83105:148;:::i;:::-;83098:155;;83259:75;83330:3;83321:6;83259:75;:::i;:::-;83355:2;83350:3;83346:12;83339:19;;83371:3;83364:10;;82741:635;;;;;:::o
Swarm Source
ipfs://16fdb68760a62a7857eb5833972cf91521b2a9b76b2515c844302e8c356f5e25
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.