Source Code
Overview
FTM Balance
0 FTM
More Info
ContractCreator:
TokenTracker
Multichain Info
N/A
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Paused | 7698926 | 772 days ago | IN | 0 FTM | 0.00714622 | ||||
Add Admin | 7698340 | 772 days ago | IN | 0 FTM | 0.00957075 | ||||
Add Admin | 7698336 | 772 days ago | IN | 0 FTM | 0.00957075 | ||||
Set Contracts | 7698330 | 772 days ago | IN | 0 FTM | 0.01541004 | ||||
Init Rarities An... | 7698328 | 772 days ago | IN | 0 FTM | 1.29093345 | ||||
0x60806040 | 7698262 | 772 days ago | IN | Create: HnO | 0 FTM | 1.0352211 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
7698262 | 772 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
HnO
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "./interfaces/IHnO.sol"; import "./interfaces/IDungeon.sol"; import "./interfaces/ITraits.sol"; import "./interfaces/IRandomizer.sol"; contract HnO is IHnO, ERC721Enumerable, Ownable, Pausable { struct LastWrite { uint256 time; uint256 blockNum; } event HamsterMinted(uint256 indexed tokenId); event OwlMinted(uint256 indexed tokenId); event HamsterStolen(uint256 indexed tokenId); event OwlStolen(uint256 indexed tokenId); event HamsterBurned(uint256 indexed tokenId); event OwlBurned(uint256 indexed tokenId); // max number of tokens that can be minted: 60000 in production uint256 public maxTokens; // number of tokens that can be claimed for a fee: 15,000 uint256 public PAID_TOKENS; // number of tokens have been minted so far uint256 public override minted; // mapping from tokenId to a struct containing the token's traits mapping(uint256 => HamsterOwl) private tokenTraits; // mapping from hashed(tokenTrait) to the tokenId it's associated with // used to ensure there are no duplicates mapping(uint256 => uint256) public existingCombinations; // Tracks the last block and timestamp that a caller has written to state. // Disallow some access to functions if they occur while a change is being written. mapping(address => LastWrite) private lastWriteAddress; mapping(uint256 => LastWrite) private lastWriteToken; // list of probabilities for each trait type // 0 - 9 are associated with Hamster, 10 - 18 are associated with Owls uint256[][18] public rarities; // list of aliases for Walker's Alias algorithm // 0 - 9 are associated with Hamster, 10 - 18 are associated with Owls uint256[][18] public aliases; // reference to the Dungeon contract to allow transfers to it without approval IDungeon public dungeon; // reference to Traits ITraits public traits; // reference to Randomizer IRandomizer public randomizer; bool public inited; // address => allowedToCallFunctions mapping(address => bool) private admins; constructor(uint256 _maxTokens) ERC721("Hamsters & Owls Game", "HnO") { maxTokens = _maxTokens; PAID_TOKENS = _maxTokens / 4; _pause(); } function initRaritiesAndAliases() external onlyOwner { require(!inited, "Already inited"); inited = true; // A.J. Walker's Alias Algorithm // Hamsters // body rarities[0] = [80, 150, 200, 250, 255]; aliases[0] = [4, 4, 4, 4, 4]; // head rarities[1] = [150, 40, 240, 90, 115, 135, 40, 199, 100]; aliases[1] = [3, 7, 4, 0, 5, 6, 8, 5, 0]; // spell rarities[2] = [255, 135, 60, 130, 190, 156, 250, 120, 60, 25, 190]; aliases[2] = [0, 0, 0, 6, 6, 0, 0, 0, 6, 8, 0]; // eyes rarities[3] = [221, 100, 181, 140, 224, 147, 84, 228, 140, 224, 250, 160, 241, 207, 173, 84, 254]; aliases[3] = [1, 2, 5, 0, 1, 7, 1, 10, 5, 10, 11, 12, 13, 14, 16, 11, 0]; // neck rarities[4] = [175, 100, 40, 250, 115, 100, 80, 110, 180, 255, 210, 180]; aliases[4] = [3, 0, 4, 1, 11, 7, 8, 10, 9, 9, 8, 8]; // mouth rarities[5] = [80, 225, 220, 35, 100, 240, 70, 160, 175, 217, 175, 60]; aliases[5] = [1, 2, 5, 8, 2, 8, 8, 9, 9, 10, 7, 10]; // neck rarities[6] = [255]; aliases[6] = [0]; // wand rarities[7] = [243, 189, 50, 30, 55, 180, 80, 90, 155, 30, 222, 255]; aliases[7] = [1, 7, 5, 2, 11, 11, 0, 10, 0, 0, 11, 3]; // rankIndex rarities[8] = [255]; aliases[8] = [0]; // Owls // body rarities[9] = [100, 80, 177, 199, 255, 40, 211, 177, 25, 230, 90, 130, 199, 230]; aliases[9] = [4, 3, 3, 4, 4, 13, 9, 1, 2, 5, 13, 0, 6, 12]; // head rarities[10] = [255]; aliases[10] = [0]; // spell rarities[11] = [255]; aliases[11] = [0]; // eyes rarities[12] = [90, 40, 219, 80, 183, 225, 40, 120, 60, 220]; aliases[12] = [1, 8, 3, 2, 5, 6, 5, 9, 4, 3]; // nose rarities[13] = [255]; aliases[13] = [0]; // mouth rarities[14] = [239, 244, 255, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234]; aliases[14] = [1, 2, 2, 0, 2, 2, 9, 0, 5, 4, 4, 4, 4, 4]; // tails rarities[15] = [80, 200, 144, 145, 80, 140, 120]; aliases[15] = [1, 6, 0, 0, 3, 0, 3]; // wand rarities[16] = [255]; aliases[16] = [0]; // rankIndex rarities[17] = [14, 155, 80, 255]; aliases[17] = [2, 3, 3, 3]; } /** CRITICAL TO SETUP / MODIFIERS */ modifier requireContractsSet() { address zero = address(0); require( address(traits) != zero && address(dungeon) != zero && address(randomizer) != zero, "Contracts not set" ); _; } modifier blockIfChangingAddress() { // frens can always call whenever they want :) require(admins[_msgSender()] || lastWriteAddress[tx.origin].blockNum < block.number, "hmmmm what doing?"); _; } modifier blockIfChangingToken(uint256 tokenId) { // frens can always call whenever they want :) require(admins[_msgSender()] || lastWriteToken[tokenId].blockNum < block.number, "hmmmm what doing?"); _; } function setContracts(address _traits, address _dungeon, address _rand) external onlyOwner { address zero = address(0); require(_traits != zero, "Traits is zero address"); require(_dungeon != zero, "Dungeon is zero address"); require(_rand != zero, "Randomizer is zero address"); traits = ITraits(_traits); dungeon = IDungeon(_dungeon); randomizer = IRandomizer(_rand); } /** EXTERNAL */ function getTokenWriteBlock(uint256 tokenId) external view override returns(uint256) { require(admins[_msgSender()], "Only admins can call this"); return lastWriteToken[tokenId].blockNum; } /** * Mint a token - any payment / game logic should be handled in the game contract. * This will just generate random traits and mint a token to a designated address. */ function mint(address recipient, uint256 seed) external override whenNotPaused { require(admins[_msgSender()], "Only admins can call this"); require(minted + 1 <= maxTokens, "All tokens minted"); minted++; generate(minted, seed, lastWriteAddress[tx.origin]); if (tx.origin != recipient && recipient != address(dungeon)) { // Stolen! if (tokenTraits[minted].isHamster) emit HamsterStolen(minted); else emit OwlStolen(minted); } _safeMint(recipient, minted); } /** * Burn a token - any game logic should be handled before this function. */ function burn(uint256 tokenId) external override whenNotPaused { require(admins[_msgSender()], "Only admins can call this"); require(ownerOf(tokenId) == tx.origin, "Oops you don't own that"); if (tokenTraits[tokenId].isHamster) emit HamsterBurned(tokenId); else emit OwlBurned(tokenId); _burn(tokenId); } function updateOriginAccess(uint256[] memory tokenIds) external override { require(admins[_msgSender()], "Only admins can call this"); uint256 blockNum = block.number; uint256 time = block.timestamp; lastWriteAddress[tx.origin] = LastWrite(time, blockNum); for (uint256 i = 0; i < tokenIds.length; i++) lastWriteToken[tokenIds[i]] = LastWrite(time, blockNum); } function transferFrom( address from, address to, uint256 tokenId ) public virtual override(ERC721, IERC721) blockIfChangingToken(tokenId) { // allow admin contracts to be send without approval if (!admins[_msgSender()]) require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** INTERNAL */ /** * generates traits for a specific token, checking to make sure it's unique * @param tokenId the id of the token to generate traits for * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of traits for the given token ID */ function generate(uint256 tokenId, uint256 seed, LastWrite memory lw) internal returns (HamsterOwl memory t) { t = selectTraits(seed); if (existingCombinations[structToHash(t)] == 0) { tokenTraits[tokenId] = t; existingCombinations[structToHash(t)] = tokenId; if (t.isHamster) emit HamsterMinted(tokenId); else emit OwlMinted(tokenId); return t; } return generate( tokenId, uint256(keccak256(abi.encodePacked(seed))), lw ); } /** * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup * ensuring O(1) instead of O(n) reduces mint cost by more than 50% * probability & alias tables are generated off-chain beforehand * @param seed portion of the 256 bit seed to remove trait correlation * @param traitType the trait type to select a trait for * @return the ID of the randomly selected trait */ function selectTrait(uint256 seed, uint256 traitType) internal view returns (uint256) { uint256 trait = seed % rarities[traitType].length; // If a selected random trait probability is selected (biased coin) return that trait if (seed >> 8 < rarities[traitType][trait]) return trait; return aliases[traitType][trait]; } /** * selects the species and all of its traits based on the seed value * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of randomly selected traits */ function selectTraits(uint256 seed) internal view returns (HamsterOwl memory t) { t.isHamster = (seed & 0xFFFF) % 10 != 0; uint256 shift = t.isHamster ? 0 : 9; seed >>= 16; t.body = selectTrait(uint16(seed & 0xFFFF), 0 + shift); seed >>= 16; t.head = selectTrait(uint16(seed & 0xFFFF), 1 + shift); seed >>= 16; t.spell = selectTrait(uint16(seed & 0xFFFF), 2 + shift); seed >>= 16; t.eyes = selectTrait(uint16(seed & 0xFFFF), 3 + shift); seed >>= 16; t.neck = selectTrait(uint16(seed & 0xFFFF), 4 + shift); seed >>= 16; t.mouth = selectTrait(uint16(seed & 0xFFFF), 5 + shift); seed >>= 16; t.tail = selectTrait(uint16(seed & 0xFFFF), 6 + shift); seed >>= 16; t.wand = selectTrait(uint16(seed & 0xFFFF), 7 + shift); seed >>= 16; t.rankIndex = selectTrait(uint16(seed & 0xFFFF), 8 + shift); } /** * converts a struct to a 256 bit hash to check for uniqueness * @param s the struct to pack into a hash * @return the 256 bit hash of the struct */ function structToHash(HamsterOwl memory s) internal pure returns (uint256) { return uint256(keccak256( abi.encodePacked( s.isHamster, s.body, s.head, s.spell, s.eyes, s.neck, s.mouth, s.tail, s.wand, s.rankIndex ) )); } /** READ */ /** * checks if a token is a Hamsters * @param tokenId the ID of the token to check * @return hamster - whether or not a token is a Hamsters */ function isHamster(uint256 tokenId) external view override blockIfChangingToken(tokenId) returns (bool) { // Sneaky owls will be slain if they try to peep this after mint. Nice try. IHnO.HamsterOwl memory s = tokenTraits[tokenId]; return s.isHamster; } function getMaxTokens() external view override returns (uint256) { return maxTokens; } function getPaidTokens() external view override returns (uint256) { return PAID_TOKENS; } /** ADMIN */ /** * updates the number of tokens for sale */ function setPaidTokens(uint256 _paidTokens) external onlyOwner { PAID_TOKENS = uint16(_paidTokens); } /** * enables owner to pause / unpause minting */ function setPaused(bool _paused) external requireContractsSet onlyOwner { if (_paused) _pause(); else _unpause(); } /** * enables an address to mint / burn * @param addr the address to enable */ function addAdmin(address addr) external onlyOwner { admins[addr] = true; } /** * disables an address from minting / burning * @param addr the address to disbale */ function removeAdmin(address addr) external onlyOwner { admins[addr] = false; } /** Traits */ function getTokenTraits( uint256 tokenId ) external view override blockIfChangingAddress blockIfChangingToken(tokenId) returns (HamsterOwl memory) { return tokenTraits[tokenId]; } function tokenURI( uint256 tokenId ) public view override blockIfChangingAddress blockIfChangingToken(tokenId) returns (string memory) { require(_exists(tokenId), "Token ID does not exist"); return traits.tokenURI(tokenId); } /** OVERRIDES FOR SAFETY */ function tokenOfOwnerByIndex( address owner, uint256 index ) public view virtual override(ERC721Enumerable, IERC721Enumerable) blockIfChangingAddress returns (uint256) { // Y U checking on this address in the same block it's being modified... hmmmm require(admins[_msgSender()] || lastWriteAddress[owner].blockNum < block.number, "hmmmm what doing?"); uint256 tokenId = super.tokenOfOwnerByIndex(owner, index); require(admins[_msgSender()] || lastWriteToken[tokenId].blockNum < block.number, "hmmmm what doing?"); return tokenId; } function balanceOf( address owner ) public view virtual override(ERC721, IERC721) blockIfChangingAddress returns (uint256) { // Y U checking on this address in the same block it's being modified... hmmmm require(admins[_msgSender()] || lastWriteAddress[owner].blockNum < block.number, "hmmmm what doing?"); return super.balanceOf(owner); } function ownerOf( uint256 tokenId ) public view virtual override( ERC721, IERC721 ) blockIfChangingAddress blockIfChangingToken(tokenId) returns (address) { address addr = super.ownerOf(tokenId); // Y U checking on this address in the same block it's being modified... hmmmm require(admins[_msgSender()] || lastWriteAddress[addr].blockNum < block.number, "hmmmm what doing?"); return addr; } function tokenByIndex( uint256 index ) public view virtual override(ERC721Enumerable, IERC721Enumerable) returns (uint256) { uint256 tokenId = super.tokenByIndex(index); // NICE TRY TOAD OWL require(admins[_msgSender()] || lastWriteToken[tokenId].blockNum < block.number, "hmmmm what doing?"); return tokenId; } function approve( address to, uint256 tokenId ) public virtual override(ERC721, IERC721) blockIfChangingToken(tokenId) { super.approve(to, tokenId); } function getApproved( uint256 tokenId ) public view virtual override(ERC721, IERC721) blockIfChangingToken(tokenId) returns (address) { return super.getApproved(tokenId); } function setApprovalForAll( address operator, bool approved ) public virtual override(ERC721, IERC721) blockIfChangingAddress { super.setApprovalForAll(operator, approved); } function isApprovedForAll( address owner, address operator ) public view virtual override(ERC721, IERC721) blockIfChangingAddress returns (bool) { return super.isApprovedForAll(owner, operator); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override(ERC721, IERC721) blockIfChangingToken(tokenId) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override(ERC721, IERC721) blockIfChangingToken(tokenId) { super.safeTransferFrom(from, to, tokenId, _data); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface ITraits { function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface IRandomizer { enum Status { NOT_ACTIVE, ACTIVE, FINISHED, RELEASED } struct Round { uint256 startAt; uint256 endsAt; bytes32 hashSeed; string seed; uint256 blockNumber; bytes32 blockHash; uint256 random; Status status; } function canFinishRound() external view returns (bool); function currentRound() external view returns (uint256); function delay() external view returns (uint256); function roundMinDuration() external view returns (uint256); function isRandomReady(uint256 roundNumber_) external view returns (bool); function random(uint256 roundNumber_) external view returns (uint256); function round(uint256 roundNumber_) external view returns (Round memory); event BlockHashSaved(uint256 round_, bytes32 blockHash_, address indexed caller); event DelayUpdated(uint256 delay_); event RandomReleased( uint256 round_, uint256 random_, address indexed caller ); event RoundMinDurationUpdated(uint256 roundMinDuration_); event RoundFinished(uint256 round_, string seed_, address indexed caller); event RoundRestarted(uint256 round_, bytes32 hashSeed_, uint256 blockNumber_, address indexed caller); event RoundStarted(uint256 round_, bytes32 hashSeed_, uint256 blockNumber_, address indexed caller); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; interface IHnO is IERC721Enumerable { struct HamsterOwl { bool isHamster; uint256 body; uint256 head; uint256 spell; uint256 eyes; uint256 neck; uint256 mouth; uint256 wand; uint256 tail; uint256 rankIndex; } function minted() external returns (uint256); function updateOriginAccess(uint256[] memory tokenIds) external; function mint(address recipient, uint256 seed) external; function burn(uint256 tokenId) external; function getMaxTokens() external view returns (uint256); function getPaidTokens() external view returns (uint256); function getTokenTraits(uint256 tokenId) external view returns (HamsterOwl memory); function getTokenWriteBlock(uint256 tokenId) external view returns(uint256); function isHamster(uint256 tokenId) external view returns(bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface IDungeon { function addManyToDungeonAndFlight(address account, uint256[] memory tokenIds) external; function randomOwlOwner(uint256 seed) external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "berlin", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HamsterBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HamsterMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HamsterStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OwlBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OwlMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OwlStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"PAID_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dungeon","outputs":[{"internalType":"contract IDungeon","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","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":"getMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraits","outputs":[{"components":[{"internalType":"bool","name":"isHamster","type":"bool"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"head","type":"uint256"},{"internalType":"uint256","name":"spell","type":"uint256"},{"internalType":"uint256","name":"eyes","type":"uint256"},{"internalType":"uint256","name":"neck","type":"uint256"},{"internalType":"uint256","name":"mouth","type":"uint256"},{"internalType":"uint256","name":"wand","type":"uint256"},{"internalType":"uint256","name":"tail","type":"uint256"},{"internalType":"uint256","name":"rankIndex","type":"uint256"}],"internalType":"struct IHnO.HamsterOwl","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenWriteBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initRaritiesAndAliases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inited","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isHamster","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_dungeon","type":"address"},{"internalType":"address","name":"_rand","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_paidTokens","type":"uint256"}],"name":"setPaidTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"updateOriginAccess","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005adb38038062005adb8339810160408190526200003491620002a8565b604080518082018252601481527f48616d73746572732026204f776c732047616d65000000000000000000000000602080830191825283518085019094526003845262486e4f60e81b908401528151919291620000949160009162000202565b508051620000aa90600190602084019062000202565b505050620000c7620000c1620000fa60201b60201c565b620000fe565b600a805460ff60a01b19169055600b819055620000e6600482620002c2565b600c55620000f362000150565b5062000322565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000164600a54600160a01b900460ff1690565b15620001a95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001e53390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200021090620002e5565b90600052602060002090601f0160209004810192826200023457600085556200027f565b82601f106200024f57805160ff19168380011785556200027f565b828001600101855582156200027f579182015b828111156200027f57825182559160200191906001019062000262565b506200028d92915062000291565b5090565b5b808211156200028d576000815560010162000292565b600060208284031215620002bb57600080fd5b5051919050565b600082620002e057634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680620002fa57607f821691505b602082108114156200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b6157a980620003326000396000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80636352211e11610191578063b3066d49116100e3578063e1fc334f11610097578063ebd1736811610071578063ebd17368146106b7578063f10fb584146106ca578063f2fde38b146106ea57600080fd5b8063e1fc334f1461067b578063e83157421461069b578063e985e9c5146106a457600080fd5b8063c084f540116100c8578063c084f5401461064c578063c87b56dd14610655578063dce36acd1461066857600080fd5b8063b3066d4914610626578063b88d4fde1461063957600080fd5b80638b3645151161014557806395d89b411161011f57806395d89b41146105eb578063a1b8f374146105f3578063a22cb4651461061357600080fd5b80638b364515146105305780638da5cb5b1461054357806394e568471461056157600080fd5b80637048027511610176578063704802751461050257806370a0823114610515578063715018a61461052857600080fd5b80636352211e146104e75780636abcded1146104fa57600080fd5b806335c826091161024a57806342966c68116101fe5780634f6ccce7116101d85780634f6ccce7146104915780635aadb3bd146104a45780635c975abb146104c457600080fd5b806342966c681461045057806343c885ba146104635780634f02c4201461048857600080fd5b80634018b1f81161022f5780634018b1f81461042257806340c10f191461042a57806342842e0e1461043d57600080fd5b806335c8260914610407578063368383911461040f57600080fd5b80631785f53c116102ac5780632f745c59116102865780632f745c59146103ce57806333df4b2c146103e15780633431a753146103f457600080fd5b80631785f53c1461039657806318160ddd146103a957806323b872dd146103bb57600080fd5b8063081812fc116102dd578063081812fc14610336578063095ea7b31461036e57806316c38b3c1461038357600080fd5b806301ffc9a7146102f957806306fdde0314610321575b600080fd5b61030c6103073660046150b2565b6106fd565b60405190151581526020015b60405180910390f35b610329610759565b6040516103189190615145565b610349610344366004615158565b6107eb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610318565b61038161037c366004615195565b610898565b005b6103816103913660046151cf565b61093d565b6103816103a43660046151ea565b610aaa565b6008545b604051908152602001610318565b6103816103c9366004615205565b610b77565b6103ad6103dc366004615195565b610ccc565b6103ad6103ef366004615241565b610eb6565b610381610402366004615158565b610eea565b610381610f74565b6103ad61041d366004615241565b611bea565b600c546103ad565b610381610438366004615195565b611bfa565b61038161044b366004615205565b611e87565b61038161045e366004615158565b611f28565b60385461030c9074010000000000000000000000000000000000000000900460ff1681565b6103ad600d5481565b6103ad61049f366004615158565b612129565b6036546103499073ffffffffffffffffffffffffffffffffffffffff1681565b600a5474010000000000000000000000000000000000000000900460ff1661030c565b6103496104f5366004615158565b6121cc565b600b546103ad565b6103816105103660046151ea565b6123b0565b6103ad6105233660046151ea565b612480565b6103816125ce565b61030c61053e366004615158565b61265b565b600a5473ffffffffffffffffffffffffffffffffffffffff16610349565b61057461056f366004615158565b61277e565b604051610318919081511515815261014081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525092915050565b61032961298b565b6103ad610601366004615158565b600f6020526000908152604090205481565b610381610621366004615263565b61299a565b610381610634366004615296565b612a39565b61038161064736600461539d565b612cca565b6103ad600c5481565b610329610663366004615158565b612d73565b610381610676366004615448565b612fe1565b6037546103499073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad600b5481565b61030c6106b23660046154ee565b6130fe565b6103ad6106c5366004615158565b6131ce565b6038546103499073ffffffffffffffffffffffffffffffffffffffff1681565b6103816106f83660046151ea565b61325d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061075357506107538261338a565b92915050565b60606000805461076890615518565b80601f016020809104026020016040519081016040528092919081815260200182805461079490615518565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b33600090815260396020526040812054829060ff168061081b575060008181526011602052604090206001015443115b610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f00000000000000000000000000000060448201526064015b60405180910390fd5b61088f8361346d565b91505b50919050565b33600090815260396020526040902054819060ff16806108c8575060008181526011602052604090206001015443115b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6109388383613547565b505050565b60375460009073ffffffffffffffffffffffffffffffffffffffff1615801590610982575060365473ffffffffffffffffffffffffffffffffffffffff828116911614155b80156109a9575060385473ffffffffffffffffffffffffffffffffffffffff828116911614155b610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f436f6e747261637473206e6f7420736574000000000000000000000000000000604482015260640161087d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b8115610aa257610a9e6136cf565b5050565b610a9e6137e5565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b33600090815260396020526040902054819060ff1680610ba7575060008181526011602052604090206001015443115b610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16610cbb57610c2f335b836138b8565b610cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610cc68484846139fb565b50505050565b3360009081526039602052604081205460ff1680610cfb57503260009081526010602052604090206001015443115b610d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff1680610da6575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090206001015443115b610e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6000610e188484613c6d565b3360009081526039602052604090205490915060ff1680610e49575060008181526011602052604090206001015443115b610eaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b9392505050565b60128260128110610ec657600080fd5b018181548110610ed557600080fd5b90600052602060002001600091509150505481565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b61ffff16600c55565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b60385474010000000000000000000000000000000000000000900460ff161561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c726561647920696e69746564000000000000000000000000000000000000604482015260640161087d565b603880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040805160a081018252605081526096602082015260c89181019190915260fa606082015260ff60808201526110f390601290600561501f565b506040805160a08101825260048082526020820181905291810182905260608101829052608081019190915261112d90602490600561501f565b5060408051610120810182526096815260286020820181905260f092820192909252605a606082015260736080820152608760a082015260c081019190915260c760e0820152606461010082015261118990601390600961501f565b5060408051610120810182526003815260076020820152600491810191909152600060608201819052600560808301819052600660a0840152600860c084015260e08301526101008201526111e290602590600961501f565b50604080516101608101825260ff815260876020820152603c9181018290526082606082015260be60808201819052609c60a083015260fa60c0830152607860e0830152610100820192909252601961012082015261014081019190915261124e90601490600b61501f565b5060408051610160810182526000808252602082018190529181018290526006606082018190526080820181905260a0820183905260c0820183905260e0820183905261010082015260086101208201526101408101919091526112b690602690600b61501f565b50604080516102208101825260dd81526064602082015260b591810191909152608c6060820181905260e060808301819052609360a080850191909152605460c0850181905260e48386015261010085019390935261012084019190915260fa61014084015261016083015260f161018083015260cf6101a083015260ad6101c08301526101e082015260fe61020082015261135690601590601161501f565b506040805161022081018252600180825260026020830152600592820183905260006060830181905260808301829052600760a084015260c0830191909152600a60e08301819052610100830193909352610120820192909252600b6101408201819052600c610160830152600d610180830152600e6101a083015260106101c08301526101e08201526102008101919091526113f790602790601161501f565b50604080516101808101825260af815260646020820181905260289282019290925260fa60608201526073608082015260a0810191909152605060c0820152606e60e082015260b4610100820181905260ff61012083015260d261014083015261016082015261146b90601690600c61501f565b506040805161018081018252600381526000602082015260049181019190915260016060820152600b6080820152600760a0820152600860c08201819052600a60e08301526009610100830181905261012083015261014082018190526101608201526114dc90602890600c61501f565b5060408051610180810182526050815260e1602082015260dc91810191909152602360608201526064608082015260f060a080830191909152604660c083015260e082015260af610100820181905260d9610120830152610140820152603c61016082015261154f90601790600c61501f565b506040805161018081018252600181526002602082018190526005928201839052600860608301819052608083019190915260a0820181905260c0820152600960e08201819052610100820152600a61012082018190526007610140830152610160820152906024906115c692910190600c61501f565b50604080516020810190915260ff81526115e490601890600161501f565b5060408051602081019091526000815261160290602a90600161501f565b50604080516101808101825260f3815260bd6020820152603291810191909152601e606082018190526037608083015260b460a0830152605060c0830152605a60e0830152609b61010083015261012082015260de61014082015260ff61016082015261167390601990600c61501f565b506040805161018081018252600181526007602082015260059181019190915260026060820152600b6080820181905260a08201819052600060c08301819052600a60e0840152610100830181905261012083015261014082015260036101608201526116e490602b90600c61501f565b50604080516020810190915260ff815261170290601a90600161501f565b5060408051602081019091526000815261172090602c90600161501f565b50604080516101c081018252606481526050602082015260b191810182905260c76060820181905260ff6080830152602860a083015260d360c083015260e0820192909252601961010082015260e66101208201819052605a61014083015260826101608301526101808201929092526101a08101919091526117a790601b90600e61501f565b50604080516101c081018252600480825260036020830181905292820192909252606081018290526080810191909152600d60a08201819052600960c0830152600160e08301526002610100830152600561012083015261014082015260006101608201526006610180820152600c6101a082015261182a90602d90600e61501f565b50604080516020810190915260ff815261184890601c90600161501f565b5060408051602081019091526000815261186690602e90600161501f565b50604080516020810190915260ff815261188490601d90600161501f565b506040805160208101909152600081526118a290602f90600161501f565b506040805161014081018252605a815260286020820181905260db928201929092526050606082015260b7608082015260e160a082015260c0810191909152607860e0820152603c61010082015260dc61012082015261190690601e90600a61501f565b5060408051610140810182526001815260086020820152600391810182905260026060820152600560808201819052600660a083015260c0820152600960e0820152600461010082015261012081019190915261196790603090600a61501f565b50604080516020810190915260ff815261198590601f90600161501f565b506040805160208101909152600081526119a390603190600161501f565b50604080516101c08101825260ef815260f4602082015260ff9181019190915260ea606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526012600e611a2892910190600e61501f565b50604080516101c081018252600181526002602082018190529181018290526000606082018190526080820183905260a0820192909252600960c082015260e08101919091526005610100820152600461012082018190526101408201819052610160820181905261018082018190526101a0820152611aac90603290600e61501f565b506040805160e081018252605080825260c86020830152609092820192909252609160608201526080810191909152608c60a0820152607860c0820152611af790602190600761501f565b506040805160e081018252600181526006602082015260009181018290526060810182905260036080820181905260a082019290925260c0810191909152611b4390603390600761501f565b50604080516020810190915260ff8152611b6190602290600161501f565b50604080516020810190915260008152611b7f90603490600161501f565b5060408051608081018252600e8152609b602082015260509181019190915260ff6060820152611bb390602390600461501f565b5060408051608081018252600281526003602082018190529181018290526060810191909152611be790603590600461501f565b50565b60248260128110610ec657600080fd5b600a5474010000000000000000000000000000000000000000900460ff1615611c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16611cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b600b54600d54611d099060016155c4565b1115611d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f416c6c20746f6b656e73206d696e746564000000000000000000000000000000604482015260640161087d565b600d8054906000611d81836155dc565b9091555050600d54326000908152601060209081526040918290208251808401909352805483526001015490820152611dbc91908390613d3c565b503273ffffffffffffffffffffffffffffffffffffffff831614801590611dfe575060365473ffffffffffffffffffffffffffffffffffffffff838116911614155b15611e7b57600d546000908152600e602052604090205460ff1615611e4e57600d546040517f29bf7c5f082ef71f7ae50dcd8ed8e9f3d15deb8e7423fefebac51c1405830ba190600090a2611e7b565b600d546040517ff859a674fed6028df0b565cec5c0d658bc759d25680fc04340795b314524807490600090a25b610a9e82600d54613f16565b33600090815260396020526040902054819060ff1680611eb7575060008181526011602052604090206001015443115b611f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b610cc6848484613f30565b600a5474010000000000000000000000000000000000000000900460ff1615611fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b32612030826121cc565b73ffffffffffffffffffffffffffffffffffffffff16146120ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4f6f707320796f7520646f6e2774206f776e2074686174000000000000000000604482015260640161087d565b6000818152600e602052604090205460ff16156120f45760405181907fe99d643a55d54f0e3ef1d8d7b9e2d4b55d61d53b983c1d4b34709b769e28b5c590600090a2612120565b60405181907fbbdf6c8bcf463791f2070d296dedddd6a386c81e0e5fd3f21cbe1075cb56c0e490600090a25b611be781613f4b565b60008061213583614024565b3360009081526039602052604090205490915060ff1680612166575060008181526011602052604090206001015443115b610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604081205460ff16806121fb57503260009081526010602052604090206001015443115b612261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff1680612291575060008181526011602052604090206001015443115b6122f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6000612302846140e2565b3360009081526039602052604090205490915060ff168061234a575073ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090206001015443115b61088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081526039602052604081205460ff16806124af57503260009081526010602052604090206001015443115b612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff168061255a575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090206001015443115b6125c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b61075382614194565b919050565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b6126596000614262565b565b33600090815260396020526040812054829060ff168061268b575060008181526011602052604090206001015443115b6126f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b50506000908152600e6020908152604091829020825161014081018452815460ff1615158082526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101209092019190915290565b6127d66040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b3360009081526039602052604090205460ff168061280557503260009081526010602052604090206001015443115b61286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff168061289b575060008181526011602052604090206001015443115b612901576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b50506000908152600e6020908152604091829020825161014081018452815460ff16151581526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015260099091015461012082015290565b60606001805461076890615518565b3360009081526039602052604090205460ff16806129c957503260009081526010602052604090206001015443115b612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b610a9e82826142d9565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612aba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b600073ffffffffffffffffffffffffffffffffffffffff8416612b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f547261697473206973207a65726f206164647265737300000000000000000000604482015260640161087d565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44756e67656f6e206973207a65726f2061646472657373000000000000000000604482015260640161087d565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f52616e646f6d697a6572206973207a65726f2061646472657373000000000000604482015260640161087d565b506037805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155603680549385169382169390931790925560388054919093169116179055565b33600090815260396020526040902054829060ff1680612cfa575060008181526011602052604090206001015443115b612d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b612d6c858585856142e4565b5050505050565b3360009081526039602052604090205460609060ff1680612da557503260009081526010602052604090206001015443115b612e0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff1680612e3b575060008181526011602052604090206001015443115b612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b60008381526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16612f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604482015260640161087d565b6037546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9091169063c87b56dd90602401600060405180830381865afa158015612f9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261088f9190810190615615565b3360009081526039602052604090205460ff1661305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b60408051808201825242808252436020808401828152326000908152601090925294812093518455935160019093019290925590915b8351811015610cc657604051806040016040528083815260200184815250601160008684815181106130c4576130c4615566565b60209081029190910181015182528181019290925260400160002082518155910151600190910155806130f6816155dc565b915050613090565b3360009081526039602052604081205460ff168061312d57503260009081526010602052604090206001015443115b613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526005602090815260408083209386168352929052205460ff16610eaf565b3360009081526039602052604081205460ff16613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b5060009081526011602052604090206001015490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146132de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff8116613381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b611be781614262565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061341d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061075357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610753565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661351e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161087d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000613552826140e2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b3373ffffffffffffffffffffffffffffffffffffffff82161480613639575061363981336130fe565b6136c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b6109388383614385565b600a5474010000000000000000000000000000000000000000900460ff1615613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137bb3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600a5474010000000000000000000000000000000000000000900460ff16613869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161087d565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336137bb565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161087d565b6000613974836140e2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139e357508373ffffffffffffffffffffffffffffffffffffffff166139cb846107eb565b73ffffffffffffffffffffffffffffffffffffffff16145b806139f357506139f381856130fe565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16613a1b826140e2565b73ffffffffffffffffffffffffffffffffffffffff1614613abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b73ffffffffffffffffffffffffffffffffffffffff8216613b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b613b6b838383614425565b613b76600082614385565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290613bac90849061568c565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290613be79084906155c4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613c7883614194565b8210613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161087d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b613d946040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b613d9d8361452b565b9050600f6000613dac836146d1565b81526020019081526020016000205460001415613ee0576000848152600e60209081526040808320845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169015151781559184015160018301558301516002820155606083015160038201556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015561010083015160088201556101208301516009909101558490600f90613e68846146d1565b8152602081019190915260400160002055805115613eb05760405184907fa8b6bfc40d0d879fa2d5c3910222e7bfdbdb5b72418e7efb67b8cfb76b37dc4c90600090a2610eaf565b60405184907f193f26de6aa5bf27c1179e9196deba3651121dbba49d37044948a1f941dbb8c490600090a2610eaf565b6139f38484604051602001613ef791815260200190565b6040516020818303038152906040528051906020012060001c84613d3c565b610a9e828260405180602001604052806000815250614797565b61093883838360405180602001604052806000815250612cca565b6000613f56826140e2565b9050613f6481600084614425565b613f6f600083614385565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120805460019290613fa590849061568c565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061402f60085490565b82106140bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161087d565b600882815481106140d0576140d0615566565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b600073ffffffffffffffffffffffffffffffffffffffff8216614239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a9e33838361483a565b6142ed33610c29565b614379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610cc684848484614968565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906143df826140e2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff831661448d5761448881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6144ca565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146144ca576144ca8382614a0b565b73ffffffffffffffffffffffffffffffffffffffff82166144ee5761093881614ac2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610938576109388282614b71565b6145836040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b614592600a61ffff84166156a3565b15158082526000906145a55760096145a8565b60005b60109390931c9260ff1690506145cc61ffff84166145c78360006155c4565b614bc2565b602083015260109290921c916145eb61ffff84166145c78360016155c4565b604083015260109290921c9161460a61ffff84166145c78360026155c4565b606083015260109290921c9161462961ffff84166145c78360036155c4565b608083015260109290921c9161464861ffff84166145c78360046155c4565b60a083015260109290921c9161466761ffff84166145c78360056155c4565b60c083015260109290921c9161468661ffff84166145c78360066155c4565b61010083015260109290921c916146a661ffff84166145c78360076155c4565b60e083015260109290921c916146c561ffff84166145c78360086155c4565b61012083015250919050565b80516020808301516040808501516060860151608087015160a088015160c08901516101008a015160e08b01516101208c0151975160009b61475b9b909a99910199151560f81b8a5260018a0198909852602189019690965260418801949094526061870192909252608186015260a185015260c184015260e18301526101018201526101210190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6147a18383614c61565b6147ae6000848484614e2f565b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156148d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6149738484846139fb565b61497f84848484614e2f565b610cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b60006001614a1884614194565b614a22919061568c565b600083815260076020526040902054909150808214614a825773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090614ad49060019061568c565b60008381526009602052604081205460088054939450909284908110614afc57614afc615566565b906000526020600020015490508060088381548110614b1d57614b1d615566565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614b5557614b556156de565b6001900381819060005260206000200160009055905550505050565b6000614b7c83614194565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008060128360128110614bd857614bd8615566565b0154614be490856156a3565b905060128360128110614bf957614bf9615566565b018181548110614c0b57614c0b615566565b9060005260206000200154600885901c1015614c28579050610753565b60248360128110614c3b57614c3b615566565b018181548110614c4d57614c4d615566565b906000526020600020015491505092915050565b73ffffffffffffffffffffffffffffffffffffffff8216614cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b614d7660008383614425565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290614dac9084906155c4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15615014576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290614ea690339089908890889060040161570d565b6020604051808303816000875af1925050508015614eff575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614efc91810190615756565b60015b614fc9573d808015614f2d576040519150601f19603f3d011682016040523d82523d6000602084013e614f32565b606091505b508051614fc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506139f3565b506001949350505050565b82805482825590600052602060002090810192821561505f579160200282015b8281111561505f578251829060ff1690559160200191906001019061503f565b5061506b92915061506f565b5090565b5b8082111561506b5760008155600101615070565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611be757600080fd5b6000602082840312156150c457600080fd5b8135610eaf81615084565b60005b838110156150ea5781810151838201526020016150d2565b83811115610cc65750506000910152565b600081518084526151138160208601602086016150cf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610eaf60208301846150fb565b60006020828403121561516a57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146125c957600080fd5b600080604083850312156151a857600080fd5b6151b183615171565b946020939093013593505050565b803580151581146125c957600080fd5b6000602082840312156151e157600080fd5b610eaf826151bf565b6000602082840312156151fc57600080fd5b610eaf82615171565b60008060006060848603121561521a57600080fd5b61522384615171565b925061523160208501615171565b9150604084013590509250925092565b6000806040838503121561525457600080fd5b50508035926020909101359150565b6000806040838503121561527657600080fd5b61527f83615171565b915061528d602084016151bf565b90509250929050565b6000806000606084860312156152ab57600080fd5b6152b484615171565b92506152c260208501615171565b91506152d060408501615171565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561534f5761534f6152d9565b604052919050565b600067ffffffffffffffff821115615371576153716152d9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600080600080608085870312156153b357600080fd5b6153bc85615171565b93506153ca60208601615171565b925060408501359150606085013567ffffffffffffffff8111156153ed57600080fd5b8501601f810187136153fe57600080fd5b803561541161540c82615357565b615308565b81815288602083850101111561542657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000602080838503121561545b57600080fd5b823567ffffffffffffffff8082111561547357600080fd5b818501915085601f83011261548757600080fd5b813581811115615499576154996152d9565b8060051b91506154aa848301615308565b81815291830184019184810190888411156154c457600080fd5b938501935b838510156154e2578435825293850193908501906154c9565b98975050505050505050565b6000806040838503121561550157600080fd5b61550a83615171565b915061528d60208401615171565b600181811c9082168061552c57607f821691505b60208210811415610892577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156155d7576155d7615595565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561560e5761560e615595565b5060010190565b60006020828403121561562757600080fd5b815167ffffffffffffffff81111561563e57600080fd5b8201601f8101841361564f57600080fd5b805161565d61540c82615357565b81815285602083850101111561567257600080fd5b6156838260208301602086016150cf565b95945050505050565b60008282101561569e5761569e615595565b500390565b6000826156d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261574c60808301846150fb565b9695505050505050565b60006020828403121561576857600080fd5b8151610eaf8161508456fea2646970667358221220e0eb3dd353aac516b9b88be332ad79c345d389fdf6f787801af8b48011e2d28c64736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000ea60
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80636352211e11610191578063b3066d49116100e3578063e1fc334f11610097578063ebd1736811610071578063ebd17368146106b7578063f10fb584146106ca578063f2fde38b146106ea57600080fd5b8063e1fc334f1461067b578063e83157421461069b578063e985e9c5146106a457600080fd5b8063c084f540116100c8578063c084f5401461064c578063c87b56dd14610655578063dce36acd1461066857600080fd5b8063b3066d4914610626578063b88d4fde1461063957600080fd5b80638b3645151161014557806395d89b411161011f57806395d89b41146105eb578063a1b8f374146105f3578063a22cb4651461061357600080fd5b80638b364515146105305780638da5cb5b1461054357806394e568471461056157600080fd5b80637048027511610176578063704802751461050257806370a0823114610515578063715018a61461052857600080fd5b80636352211e146104e75780636abcded1146104fa57600080fd5b806335c826091161024a57806342966c68116101fe5780634f6ccce7116101d85780634f6ccce7146104915780635aadb3bd146104a45780635c975abb146104c457600080fd5b806342966c681461045057806343c885ba146104635780634f02c4201461048857600080fd5b80634018b1f81161022f5780634018b1f81461042257806340c10f191461042a57806342842e0e1461043d57600080fd5b806335c8260914610407578063368383911461040f57600080fd5b80631785f53c116102ac5780632f745c59116102865780632f745c59146103ce57806333df4b2c146103e15780633431a753146103f457600080fd5b80631785f53c1461039657806318160ddd146103a957806323b872dd146103bb57600080fd5b8063081812fc116102dd578063081812fc14610336578063095ea7b31461036e57806316c38b3c1461038357600080fd5b806301ffc9a7146102f957806306fdde0314610321575b600080fd5b61030c6103073660046150b2565b6106fd565b60405190151581526020015b60405180910390f35b610329610759565b6040516103189190615145565b610349610344366004615158565b6107eb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610318565b61038161037c366004615195565b610898565b005b6103816103913660046151cf565b61093d565b6103816103a43660046151ea565b610aaa565b6008545b604051908152602001610318565b6103816103c9366004615205565b610b77565b6103ad6103dc366004615195565b610ccc565b6103ad6103ef366004615241565b610eb6565b610381610402366004615158565b610eea565b610381610f74565b6103ad61041d366004615241565b611bea565b600c546103ad565b610381610438366004615195565b611bfa565b61038161044b366004615205565b611e87565b61038161045e366004615158565b611f28565b60385461030c9074010000000000000000000000000000000000000000900460ff1681565b6103ad600d5481565b6103ad61049f366004615158565b612129565b6036546103499073ffffffffffffffffffffffffffffffffffffffff1681565b600a5474010000000000000000000000000000000000000000900460ff1661030c565b6103496104f5366004615158565b6121cc565b600b546103ad565b6103816105103660046151ea565b6123b0565b6103ad6105233660046151ea565b612480565b6103816125ce565b61030c61053e366004615158565b61265b565b600a5473ffffffffffffffffffffffffffffffffffffffff16610349565b61057461056f366004615158565b61277e565b604051610318919081511515815261014081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525092915050565b61032961298b565b6103ad610601366004615158565b600f6020526000908152604090205481565b610381610621366004615263565b61299a565b610381610634366004615296565b612a39565b61038161064736600461539d565b612cca565b6103ad600c5481565b610329610663366004615158565b612d73565b610381610676366004615448565b612fe1565b6037546103499073ffffffffffffffffffffffffffffffffffffffff1681565b6103ad600b5481565b61030c6106b23660046154ee565b6130fe565b6103ad6106c5366004615158565b6131ce565b6038546103499073ffffffffffffffffffffffffffffffffffffffff1681565b6103816106f83660046151ea565b61325d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061075357506107538261338a565b92915050565b60606000805461076890615518565b80601f016020809104026020016040519081016040528092919081815260200182805461079490615518565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b33600090815260396020526040812054829060ff168061081b575060008181526011602052604090206001015443115b610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f00000000000000000000000000000060448201526064015b60405180910390fd5b61088f8361346d565b91505b50919050565b33600090815260396020526040902054819060ff16806108c8575060008181526011602052604090206001015443115b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6109388383613547565b505050565b60375460009073ffffffffffffffffffffffffffffffffffffffff1615801590610982575060365473ffffffffffffffffffffffffffffffffffffffff828116911614155b80156109a9575060385473ffffffffffffffffffffffffffffffffffffffff828116911614155b610a0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f436f6e747261637473206e6f7420736574000000000000000000000000000000604482015260640161087d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b8115610aa257610a9e6136cf565b5050565b610a9e6137e5565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b33600090815260396020526040902054819060ff1680610ba7575060008181526011602052604090206001015443115b610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16610cbb57610c2f335b836138b8565b610cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610cc68484846139fb565b50505050565b3360009081526039602052604081205460ff1680610cfb57503260009081526010602052604090206001015443115b610d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff1680610da6575073ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604090206001015443115b610e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6000610e188484613c6d565b3360009081526039602052604090205490915060ff1680610e49575060008181526011602052604090206001015443115b610eaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b9392505050565b60128260128110610ec657600080fd5b018181548110610ed557600080fd5b90600052602060002001600091509150505481565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b61ffff16600c55565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b60385474010000000000000000000000000000000000000000900460ff161561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c726561647920696e69746564000000000000000000000000000000000000604482015260640161087d565b603880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040805160a081018252605081526096602082015260c89181019190915260fa606082015260ff60808201526110f390601290600561501f565b506040805160a08101825260048082526020820181905291810182905260608101829052608081019190915261112d90602490600561501f565b5060408051610120810182526096815260286020820181905260f092820192909252605a606082015260736080820152608760a082015260c081019190915260c760e0820152606461010082015261118990601390600961501f565b5060408051610120810182526003815260076020820152600491810191909152600060608201819052600560808301819052600660a0840152600860c084015260e08301526101008201526111e290602590600961501f565b50604080516101608101825260ff815260876020820152603c9181018290526082606082015260be60808201819052609c60a083015260fa60c0830152607860e0830152610100820192909252601961012082015261014081019190915261124e90601490600b61501f565b5060408051610160810182526000808252602082018190529181018290526006606082018190526080820181905260a0820183905260c0820183905260e0820183905261010082015260086101208201526101408101919091526112b690602690600b61501f565b50604080516102208101825260dd81526064602082015260b591810191909152608c6060820181905260e060808301819052609360a080850191909152605460c0850181905260e48386015261010085019390935261012084019190915260fa61014084015261016083015260f161018083015260cf6101a083015260ad6101c08301526101e082015260fe61020082015261135690601590601161501f565b506040805161022081018252600180825260026020830152600592820183905260006060830181905260808301829052600760a084015260c0830191909152600a60e08301819052610100830193909352610120820192909252600b6101408201819052600c610160830152600d610180830152600e6101a083015260106101c08301526101e08201526102008101919091526113f790602790601161501f565b50604080516101808101825260af815260646020820181905260289282019290925260fa60608201526073608082015260a0810191909152605060c0820152606e60e082015260b4610100820181905260ff61012083015260d261014083015261016082015261146b90601690600c61501f565b506040805161018081018252600381526000602082015260049181019190915260016060820152600b6080820152600760a0820152600860c08201819052600a60e08301526009610100830181905261012083015261014082018190526101608201526114dc90602890600c61501f565b5060408051610180810182526050815260e1602082015260dc91810191909152602360608201526064608082015260f060a080830191909152604660c083015260e082015260af610100820181905260d9610120830152610140820152603c61016082015261154f90601790600c61501f565b506040805161018081018252600181526002602082018190526005928201839052600860608301819052608083019190915260a0820181905260c0820152600960e08201819052610100820152600a61012082018190526007610140830152610160820152906024906115c692910190600c61501f565b50604080516020810190915260ff81526115e490601890600161501f565b5060408051602081019091526000815261160290602a90600161501f565b50604080516101808101825260f3815260bd6020820152603291810191909152601e606082018190526037608083015260b460a0830152605060c0830152605a60e0830152609b61010083015261012082015260de61014082015260ff61016082015261167390601990600c61501f565b506040805161018081018252600181526007602082015260059181019190915260026060820152600b6080820181905260a08201819052600060c08301819052600a60e0840152610100830181905261012083015261014082015260036101608201526116e490602b90600c61501f565b50604080516020810190915260ff815261170290601a90600161501f565b5060408051602081019091526000815261172090602c90600161501f565b50604080516101c081018252606481526050602082015260b191810182905260c76060820181905260ff6080830152602860a083015260d360c083015260e0820192909252601961010082015260e66101208201819052605a61014083015260826101608301526101808201929092526101a08101919091526117a790601b90600e61501f565b50604080516101c081018252600480825260036020830181905292820192909252606081018290526080810191909152600d60a08201819052600960c0830152600160e08301526002610100830152600561012083015261014082015260006101608201526006610180820152600c6101a082015261182a90602d90600e61501f565b50604080516020810190915260ff815261184890601c90600161501f565b5060408051602081019091526000815261186690602e90600161501f565b50604080516020810190915260ff815261188490601d90600161501f565b506040805160208101909152600081526118a290602f90600161501f565b506040805161014081018252605a815260286020820181905260db928201929092526050606082015260b7608082015260e160a082015260c0810191909152607860e0820152603c61010082015260dc61012082015261190690601e90600a61501f565b5060408051610140810182526001815260086020820152600391810182905260026060820152600560808201819052600660a083015260c0820152600960e0820152600461010082015261012081019190915261196790603090600a61501f565b50604080516020810190915260ff815261198590601f90600161501f565b506040805160208101909152600081526119a390603190600161501f565b50604080516101c08101825260ef815260f4602082015260ff9181019190915260ea606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526012600e611a2892910190600e61501f565b50604080516101c081018252600181526002602082018190529181018290526000606082018190526080820183905260a0820192909252600960c082015260e08101919091526005610100820152600461012082018190526101408201819052610160820181905261018082018190526101a0820152611aac90603290600e61501f565b506040805160e081018252605080825260c86020830152609092820192909252609160608201526080810191909152608c60a0820152607860c0820152611af790602190600761501f565b506040805160e081018252600181526006602082015260009181018290526060810182905260036080820181905260a082019290925260c0810191909152611b4390603390600761501f565b50604080516020810190915260ff8152611b6190602290600161501f565b50604080516020810190915260008152611b7f90603490600161501f565b5060408051608081018252600e8152609b602082015260509181019190915260ff6060820152611bb390602390600461501f565b5060408051608081018252600281526003602082018190529181018290526060810191909152611be790603590600461501f565b50565b60248260128110610ec657600080fd5b600a5474010000000000000000000000000000000000000000900460ff1615611c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16611cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b600b54600d54611d099060016155c4565b1115611d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f416c6c20746f6b656e73206d696e746564000000000000000000000000000000604482015260640161087d565b600d8054906000611d81836155dc565b9091555050600d54326000908152601060209081526040918290208251808401909352805483526001015490820152611dbc91908390613d3c565b503273ffffffffffffffffffffffffffffffffffffffff831614801590611dfe575060365473ffffffffffffffffffffffffffffffffffffffff838116911614155b15611e7b57600d546000908152600e602052604090205460ff1615611e4e57600d546040517f29bf7c5f082ef71f7ae50dcd8ed8e9f3d15deb8e7423fefebac51c1405830ba190600090a2611e7b565b600d546040517ff859a674fed6028df0b565cec5c0d658bc759d25680fc04340795b314524807490600090a25b610a9e82600d54613f16565b33600090815260396020526040902054819060ff1680611eb7575060008181526011602052604090206001015443115b611f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b610cc6848484613f30565b600a5474010000000000000000000000000000000000000000900460ff1615611fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff16612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b32612030826121cc565b73ffffffffffffffffffffffffffffffffffffffff16146120ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4f6f707320796f7520646f6e2774206f776e2074686174000000000000000000604482015260640161087d565b6000818152600e602052604090205460ff16156120f45760405181907fe99d643a55d54f0e3ef1d8d7b9e2d4b55d61d53b983c1d4b34709b769e28b5c590600090a2612120565b60405181907fbbdf6c8bcf463791f2070d296dedddd6a386c81e0e5fd3f21cbe1075cb56c0e490600090a25b611be781613f4b565b60008061213583614024565b3360009081526039602052604090205490915060ff1680612166575060008181526011602052604090206001015443115b610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604081205460ff16806121fb57503260009081526010602052604090206001015443115b612261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff1680612291575060008181526011602052604090206001015443115b6122f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b6000612302846140e2565b3360009081526039602052604090205490915060ff168061234a575073ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090206001015443115b61088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff16600090815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081526039602052604081205460ff16806124af57503260009081526010602052604090206001015443115b612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b3360009081526039602052604090205460ff168061255a575073ffffffffffffffffffffffffffffffffffffffff821660009081526010602052604090206001015443115b6125c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b61075382614194565b919050565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461264f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b6126596000614262565b565b33600090815260396020526040812054829060ff168061268b575060008181526011602052604090206001015443115b6126f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b50506000908152600e6020908152604091829020825161014081018452815460ff1615158082526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008810154610100840152600901546101209092019190915290565b6127d66040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b3360009081526039602052604090205460ff168061280557503260009081526010602052604090206001015443115b61286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff168061289b575060008181526011602052604090206001015443115b612901576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b50506000908152600e6020908152604091829020825161014081018452815460ff16151581526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015260099091015461012082015290565b60606001805461076890615518565b3360009081526039602052604090205460ff16806129c957503260009081526010602052604090206001015443115b612a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b610a9e82826142d9565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612aba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b600073ffffffffffffffffffffffffffffffffffffffff8416612b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f547261697473206973207a65726f206164647265737300000000000000000000604482015260640161087d565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44756e67656f6e206973207a65726f2061646472657373000000000000000000604482015260640161087d565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f52616e646f6d697a6572206973207a65726f2061646472657373000000000000604482015260640161087d565b506037805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155603680549385169382169390931790925560388054919093169116179055565b33600090815260396020526040902054829060ff1680612cfa575060008181526011602052604090206001015443115b612d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b612d6c858585856142e4565b5050505050565b3360009081526039602052604090205460609060ff1680612da557503260009081526010602052604090206001015443115b612e0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b33600090815260396020526040902054829060ff1680612e3b575060008181526011602052604090206001015443115b612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b60008381526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16612f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604482015260640161087d565b6037546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9091169063c87b56dd90602401600060405180830381865afa158015612f9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261088f9190810190615615565b3360009081526039602052604090205460ff1661305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b60408051808201825242808252436020808401828152326000908152601090925294812093518455935160019093019290925590915b8351811015610cc657604051806040016040528083815260200184815250601160008684815181106130c4576130c4615566565b60209081029190910181015182528181019290925260400160002082518155910151600190910155806130f6816155dc565b915050613090565b3360009081526039602052604081205460ff168061312d57503260009081526010602052604090206001015443115b613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f686d6d6d6d207768617420646f696e673f000000000000000000000000000000604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526005602090815260408083209386168352929052205460ff16610eaf565b3360009081526039602052604081205460ff16613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c207468697300000000000000604482015260640161087d565b5060009081526011602052604090206001015490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146132de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff8116613381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b611be781614262565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061341d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061075357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610753565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661351e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161087d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000613552826140e2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b3373ffffffffffffffffffffffffffffffffffffffff82161480613639575061363981336130fe565b6136c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b6109388383614385565b600a5474010000000000000000000000000000000000000000900460ff1615613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161087d565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137bb3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600a5474010000000000000000000000000000000000000000900460ff16613869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161087d565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336137bb565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161087d565b6000613974836140e2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139e357508373ffffffffffffffffffffffffffffffffffffffff166139cb846107eb565b73ffffffffffffffffffffffffffffffffffffffff16145b806139f357506139f381856130fe565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16613a1b826140e2565b73ffffffffffffffffffffffffffffffffffffffff1614613abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b73ffffffffffffffffffffffffffffffffffffffff8216613b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b613b6b838383614425565b613b76600082614385565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290613bac90849061568c565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290613be79084906155c4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613c7883614194565b8210613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161087d565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b613d946040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b613d9d8361452b565b9050600f6000613dac836146d1565b81526020019081526020016000205460001415613ee0576000848152600e60209081526040808320845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169015151781559184015160018301558301516002820155606083015160038201556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015561010083015160088201556101208301516009909101558490600f90613e68846146d1565b8152602081019190915260400160002055805115613eb05760405184907fa8b6bfc40d0d879fa2d5c3910222e7bfdbdb5b72418e7efb67b8cfb76b37dc4c90600090a2610eaf565b60405184907f193f26de6aa5bf27c1179e9196deba3651121dbba49d37044948a1f941dbb8c490600090a2610eaf565b6139f38484604051602001613ef791815260200190565b6040516020818303038152906040528051906020012060001c84613d3c565b610a9e828260405180602001604052806000815250614797565b61093883838360405180602001604052806000815250612cca565b6000613f56826140e2565b9050613f6481600084614425565b613f6f600083614385565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120805460019290613fa590849061568c565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555183919073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061402f60085490565b82106140bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161087d565b600882815481106140d0576140d0615566565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b600073ffffffffffffffffffffffffffffffffffffffff8216614239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a9e33838361483a565b6142ed33610c29565b614379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610cc684848484614968565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906143df826140e2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b73ffffffffffffffffffffffffffffffffffffffff831661448d5761448881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6144ca565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146144ca576144ca8382614a0b565b73ffffffffffffffffffffffffffffffffffffffff82166144ee5761093881614ac2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610938576109388282614b71565b6145836040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b614592600a61ffff84166156a3565b15158082526000906145a55760096145a8565b60005b60109390931c9260ff1690506145cc61ffff84166145c78360006155c4565b614bc2565b602083015260109290921c916145eb61ffff84166145c78360016155c4565b604083015260109290921c9161460a61ffff84166145c78360026155c4565b606083015260109290921c9161462961ffff84166145c78360036155c4565b608083015260109290921c9161464861ffff84166145c78360046155c4565b60a083015260109290921c9161466761ffff84166145c78360056155c4565b60c083015260109290921c9161468661ffff84166145c78360066155c4565b61010083015260109290921c916146a661ffff84166145c78360076155c4565b60e083015260109290921c916146c561ffff84166145c78360086155c4565b61012083015250919050565b80516020808301516040808501516060860151608087015160a088015160c08901516101008a015160e08b01516101208c0151975160009b61475b9b909a99910199151560f81b8a5260018a0198909852602189019690965260418801949094526061870192909252608186015260a185015260c184015260e18301526101018201526101210190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6147a18383614c61565b6147ae6000848484614e2f565b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156148d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6149738484846139fb565b61497f84848484614e2f565b610cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b60006001614a1884614194565b614a22919061568c565b600083815260076020526040902054909150808214614a825773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090614ad49060019061568c565b60008381526009602052604081205460088054939450909284908110614afc57614afc615566565b906000526020600020015490508060088381548110614b1d57614b1d615566565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614b5557614b556156de565b6001900381819060005260206000200160009055905550505050565b6000614b7c83614194565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008060128360128110614bd857614bd8615566565b0154614be490856156a3565b905060128360128110614bf957614bf9615566565b018181548110614c0b57614c0b615566565b9060005260206000200154600885901c1015614c28579050610753565b60248360128110614c3b57614c3b615566565b018181548110614c4d57614c4d615566565b906000526020600020015491505092915050565b73ffffffffffffffffffffffffffffffffffffffff8216614cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b614d7660008383614425565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290614dac9084906155c4565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15615014576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290614ea690339089908890889060040161570d565b6020604051808303816000875af1925050508015614eff575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614efc91810190615756565b60015b614fc9573d808015614f2d576040519150601f19603f3d011682016040523d82523d6000602084013e614f32565b606091505b508051614fc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161087d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506139f3565b506001949350505050565b82805482825590600052602060002090810192821561505f579160200282015b8281111561505f578251829060ff1690559160200191906001019061503f565b5061506b92915061506f565b5090565b5b8082111561506b5760008155600101615070565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611be757600080fd5b6000602082840312156150c457600080fd5b8135610eaf81615084565b60005b838110156150ea5781810151838201526020016150d2565b83811115610cc65750506000910152565b600081518084526151138160208601602086016150cf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610eaf60208301846150fb565b60006020828403121561516a57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146125c957600080fd5b600080604083850312156151a857600080fd5b6151b183615171565b946020939093013593505050565b803580151581146125c957600080fd5b6000602082840312156151e157600080fd5b610eaf826151bf565b6000602082840312156151fc57600080fd5b610eaf82615171565b60008060006060848603121561521a57600080fd5b61522384615171565b925061523160208501615171565b9150604084013590509250925092565b6000806040838503121561525457600080fd5b50508035926020909101359150565b6000806040838503121561527657600080fd5b61527f83615171565b915061528d602084016151bf565b90509250929050565b6000806000606084860312156152ab57600080fd5b6152b484615171565b92506152c260208501615171565b91506152d060408501615171565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561534f5761534f6152d9565b604052919050565b600067ffffffffffffffff821115615371576153716152d9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600080600080608085870312156153b357600080fd5b6153bc85615171565b93506153ca60208601615171565b925060408501359150606085013567ffffffffffffffff8111156153ed57600080fd5b8501601f810187136153fe57600080fd5b803561541161540c82615357565b615308565b81815288602083850101111561542657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000602080838503121561545b57600080fd5b823567ffffffffffffffff8082111561547357600080fd5b818501915085601f83011261548757600080fd5b813581811115615499576154996152d9565b8060051b91506154aa848301615308565b81815291830184019184810190888411156154c457600080fd5b938501935b838510156154e2578435825293850193908501906154c9565b98975050505050505050565b6000806040838503121561550157600080fd5b61550a83615171565b915061528d60208401615171565b600181811c9082168061552c57607f821691505b60208210811415610892577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156155d7576155d7615595565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561560e5761560e615595565b5060010190565b60006020828403121561562757600080fd5b815167ffffffffffffffff81111561563e57600080fd5b8201601f8101841361564f57600080fd5b805161565d61540c82615357565b81815285602083850101111561567257600080fd5b6156838260208301602086016150cf565b95945050505050565b60008282101561569e5761569e615595565b500390565b6000826156d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261574c60808301846150fb565b9695505050505050565b60006020828403121561576857600080fd5b8151610eaf8161508456fea2646970667358221220e0eb3dd353aac516b9b88be332ad79c345d389fdf6f787801af8b48011e2d28c64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000ea60
-----Decoded View---------------
Arg [0] : _maxTokens (uint256): 60000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000ea60
Deployed Bytecode Sourcemap
389:16654:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:222:10;;;;;;:::i;:::-;;:::i;:::-;;;707:14:18;;700:22;682:41;;670:2;655:18;990:222:10;;;;;;;;2488:98:7;;;:::i;:::-;;;;;;;:::i;15891:196:0:-;;;;;;:::i;:::-;;:::i;:::-;;;1905:42:18;1893:55;;;1875:74;;1863:2;1848:18;15891:196:0;1729:226:18;15703:182:0;;;;;;:::i;:::-;;:::i;:::-;;12828:135;;;;;;:::i;:::-;;:::i;13262:91::-;;;;;;:::i;:::-;;:::i;1615:111:10:-;1702:10;:17;1615:111;;;3107:25:18;;;3095:2;3080:18;1615:111:10;2961:177:18;8012:446:0;;;;;;:::i;:::-;;:::i;13883:595::-;;;;;;:::i;:::-;;:::i;1816:29::-;;;;;;:::i;:::-;;:::i;12647:113::-;;;;;;:::i;:::-;;:::i;2529:2421::-;;;:::i;1978:28::-;;;;;;:::i;:::-;;:::i;12463:101::-;12546:11;;12463:101;;6595:554;;;;;;:::i;:::-;;:::i;16543:228::-;;;;;;:::i;:::-;;:::i;7247:348::-;;;;;;:::i;:::-;;:::i;2246:18::-;;;;;;;;;;;;1061:30;;;;;;15338:359;;;;;;:::i;:::-;;:::i;2096:23::-;;;;;;;;;1098:84:6;1168:7;;;;;;;1098:84;;14873:459:0;;;;;;:::i;:::-;;:::i;12359:98::-;12441:9;;12359:98;;13064:87;;;;;;:::i;:::-;;:::i;14488:379::-;;;;;;:::i;:::-;;:::i;1668:101:5:-;;;:::i;12073:280:0:-;;;;;;:::i;:::-;;:::i;1036:85:5:-;1108:6;;;;1036:85;;13378:203:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;4196:13:18;;516;509:21;497:34;;4167:3;4152:19;;4277:4;4269:6;4265:17;4259:24;4252:4;4241:9;4237:20;4230:54;4340:4;4332:6;4328:17;4322:24;4315:4;4304:9;4300:20;4293:54;4403:4;4395:6;4391:17;4385:24;4378:4;4367:9;4363:20;4356:54;4466:4;4458:6;4454:17;4448:24;4441:4;4430:9;4426:20;4419:54;4529:4;4521:6;4517:17;4511:24;4504:4;4493:9;4489:20;4482:54;4592:4;4584:6;4580:17;4574:24;4567:4;4556:9;4552:20;4545:54;4655:4;4647:6;4643:17;4637:24;4630:4;4619:9;4615:20;4608:54;4681:6;4741:2;4733:6;4729:15;4723:22;4718:2;4707:9;4703:18;4696:50;;4765:6;4825:2;4817:6;4813:15;4807:22;4802:2;4791:9;4787:18;4780:50;;3977:859;;;;;2650:102:7;;;:::i;1345:55:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;16093:206;;;;;;:::i;:::-;;:::i;5733:431::-;;;;;;:::i;:::-;;:::i;16777:263::-;;;;;;:::i;:::-;;:::i;981:26::-;;;;;;13587:257;;;;;;:::i;:::-;;:::i;7601:405::-;;;;;;:::i;:::-;;:::i;2152:21::-;;;;;;;;;889:24;;;;;;16305:228;;;;;;:::i;:::-;;:::i;6191:209::-;;;;;;:::i;:::-;;:::i;2210:29::-;;;;;;;;;1918:198:5;;;;;;:::i;:::-;;:::i;990:222:10:-;1092:4;1115:50;;;1130:35;1115:50;;:90;;;1169:36;1193:11;1169:23;:36::i;:::-;1108:97;990:222;-1:-1:-1;;990:222:10:o;2488:98:7:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;15891:196:0:-;719:10:14;16028:7:0;5616:20;;;:6;:20;;;;;;16010:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;;;;;;;;;16054:26:::1;16072:7;16054:17;:26::i;:::-;16047:33;;5719:1;15891:196:::0;;;;:::o;15703:182::-;719:10:14;5616:20:0;;;;:6;:20;;;;;;15833:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;9266:341:18;5608:101:0;15852:26:::1;15866:2;15870:7;15852:13;:26::i;:::-;15703:182:::0;;;:::o;12828:135::-;5103:6;;5039:12;;5095:23;5103:6;5095:23;;;;:63;;-1:-1:-1;5142:7:0;;5134:24;;;;5142:7;;5134:24;;5095:63;:106;;;;-1:-1:-1;5182:10:0;;5174:27;;;;5182:10;;5174:27;;5095:106;5074:170;;;;;;;9814:2:18;5074:170:0;;;9796:21:18;9853:2;9833:18;;;9826:30;9892:19;9872:18;;;9865:47;9929:18;;5074:170:0;9612:341:18;5074:170:0;1108:6:5;;1248:23:::1;1108:6:::0;719:10:14;1248:23:5::1;1240:68;;;::::0;::::1;::::0;;10160:2:18;1240:68:5::1;::::0;::::1;10142:21:18::0;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5::1;9958:356:18::0;1240:68:5::1;12914:7:0::2;12910:46;;;12923:8;:6;:8::i;:::-;5029:233:::0;12828:135;:::o;12910:46::-:2;12946:10;:8;:10::i;13262:91::-:0;1108:6:5;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;13326:12:0::1;;13341:5;13326:12:::0;;;:6:::1;:12;::::0;;;;:20;;;::::1;::::0;;13262:91::o;8012:446::-;719:10:14;5616:20:0;;;;:6;:20;;;;;;8169:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;9266:341:18;5608:101:0;719:10:14;8254:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;::::1;;8249:164;;8297:41;719:10:14::0;8316:12:0::1;8330:7;8297:18;:41::i;:::-;8276:137;;;::::0;::::1;::::0;;10521:2:18;8276:137:0::1;::::0;::::1;10503:21:18::0;10560:2;10540:18;;;10533:30;10599:34;10579:18;;;10572:62;10670:19;10650:18;;;10643:47;10707:19;;8276:137:0::1;10319:413:18::0;8276:137:0::1;8423:28;8433:4;8439:2;8443:7;8423:9;:28::i;:::-;8012:446:::0;;;;:::o;13883:595::-;719:10:14;14062:7:0;5375:20;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;719:10:14;14176:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;::::1;;::::0;:71:::1;;-1:-1:-1::0;14200:23:0::1;::::0;::::1;;::::0;;;:16:::1;:23;::::0;;;;:32:::1;;::::0;14235:12:::1;-1:-1:-1::0;14176:71:0::1;14168:101;;;::::0;::::1;::::0;;9468:2:18;14168:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;14168:101:0::1;9266:341:18::0;14168:101:0::1;14279:15;14297:39;14323:5;14330;14297:25;:39::i;:::-;719:10:14::0;14354:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;14279:57;;-1:-1:-1;14354:20:0::1;;::::0;:71:::1;;-1:-1:-1::0;14378:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:32:::1;;::::0;14413:12:::1;-1:-1:-1::0;14354:71:0::1;14346:101;;;::::0;::::1;::::0;;9468:2:18;14346:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;14346:101:0::1;9266:341:18::0;14346:101:0::1;14464:7:::0;13883:595;-1:-1:-1;;;13883:595:0:o;1816:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12647:113::-;1108:6:5;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;12720:33:0::1;;:11;:33:::0;12647:113::o;2529:2421::-;1108:6:5;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;2601:6:0::1;::::0;;;::::1;;;2600:7;2592:34;;;::::0;::::1;::::0;;10939:2:18;2592:34:0::1;::::0;::::1;10921:21:18::0;10978:2;10958:18;;;10951:30;11017:16;10997:18;;;10990:44;11051:18;;2592:34:0::1;10737:338:18::0;2592:34:0::1;2636:6;:13:::0;;;::::1;::::0;::::1;::::0;;2736:38:::1;::::0;;::::1;::::0;::::1;::::0;;2751:2:::1;2736:38:::0;;2755:3:::1;2736:38;::::0;::::1;::::0;2760:3:::1;2736:38:::0;;;;;;;2765:3:::1;2736:38:::0;;;;2636:13:::1;2736:38:::0;;;;::::1;::::0;:8:::1;::::0;:38:::1;;:::i;:::-;-1:-1:-1::0;2784:28:0::1;::::0;;::::1;::::0;::::1;::::0;;2798:1:::1;2784:28:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;:7:::1;::::0;:28:::1;;:::i;:::-;-1:-1:-1::0;2838:56:0::1;::::0;;::::1;::::0;::::1;::::0;;2853:3:::1;2838:56:::0;;2858:2:::1;2838:56;::::0;::::1;::::0;;;2862:3:::1;2838:56:::0;;;;;;;2867:2:::1;2838:56:::0;;;;2871:3:::1;2838:56:::0;;;;2876:3:::1;2838:56:::0;;;;;;;;;;;2885:3:::1;2838:56:::0;;;;2890:3:::1;2838:56:::0;;;;::::1;::::0;:11;;:56:::1;;:::i;:::-;-1:-1:-1::0;2904:40:0::1;::::0;;::::1;::::0;::::1;::::0;;2918:1:::1;2904:40:::0;;2921:1:::1;2904:40;::::0;::::1;::::0;2924:1:::1;2904:40:::0;;;;;;;-1:-1:-1;2904:40:0;;;;;;2930:1:::1;2904:40:::0;;;;;;2933:1:::1;2904:40:::0;;;;2936:1:::1;2904:40:::0;;;;;;;;;;;;::::1;::::0;:10;;:40:::1;;:::i;:::-;-1:-1:-1::0;2971:67:0::1;::::0;;::::1;::::0;::::1;::::0;;2987:3:::1;2971:67:::0;;2992:3:::1;2971:67;::::0;::::1;::::0;2997:2:::1;2971:67:::0;;;;;;3001:3:::1;2971:67:::0;;;;3006:3:::1;2971:67:::0;;;;;;3011:3:::1;2971:67:::0;;;;3016:3:::1;2971:67:::0;;;;3021:3:::1;2971:67:::0;;;;;;;;;;;3030:2:::1;2971:67:::0;;;;;;;;;;;::::1;::::0;:11;;:67:::1;;:::i;:::-;-1:-1:-1::0;3048:46:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;3048:46:0;;;::::1;::::0;::::1;::::0;;;;;;;;;3071:1:::1;3048:46:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3089:1:::1;3048:46:::0;;;;;;;;;;;::::1;::::0;:10;;:46:::1;;:::i;:::-;-1:-1:-1::0;3120:97:0::1;::::0;;::::1;::::0;::::1;::::0;;3135:3:::1;3120:97:::0;;3140:3:::1;3120:97;::::0;::::1;::::0;3145:3:::1;3120:97:::0;;;;;;;3150:3:::1;3120:97:::0;;;;;;3155:3:::1;3120:97:::0;;;;;;3160:3:::1;3120:97:::0;;;;;;;;3165:2:::1;3120:97:::0;;;;;;3169:3:::1;3120:97:::0;;;;;;;;;;;;;;;;;;3184:3:::1;3120:97:::0;;;;;;;;3194:3:::1;3120:97:::0;;;;3199:3:::1;3120:97:::0;;;;3204:3:::1;3120:97:::0;;;;;;;;3213:3:::1;3120:97:::0;;;;::::1;::::0;:11;;:97:::1;;:::i;:::-;-1:-1:-1::0;3227:72:0::1;::::0;;::::1;::::0;::::1;::::0;;3241:1:::1;3227:72:::0;;;3244:1:::1;3227:72;::::0;::::1;::::0;3247:1:::1;3227:72:::0;;;;;;-1:-1:-1;3227:72:0;;;;;;;;;;;;3256:1:::1;3227:72:::0;;;;;;;;;;;3262:2:::1;3227:72:::0;;;;;;;;;;;;;;;;;;;;3273:2:::1;3227:72:::0;;;;;;3277:2:::1;3227:72:::0;;;;3281:2:::1;3227:72:::0;;;;3285:2:::1;3227:72:::0;;;;3289:2:::1;3227:72:::0;;;;;;;;;;;;;;;::::1;::::0;:10;;:72:::1;;:::i;:::-;-1:-1:-1::0;3325:72:0::1;::::0;;::::1;::::0;::::1;::::0;;3340:3:::1;3325:72:::0;;3345:3:::1;3325:72;::::0;::::1;::::0;;;3350:2:::1;3325:72:::0;;;;;;;3354:3:::1;3325:72:::0;;;;3359:3:::1;3325:72:::0;;;;;;;;;;;3369:2:::1;3325:72:::0;;;;3373:3:::1;3325:72:::0;;;;3378:3:::1;3325:72:::0;;;;;;::::1;::::0;;;;3388:3:::1;3325:72:::0;;;;;;;;::::1;::::0;:11;;:72:::1;;:::i;:::-;-1:-1:-1::0;3407:51:0::1;::::0;;::::1;::::0;::::1;::::0;;3421:1:::1;3407:51:::0;;-1:-1:-1;3407:51:0::1;::::0;::::1;::::0;3427:1:::1;3407:51:::0;;;;;;;3430:1:::1;3407:51:::0;;;;3433:2:::1;3407:51:::0;;;;3437:1:::1;3407:51:::0;;;;3440:1:::1;3407:51:::0;;;;;;3443:2:::1;3407:51:::0;;;;3447:1:::1;3407:51:::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;:10;;:51:::1;;:::i;:::-;-1:-1:-1::0;3485:70:0::1;::::0;;::::1;::::0;::::1;::::0;;3500:2:::1;3485:70:::0;;3504:3:::1;3485:70;::::0;::::1;::::0;3509:3:::1;3485:70:::0;;;;;;;3514:2:::1;3485:70:::0;;;;3518:3:::1;3485:70:::0;;;;3523:3:::1;3485:70:::0;;;;;;;;3528:2:::1;3485:70:::0;;;;;;;;3537:3:::1;3485:70:::0;;;;;;3542:3:::1;3485:70:::0;;;;;;;;3552:2:::1;3485:70:::0;;;;::::1;::::0;:11;;:70:::1;;:::i;:::-;-1:-1:-1::0;3565:51:0::1;::::0;;::::1;::::0;::::1;::::0;;3579:1:::1;3565:51:::0;;3582:1:::1;3565:51;::::0;::::1;::::0;;;3585:1:::1;3565:51:::0;;;;;;3588:1:::1;3565:51:::0;;;;;;;;;;;;;;;;;;;;;;;3600:1:::1;3565:51:::0;;;;;;;;;;3606:2:::1;3565:51:::0;;;;;;3610:1:::1;3565:51:::0;;;;;;;;;:7:::1;::::0;:51:::1;::::0;:10;::::1;::::0;:51:::1;;:::i;:::-;-1:-1:-1::0;3642:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;3657:3:::1;3642:19:::0;;::::1;::::0;:11;;:19:::1;;:::i;:::-;-1:-1:-1::0;3671:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;3671:16:0;;::::1;::::0;:10;;:16:::1;;:::i;:::-;-1:-1:-1::0;3713:68:0::1;::::0;;::::1;::::0;::::1;::::0;;3728:3:::1;3713:68:::0;;3733:3:::1;3713:68;::::0;::::1;::::0;3738:2:::1;3713:68:::0;;;;;;;3742:2:::1;3713:68:::0;;;;;;3746:2:::1;3713:68:::0;;;;3750:3:::1;3713:68:::0;;;;3755:2:::1;3713:68:::0;;;;3759:2:::1;3713:68:::0;;;;3763:3:::1;3713:68:::0;;;;;;;;3772:3:::1;3713:68:::0;;;;::::1;::::0;;;;::::1;::::0;:11;;:68:::1;;:::i;:::-;-1:-1:-1::0;3791:53:0::1;::::0;;::::1;::::0;::::1;::::0;;3805:1:::1;3791:53:::0;;3808:1:::1;3791:53;::::0;::::1;::::0;3811:1:::1;3791:53:::0;;;;;;;3814:1:::1;3791:53:::0;;;;3817:2:::1;3791:53:::0;;;;;;;;;;;;-1:-1:-1;3791:53:0;;;;;;3828:2:::1;3791:53:::0;;;;;;;;;;;;;;;;;;3842:1:::1;3791:53:::0;;;;::::1;::::0;:10;;:53:::1;;:::i;:::-;-1:-1:-1::0;3875:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;3890:3:::1;3875:19:::0;;::::1;::::0;:11;;:19:::1;;:::i;:::-;-1:-1:-1::0;3904:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;3904:16:0;;::::1;::::0;:10;;:16:::1;;:::i;:::-;-1:-1:-1::0;3963:80:0::1;::::0;;::::1;::::0;::::1;::::0;;3978:3:::1;3963:80:::0;;3983:2:::1;3963:80;::::0;::::1;::::0;3987:3:::1;3963:80:::0;;;;;;3992:3:::1;3963:80:::0;;;;;;::::1;::::0;;;;4002:2:::1;3963:80:::0;;;;4006:3:::1;3963:80:::0;;;;;;;;;;;4016:2:::1;3963:80:::0;;;;4020:3:::1;3963:80:::0;;;;;;4025:2:::1;3963:80:::0;;;;4029:3:::1;3963:80:::0;;;;;;;;;;;;;;;;;;::::1;::::0;:11;;:80:::1;;:::i;:::-;-1:-1:-1::0;4053:58:0::1;::::0;;::::1;::::0;::::1;::::0;;4067:1:::1;4053:58:::0;;;4070:1:::1;4053:58;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;4082:2:::1;4053:58:::0;;;;;;4086:1:::1;4053:58:::0;;;;4089:1:::1;4053:58:::0;;;;4092:1:::1;4053:58:::0;;;;4095:1:::1;4053:58:::0;;;;;;;;-1:-1:-1;4053:58:0;;;;4105:1:::1;4053:58:::0;;;;4108:2:::1;4053:58:::0;;;;::::1;::::0;:10;;:58:::1;;:::i;:::-;-1:-1:-1::0;4137:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;4153:3:::1;4137:20:::0;;::::1;::::0;:12;;:20:::1;;:::i;:::-;-1:-1:-1::0;4167:17:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;4167:17:0;;::::1;::::0;:11;;:17:::1;;:::i;:::-;-1:-1:-1::0;4211:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;4227:3:::1;4211:20:::0;;::::1;::::0;:12;;:20:::1;;:::i;:::-;-1:-1:-1::0;4241:17:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;4241:17:0;;::::1;::::0;:11;;:17:::1;;:::i;:::-;-1:-1:-1::0;4284:60:0::1;::::0;;::::1;::::0;::::1;::::0;;4300:2:::1;4284:60:::0;;4304:2:::1;4284:60;::::0;::::1;::::0;;;4308:3:::1;4284:60:::0;;;;;;;4313:2:::1;4284:60:::0;;;;4317:3:::1;4284:60:::0;;;;4322:3:::1;4284:60:::0;;;;;;;;;;;4331:3:::1;4284:60:::0;;;;4336:2:::1;4284:60:::0;;;;4340:3:::1;4284:60:::0;;;;::::1;::::0;:12;;:60:::1;;:::i;:::-;-1:-1:-1::0;4354:44:0::1;::::0;;::::1;::::0;::::1;::::0;;4369:1:::1;4354:44:::0;;4372:1:::1;4354:44;::::0;::::1;::::0;4375:1:::1;4354:44:::0;;;;;;4378:1:::1;4354:44:::0;;;;4381:1:::1;4354:44:::0;;;;;;4384:1:::1;4354:44:::0;;;;;;;;4390:1:::1;4354:44:::0;;;;4393:1:::1;4354:44:::0;;;;;;;;;;;::::1;::::0;:11;;:44:::1;;:::i;:::-;-1:-1:-1::0;4424:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;4440:3:::1;4424:20:::0;;::::1;::::0;:12;;:20:::1;;:::i;:::-;-1:-1:-1::0;4454:17:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;4454:17:0;;::::1;::::0;:11;;:17:::1;;:::i;:::-;-1:-1:-1::0;4498:85:0::1;::::0;;::::1;::::0;::::1;::::0;;4514:3:::1;4498:85:::0;;4519:3:::1;4498:85;::::0;::::1;::::0;::::1;::::0;;;;;;;4529:3:::1;4498:85:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8:::1;4507:2;4498:85;::::0;:12;::::1;::::0;:85:::1;;:::i;:::-;-1:-1:-1::0;4593:56:0::1;::::0;;::::1;::::0;::::1;::::0;;4608:1:::1;4593:56:::0;;4611:1:::1;4593:56;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;4593:56:0;;;;;;;;;;;;;;;;;;;4626:1:::1;4593:56:::0;;;;;;;;;;;4632:1:::1;4593:56:::0;;;;4635:1:::1;4593:56:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;:11;;4601:2:::1;4593:56;:::i;:::-;-1:-1:-1::0;4676:48:0::1;::::0;;::::1;::::0;::::1;::::0;;4692:2:::1;4676:48:::0;;;4696:3:::1;4676:48;::::0;::::1;::::0;4701:3:::1;4676:48:::0;;;;;;;4706:3:::1;4676:48:::0;;;;;;;;;;;4715:3:::1;4676:48:::0;;;;4720:3:::1;4676:48:::0;;;;::::1;::::0;:12;;:48:::1;;:::i;:::-;-1:-1:-1::0;4734:35:0::1;::::0;;::::1;::::0;::::1;::::0;;4749:1:::1;4734:35:::0;;4752:1:::1;4734:35;::::0;::::1;::::0;-1:-1:-1;4734:35:0;;;;;;;;;;;;4761:1:::1;4734:35:::0;;;;;;;;;;;;;;;;;;;;::::1;::::0;:11;;:35:::1;;:::i;:::-;-1:-1:-1::0;4796:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;4812:3:::1;4796:20:::0;;::::1;::::0;:12;;:20:::1;;:::i;:::-;-1:-1:-1::0;4826:17:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;4826:17:0;;::::1;::::0;:11;;:17:::1;;:::i;:::-;-1:-1:-1::0;4874:33:0::1;::::0;;::::1;::::0;::::1;::::0;;4890:2:::1;4874:33:::0;;4894:3:::1;4874:33;::::0;::::1;::::0;4899:2:::1;4874:33:::0;;;;;;;::::1;::::0;;;;::::1;::::0;:12;;:33:::1;;:::i;:::-;-1:-1:-1::0;4917:26:0::1;::::0;;::::1;::::0;::::1;::::0;;4932:1:::1;4917:26:::0;;4935:1:::1;4917:26;::::0;::::1;::::0;;;;;;;;;;;;;;;;::::1;::::0;:11;;:26:::1;;:::i;:::-;;2529:2421::o:0;1978:28::-;;;;;;;;;;;6595:554;1168:7:6;;;;;;;1411:9;1403:38;;;;;;;11471:2:18;1403:38:6;;;11453:21:18;11510:2;11490:18;;;11483:30;11549:18;11529;;;11522:46;11585:18;;1403:38:6;11269:340:18;1403:38:6;719:10:14;6692:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;::::1;;6684:58;;;::::0;::::1;::::0;;11816:2:18;6684:58:0::1;::::0;::::1;11798:21:18::0;11855:2;11835:18;;;11828:30;11894:27;11874:18;;;11867:55;11939:18;;6684:58:0::1;11614:349:18::0;6684:58:0::1;6774:9;::::0;6760:6:::1;::::0;:10:::1;::::0;6769:1:::1;6760:10;:::i;:::-;:23;;6752:53;;;::::0;::::1;::::0;;12492:2:18;6752:53:0::1;::::0;::::1;12474:21:18::0;12531:2;12511:18;;;12504:30;12570:19;12550:18;;;12543:47;12607:18;;6752:53:0::1;12290:341:18::0;6752:53:0::1;6815:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;6842:6:0::1;::::0;6873:9:::1;6856:27;::::0;;;:16:::1;:27;::::0;;;;;;;;6833:51;;;;::::1;::::0;;;;;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;6842:6;6850:4;;6833:8:::1;:51::i;:::-;-1:-1:-1::0;6898:9:0::1;:22;::::0;::::1;;::::0;::::1;::::0;:55:::1;;-1:-1:-1::0;6945:7:0::1;::::0;::::1;6924:29:::0;;::::1;6945:7:::0;::::1;6924:29;;6898:55;6894:211;;;7008:6;::::0;6996:19:::1;::::0;;;:11:::1;:19;::::0;;;;:29;::::1;;6992:102;;;7046:6;::::0;7032:21:::1;::::0;::::1;::::0;;;::::1;6992:102;;;7087:6;::::0;7077:17:::1;::::0;::::1;::::0;;;::::1;6992:102;7114:28;7124:9;7135:6;;7114:9;:28::i;16543:228::-:0;719:10:14;5616:20:0;;;;:6;:20;;;;;;16704:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;9266:341:18;5608:101:0;16723:41:::1;16746:4;16752:2;16756:7;16723:22;:41::i;7247:348::-:0;1168:7:6;;;;;;;1411:9;1403:38;;;;;;;11471:2:18;1403:38:6;;;11453:21:18;11510:2;11490:18;;;11483:30;11549:18;11529;;;11522:46;11585:18;;1403:38:6;11269:340:18;1403:38:6;719:10:14;7328:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;::::1;;7320:58;;;::::0;::::1;::::0;;11816:2:18;7320:58:0::1;::::0;::::1;11798:21:18::0;11855:2;11835:18;;;11828:30;11894:27;11874:18;;;11867:55;11939:18;;7320:58:0::1;11614:349:18::0;7320:58:0::1;7416:9;7396:16;7404:7:::0;7396::::1;:16::i;:::-;:29;;;7388:65;;;::::0;::::1;::::0;;13038:2:18;7388:65:0::1;::::0;::::1;13020:21:18::0;13077:2;13057:18;;;13050:30;13116:25;13096:18;;;13089:53;13159:18;;7388:65:0::1;12836:347:18::0;7388:65:0::1;7467:20;::::0;;;:11:::1;:20;::::0;;;;:30;::::1;;7463:101;;;7504:22;::::0;7518:7;;7504:22:::1;::::0;;;::::1;7463:101;;;7546:18;::::0;7556:7;;7546:18:::1;::::0;;;::::1;7463:101;7574:14;7580:7;7574:5;:14::i;15338:359::-:0;15464:7;15483:15;15501:25;15520:5;15501:18;:25::i;:::-;719:10:14;15573:20:0;;;;:6;:20;;;;;;15483:43;;-1:-1:-1;15573:20:0;;;:71;;-1:-1:-1;15597:23:0;;;;:14;:23;;;;;:32;;;15632:12;-1:-1:-1;15573:71:0;15565:101;;;;;;;9468:2:18;15565:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;15565:101:0;9266:341:18;14873:459:0;719:10:14;15051:7:0;5375:20;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;719:10:14;5616:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;15033:7;;5616:20:::1;;::::0;:71:::1;;-1:-1:-1::0;5640:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:32:::1;;::::0;5675:12:::1;-1:-1:-1::0;5616:71:0::1;5608:101;;;::::0;::::1;::::0;;9468:2:18;5608:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0::1;9266:341:18::0;5608:101:0::1;15070:12:::2;15085:22;15099:7;15085:13;:22::i;:::-;719:10:14::0;15212:20:0::2;::::0;;;:6:::2;:20;::::0;;;;;15070:37;;-1:-1:-1;15212:20:0::2;;::::0;:70:::2;;-1:-1:-1::0;15236:22:0::2;::::0;::::2;;::::0;;;:16:::2;:22;::::0;;;;:31:::2;;::::0;15270:12:::2;-1:-1:-1::0;15212:70:0::2;15204:100;;;::::0;::::2;::::0;;9468:2:18;15204:100:0::2;::::0;::::2;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;15204:100:0::2;9266:341:18::0;13064:87:0;1108:6:5;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;13125:12:0::1;;;::::0;;;:6:::1;:12;::::0;;;;:19;;;::::1;13140:4;13125:19;::::0;;13064:87::o;14488:379::-;719:10:14;14614:7:0;5375:20;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;719:10:14;14728:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;::::1;;::::0;:71:::1;;-1:-1:-1::0;14752:23:0::1;::::0;::::1;;::::0;;;:16:::1;:23;::::0;;;;:32:::1;;::::0;14787:12:::1;-1:-1:-1::0;14728:71:0::1;14720:101;;;::::0;::::1;::::0;;9468:2:18;14720:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;14720:101:0::1;9266:341:18::0;14720:101:0::1;14838:22;14854:5;14838:15;:22::i;5482:1::-;14488:379:::0;;;:::o;1668:101:5:-;1108:6;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;12073:280:0:-;719:10:14;12171:4:0;5616:20;;;:6;:20;;;;;;12153:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;9266:341:18;5608:101:0;-1:-1:-1;;12271:24:0::1;12298:20:::0;;;:11:::1;:20;::::0;;;;;;;;12271:47;;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;;;;;;;12073:280::o;13378:203::-;13518:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13518:17:0;719:10:14;5375:20:0;;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;719:10:14;5616:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;13500:7;;5616:20:::1;;::::0;:71:::1;;-1:-1:-1::0;5640:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:32:::1;;::::0;5675:12:::1;-1:-1:-1::0;5616:71:0::1;5608:101;;;::::0;::::1;::::0;;9468:2:18;5608:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0::1;9266:341:18::0;5608:101:0::1;-1:-1:-1::0;;13554:20:0::2;::::0;;;:11:::2;:20;::::0;;;;;;;;13547:27;;::::2;::::0;::::2;::::0;;;;::::2;;;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;;;13378:203::o;2650:102:7:-;2706:13;2738:7;2731:14;;;;;:::i;16093:206:0:-;719:10:14;5375:20:0;;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;16249:43:::1;16273:8;16283;16249:23;:43::i;5733:431::-:0;1108:6:5;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;5834:12:0::1;5877:15;::::0;::::1;5869:50;;;::::0;::::1;::::0;;13390:2:18;5869:50:0::1;::::0;::::1;13372:21:18::0;13429:2;13409:18;;;13402:30;13468:24;13448:18;;;13441:52;13510:18;;5869:50:0::1;13188:346:18::0;5869:50:0::1;5949:4;5937:16;;:8;:16;;;;5929:52;;;::::0;::::1;::::0;;13741:2:18;5929:52:0::1;::::0;::::1;13723:21:18::0;13780:2;13760:18;;;13753:30;13819:25;13799:18;;;13792:53;13862:18;;5929:52:0::1;13539:347:18::0;5929:52:0::1;6008:4;5999:13;;:5;:13;;;;5991:52;;;::::0;::::1;::::0;;14093:2:18;5991:52:0::1;::::0;::::1;14075:21:18::0;14132:2;14112:18;;;14105:30;14171:28;14151:18;;;14144:56;14217:18;;5991:52:0::1;13891:350:18::0;5991:52:0::1;-1:-1:-1::0;6053:6:0::1;:25:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;6088:7:::1;:28:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;6126:10:::1;:31:::0;;;;;::::1;::::0;::::1;;::::0;;5733:431::o;16777:263::-;719:10:14;5616:20:0;;;;:6;:20;;;;;;16966:7;;5616:20;;;:71;;-1:-1:-1;5640:23:0;;;;:14;:23;;;;;:32;;;5675:12;-1:-1:-1;5616:71:0;5608:101;;;;;;;9468:2:18;5608:101:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0;9266:341:18;5608:101:0;16985:48:::1;17008:4;17014:2;17018:7;17027:5;16985:22;:48::i;:::-;16777:263:::0;;;;;:::o;13587:257::-;719:10:14;5375:20:0;;;;:6;:20;;;;;;13719:13;;5375:20;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;719:10:14;5616:20:0::1;::::0;;;:6:::1;:20;::::0;;;;;13701:7;;5616:20:::1;;::::0;:71:::1;;-1:-1:-1::0;5640:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:32:::1;;::::0;5675:12:::1;-1:-1:-1::0;5616:71:0::1;5608:101;;;::::0;::::1;::::0;;9468:2:18;5608:101:0::1;::::0;::::1;9450:21:18::0;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5608:101:0::1;9266:341:18::0;5608:101:0::1;7224:4:7::0;7247:16;;;:7;:16;;;;;;:30;:16;13744:52:0::2;;;::::0;::::2;::::0;;14448:2:18;13744:52:0::2;::::0;::::2;14430:21:18::0;14487:2;14467:18;;;14460:30;14526:25;14506:18;;;14499:53;14569:18;;13744:52:0::2;14246:347:18::0;13744:52:0::2;13813:6;::::0;:24:::2;::::0;;;;::::2;::::0;::::2;3107:25:18::0;;;13813:6:0::2;::::0;;::::2;::::0;:15:::2;::::0;3080:18:18;;13813:24:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;7601:405::-:0;719:10:14;7692:20:0;;;;:6;:20;;;;;;;;7684:58;;;;;;;11816:2:18;7684:58:0;;;11798:21:18;11855:2;11835:18;;;11828:30;11894:27;11874:18;;;11867:55;11939:18;;7684:58:0;11614:349:18;7684:58:0;7863:25;;;;;;;;7808:15;7863:25;;;7771:12;7863:25;;;;;;;7850:9;7752:16;7833:27;;;:16;:27;;;;;;:55;;;;;;;;;;;;;;7771:12;;7898:101;7922:8;:15;7918:1;:19;7898:101;;;7974:25;;;;;;;;7984:4;7974:25;;;;7990:8;7974:25;;;7944:14;:27;7959:8;7968:1;7959:11;;;;;;;;:::i;:::-;;;;;;;;;;;;7944:27;;;;;;;;;;;-1:-1:-1;7944:27:0;:55;;;;;;;;;;;;7939:3;;;;:::i;:::-;;;;7898:101;;16305:228;719:10:14;16464:4:0;5375:20;;;:6;:20;;;;;;;;;:75;;-1:-1:-1;5416:9:0;5399:27;;;;:16;:27;;;;;:36;;;5438:12;-1:-1:-1;5375:75:0;5367:105;;;;;;;9468:2:18;5367:105:0;;;9450:21:18;9507:2;9487:18;;;9480:30;9546:19;9526:18;;;9519:47;9583:18;;5367:105:0;9266:341:18;5367:105:0;4622:25:7;;;;4599:4;4622:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;16487:39:0::1;4502:162:7::0;6191:209:0;719:10:14;6267:7:0;6294:20;;;:6;:20;;;;;;;;6286:58;;;;;;;11816:2:18;6286:58:0;;;11798:21:18;11855:2;11835:18;;;11828:30;11894:27;11874:18;;;11867:55;11939:18;;6286:58:0;11614:349:18;6286:58:0;-1:-1:-1;6361:23:0;;;;:14;:23;;;;;:32;;;;6191:209::o;1918:198:5:-;1108:6;;1248:23;1108:6;719:10:14;1248:23:5;1240:68;;;;;;;10160:2:18;1240:68:5;;;10142:21:18;;;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10290:18;;1240:68:5;9958:356:18;1240:68:5;2006:22:::1;::::0;::::1;1998:73;;;::::0;::::1;::::0;;15440:2:18;1998:73:5::1;::::0;::::1;15422:21:18::0;15479:2;15459:18;;;15452:30;15518:34;15498:18;;;15491:62;15589:8;15569:18;;;15562:36;15615:19;;1998:73:5::1;15238:402:18::0;1998:73:5::1;2081:28;2100:8;2081:18;:28::i;1570:300:7:-:0;1672:4;1707:40;;;1722:25;1707:40;;:104;;-1:-1:-1;1763:48:7;;;1778:33;1763:48;1707:104;:156;;;-1:-1:-1;952:25:16;937:40;;;;1827:36:7;829:155:16;3999:217:7;4075:7;7247:16;;;:7;:16;;;;;;:30;:16;4094:73;;;;;;;15847:2:18;4094:73:7;;;15829:21:18;15886:2;15866:18;;;15859:30;15925:34;15905:18;;;15898:62;15996:14;15976:18;;;15969:42;16028:19;;4094:73:7;15645:408:18;4094:73:7;-1:-1:-1;4185:24:7;;;;:15;:24;;;;;;;;;3999:217::o;3537:401::-;3617:13;3633:23;3648:7;3633:14;:23::i;:::-;3617:39;;3680:5;3674:11;;:2;:11;;;;3666:57;;;;;;;16260:2:18;3666:57:7;;;16242:21:18;16299:2;16279:18;;;16272:30;16338:34;16318:18;;;16311:62;16409:3;16389:18;;;16382:31;16430:19;;3666:57:7;16058:397:18;3666:57:7;719:10:14;3755:21:7;;;;;:62;;-1:-1:-1;3780:37:7;3797:5;719:10:14;16305:228:0;:::i;3780:37:7:-;3734:165;;;;;;;16662:2:18;3734:165:7;;;16644:21:18;16701:2;16681:18;;;16674:30;16740:34;16720:18;;;16713:62;16811:26;16791:18;;;16784:54;16855:19;;3734:165:7;16460:420:18;3734:165:7;3910:21;3919:2;3923:7;3910:8;:21::i;1863:115:6:-;1168:7;;;;;;;1411:9;1403:38;;;;;;;11471:2:18;1403:38:6;;;11453:21:18;11510:2;11490:18;;;11483:30;11549:18;11529;;;11522:46;11585:18;;1403:38:6;11269:340:18;1403:38:6;1922:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;1951:20:::1;1958:12;719:10:14::0;;640:96;1958:12:6::1;1951:20;::::0;1905:42:18;1893:55;;;1875:74;;1863:2;1848:18;1951:20:6::1;;;;;;;1863:115::o:0;2110:117::-;1168:7;;;;;;;1669:41;;;;;;;17087:2:18;1669:41:6;;;17069:21:18;17126:2;17106:18;;;17099:30;17165:22;17145:18;;;17138:50;17205:18;;1669:41:6;16885:344:18;1669:41:6;2168:7:::1;:15:::0;;;::::1;::::0;;2198:22:::1;719:10:14::0;2207:12:6::1;640:96:14::0;7442:344:7;7535:4;7247:16;;;:7;:16;;;;;;:30;:16;7551:73;;;;;;;17436:2:18;7551:73:7;;;17418:21:18;17475:2;17455:18;;;17448:30;17514:34;17494:18;;;17487:62;17585:14;17565:18;;;17558:42;17617:19;;7551:73:7;17234:408:18;7551:73:7;7634:13;7650:23;7665:7;7650:14;:23::i;:::-;7634:39;;7702:5;7691:16;;:7;:16;;;:51;;;;7735:7;7711:31;;:20;7723:7;7711:11;:20::i;:::-;:31;;;7691:51;:87;;;;7746:32;7763:5;7770:7;7746:16;:32::i;:::-;7683:96;7442:344;-1:-1:-1;;;;7442:344:7:o;10452:605::-;10606:4;10579:31;;:23;10594:7;10579:14;:23::i;:::-;:31;;;10571:81;;;;;;;17849:2:18;10571:81:7;;;17831:21:18;17888:2;17868:18;;;17861:30;17927:34;17907:18;;;17900:62;17998:7;17978:18;;;17971:35;18023:19;;10571:81:7;17647:401:18;10571:81:7;10670:16;;;10662:65;;;;;;;18255:2:18;10662:65:7;;;18237:21:18;18294:2;18274:18;;;18267:30;18333:34;18313:18;;;18306:62;18404:6;18384:18;;;18377:34;18428:19;;10662:65:7;18053:400:18;10662:65:7;10738:39;10759:4;10765:2;10769:7;10738:20;:39::i;:::-;10839:29;10856:1;10860:7;10839:8;:29::i;:::-;10879:15;;;;;;;:9;:15;;;;;:20;;10898:1;;10879:15;:20;;10898:1;;10879:20;:::i;:::-;;;;-1:-1:-1;;10909:13:7;;;;;;;:9;:13;;;;;:18;;10926:1;;10909:13;:18;;10926:1;;10909:18;:::i;:::-;;;;-1:-1:-1;;10937:16:7;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;10974:27;;10937:16;;10974:27;;;;;;;15703:182:0;;;:::o;1291:253:10:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;18790:2:18;1407:87:10;;;18772:21:18;18829:2;18809:18;;;18802:30;18868:34;18848:18;;;18841:62;18939:13;18919:18;;;18912:41;18970:19;;1407:87:10;18588:407:18;1407:87:10;-1:-1:-1;1511:19:10;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;8773:565:0:-;8861:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8861:19:0;8896:18;8909:4;8896:12;:18::i;:::-;8892:22;;8928:20;:37;8949:15;8962:1;8949:12;:15::i;:::-;8928:37;;;;;;;;;;;;8969:1;8928:42;8924:280;;;8986:20;;;;:11;:20;;;;;;;;:24;;;;;;;;;;;;;;;;-1:-1:-1;8986:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;9024;;9045:15;8986:24;9045:12;:15::i;:::-;9024:37;;;;;;;;;;;-1:-1:-1;9024:37:0;:47;9089:11;;9085:86;;;9107:22;;9121:7;;9107:22;;;;;9185:8;;9085:86;9153:18;;9163:7;;9153:18;;;;;9185:8;;8924:280;9220:111;9242:7;9298:4;9281:22;;;;;;19129:19:18;;19173:2;19164:12;;19000:182;9281:22:0;;;;;;;;;;;;;9271:33;;;;;;9263:42;;9319:2;9220:8;:111::i;8116:108:7:-;8191:26;8201:2;8205:7;8191:26;;;;;;;;;;;;:9;:26::i;5122:179::-;5255:39;5272:4;5278:2;5282:7;5255:39;;;;;;;;;;;;:16;:39::i;9722:406::-;9781:13;9797:23;9812:7;9797:14;:23::i;:::-;9781:39;;9831:48;9852:5;9867:1;9871:7;9831:20;:48::i;:::-;9917:29;9934:1;9938:7;9917:8;:29::i;:::-;9957:16;;;;;;;:9;:16;;;;;:21;;9977:1;;9957:16;:21;;9977:1;;9957:21;:::i;:::-;;;;-1:-1:-1;;9995:16:7;;;;:7;:16;;;;;;9988:23;;;;;;10027:36;10003:7;;9995:16;9988:23;10027:36;;;;;9995:16;;10027:36;5029:233:0;12828:135;:::o;1798:230:10:-;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;;;;19389:2:18;1892:95:10;;;19371:21:18;19428:2;19408:18;;;19401:30;19467:34;19447:18;;;19440:62;19538:14;19518:18;;;19511:42;19570:19;;1892:95:10;19187:408:18;1892:95:10;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;1997:24;;1798:230;;;:::o;2191:235:7:-;2263:7;2298:16;;;:7;:16;;;;;;;;2332:19;2324:73;;;;;;;19802:2:18;2324:73:7;;;19784:21:18;19841:2;19821:18;;;19814:30;19880:34;19860:18;;;19853:62;19951:11;19931:18;;;19924:39;19980:19;;2324:73:7;19600:405:18;1929:205:7;2001:7;2028:19;;;2020:74;;;;;;;20212:2:18;2020:74:7;;;20194:21:18;20251:2;20231:18;;;20224:30;20290:34;20270:18;;;20263:62;20361:12;20341:18;;;20334:40;20391:19;;2020:74:7;20010:406:18;2020:74:7;-1:-1:-1;2111:16:7;;;;;;:9;:16;;;;;;;1929:205::o;2270:187:5:-;2362:6;;;;2378:17;;;;;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;4283:153:7:-;4377:52;719:10:14;4410:8:7;4420;4377:18;:52::i;5367:320::-;5536:41;719:10:14;5555:12:7;640:96:14;5536:41:7;5528:103;;;;;;;10521:2:18;5528:103:7;;;10503:21:18;10560:2;10540:18;;;10533:30;10599:34;10579:18;;;10572:62;10670:19;10650:18;;;10643:47;10707:19;;5528:103:7;10319:413:18;5528:103:7;5641:39;5655:4;5661:2;5665:7;5674:5;5641:13;:39::i;11168:171::-;11242:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;11295:23;11242:24;11295:14;:23::i;:::-;11286:46;;;;;;;;;;;;11168:171;;:::o;2624:572:10:-;2823:18;;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;3015:16;;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;10328:957:0:-;10387:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10387:19:0;10436:20;10454:2;10444:6;10437:13;;10436:20;:::i;:::-;:25;;10422:39;;;10460:1;;10487:19;;10505:1;10487:19;;;10501:1;10487:19;10525:2;10516:11;;;;;10471:35;;;-1:-1:-1;10546:45:0;10572:6;10565:13;;10581:9;10471:35;10581:1;:9;:::i;:::-;10546:11;:45::i;:::-;10537:6;;;:54;10610:2;10601:11;;;;;10631:45;10657:6;10650:13;;10666:9;10670:5;10666:1;:9;:::i;10631:45::-;10622:6;;;:54;10695:2;10686:11;;;;;10717:45;10743:6;10736:13;;10752:9;10756:5;10752:1;:9;:::i;10717:45::-;10707:7;;;:55;10781:2;10772:11;;;;;10802:45;10828:6;10821:13;;10837:9;10841:5;10837:1;:9;:::i;10802:45::-;10793:6;;;:54;10866:2;10857:11;;;;;10887:45;10913:6;10906:13;;10922:9;10926:5;10922:1;:9;:::i;10887:45::-;10878:6;;;:54;10951:2;10942:11;;;;;10973:45;10999:6;10992:13;;11008:9;11012:5;11008:1;:9;:::i;10973:45::-;10963:7;;;:55;11037:2;11028:11;;;;;11058:45;11084:6;11077:13;;11093:9;11097:5;11093:1;:9;:::i;11058:45::-;11049:6;;;:54;11122:2;11113:11;;;;;11143:45;11169:6;11162:13;;11178:9;11182:5;11178:1;:9;:::i;11143:45::-;11134:6;;;:54;11207:2;11198:11;;;;;11233:45;11259:6;11252:13;;11268:9;11272:5;11268:1;:9;:::i;11233:45::-;11219:11;;;:59;-1:-1:-1;11219:1:0;10328:957;-1:-1:-1;10328:957:0:o;11463:423::-;11620:11;;11649:6;;;;;11673;;;;;11697:7;;;;11722:6;;;;11746;;;;11770:7;;;;11795:6;;;;11819;;;;11843:11;;;;11586:282;;11529:7;;11586:282;;11620:11;;11649:6;11843:11;11586:282;21095:14:18;;21088:22;21083:3;21079:32;21067:45;;21137:1;21128:11;;21121:27;;;;21173:2;21164:12;;21157:28;;;;21210:2;21201:12;;21194:28;;;;21247:2;21238:12;;21231:28;;;;21284:3;21275:13;;21268:29;21322:3;21313:13;;21306:29;21360:3;21351:13;;21344:29;21398:3;21389:13;;21382:29;21436:3;21427:13;;21420:29;21474:3;21465:13;;20692:792;11586:282:0;;;;;;;;;;;;;;11563:315;;11586:282;11563:315;;;;;11463:423;-1:-1:-1;;11463:423:0:o;8445:311:7:-;8570:18;8576:2;8580:7;8570:5;:18::i;:::-;8619:54;8650:1;8654:2;8658:7;8667:5;8619:22;:54::i;:::-;8598:151;;;;;;;21691:2:18;8598:151:7;;;21673:21:18;21730:2;21710:18;;;21703:30;21769:34;21749:18;;;21742:62;21840:20;21820:18;;;21813:48;21878:19;;8598:151:7;21489:414:18;11474:307:7;11624:8;11615:17;;:5;:17;;;;11607:55;;;;;;;22110:2:18;11607:55:7;;;22092:21:18;22149:2;22129:18;;;22122:30;22188:27;22168:18;;;22161:55;22233:18;;11607:55:7;21908:349:18;11607:55:7;11672:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;11733:41;;682::18;;;11733::7;;655:18:18;11733:41:7;;;;;;;11474:307;;;:::o;6549:::-;6700:28;6710:4;6716:2;6720:7;6700:9;:28::i;:::-;6746:48;6769:4;6775:2;6779:7;6788:5;6746:22;:48::i;:::-;6738:111;;;;;;;21691:2:18;6738:111:7;;;21673:21:18;21730:2;21710:18;;;21703:30;21769:34;21749:18;;;21742:62;21840:20;21820:18;;;21813:48;21878:19;;6738:111:7;21489:414:18;4680:970:10;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:10;;;5150:323;;5220:18;;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:10;;;;:17;:26;;;;;;;;5559:33;;;5609:18;;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:10;;6187:46;;6632:26;;;;;;:::i;:::-;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3621:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:10:o;9755:354:0:-;9832:7;9851:13;9874:8;9883:9;9874:19;;;;;;;:::i;:::-;;:26;9867:33;;:4;:33;:::i;:::-;9851:49;;10020:8;10029:9;10020:19;;;;;;;:::i;:::-;;10040:5;10020:26;;;;;;;;:::i;:::-;;;;;;;;;10016:1;10008:4;:9;;:38;10004:56;;;10055:5;-1:-1:-1;10048:12:0;;10004:56;10077:7;10085:9;10077:18;;;;;;;:::i;:::-;;10096:5;10077:25;;;;;;;;:::i;:::-;;;;;;;;;10070:32;;;9755:354;;;;:::o;9078:427:7:-;9157:16;;;9149:61;;;;;;;22653:2:18;9149:61:7;;;22635:21:18;;;22672:18;;;22665:30;22731:34;22711:18;;;22704:62;22783:18;;9149:61:7;22451:356:18;9149:61:7;7224:4;7247:16;;;:7;:16;;;;;;:30;:16;:30;9220:58;;;;;;;23014:2:18;9220:58:7;;;22996:21:18;23053:2;23033:18;;;23026:30;23092;23072:18;;;23065:58;23140:18;;9220:58:7;22812:352:18;9220:58:7;9289:45;9318:1;9322:2;9326:7;9289:20;:45::i;:::-;9345:13;;;;;;;:9;:13;;;;;:18;;9362:1;;9345:13;:18;;9362:1;;9345:18;:::i;:::-;;;;-1:-1:-1;;9373:16:7;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;9410:33;;9373:16;;;9410:33;;9373:16;;9410:33;5029:233:0;12828:135;:::o;12334:778:7:-;12484:4;12504:13;;;1465:19:13;:23;12500:606:7;;12539:72;;;;;:36;;;;;;:72;;719:10:14;;12590:4:7;;12596:7;;12605:5;;12539:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12539:72:7;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12535:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12778:13:7;;12774:266;;12820:60;;;;;21691:2:18;12820:60:7;;;21673:21:18;21730:2;21710:18;;;21703:30;21769:34;21749:18;;;21742:62;21840:20;21820:18;;;21813:48;21878:19;;12820:60:7;21489:414:18;12774:266:7;12992:6;12986:13;12977:6;12973:2;12969:15;12962:38;12535:519;12661:51;;12671:41;12661:51;;-1:-1:-1;12654:58:7;;12500:606;-1:-1:-1;13091:4:7;12334:778;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:18;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;734:258::-;806:1;816:113;830:6;827:1;824:13;816:113;;;906:11;;;900:18;887:11;;;880:39;852:2;845:10;816:113;;;947:6;944:1;941:13;938:48;;;-1:-1:-1;;982:1:18;964:16;;957:27;734:258::o;997:317::-;1039:3;1077:5;1071:12;1104:6;1099:3;1092:19;1120:63;1176:6;1169:4;1164:3;1160:14;1153:4;1146:5;1142:16;1120:63;:::i;:::-;1228:2;1216:15;1233:66;1212:88;1203:98;;;;1303:4;1199:109;;997:317;-1:-1:-1;;997:317:18:o;1319:220::-;1468:2;1457:9;1450:21;1431:4;1488:45;1529:2;1518:9;1514:18;1506:6;1488:45;:::i;1544:180::-;1603:6;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;-1:-1:-1;1695:23:18;;1544:180;-1:-1:-1;1544:180:18:o;1960:196::-;2028:20;;2088:42;2077:54;;2067:65;;2057:93;;2146:1;2143;2136:12;2161:254;2229:6;2237;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;:::-;2319:39;2405:2;2390:18;;;;2377:32;;-1:-1:-1;;;2161:254:18:o;2420:160::-;2485:20;;2541:13;;2534:21;2524:32;;2514:60;;2570:1;2567;2560:12;2585:180;2641:6;2694:2;2682:9;2673:7;2669:23;2665:32;2662:52;;;2710:1;2707;2700:12;2662:52;2733:26;2749:9;2733:26;:::i;2770:186::-;2829:6;2882:2;2870:9;2861:7;2857:23;2853:32;2850:52;;;2898:1;2895;2888:12;2850:52;2921:29;2940:9;2921:29;:::i;3143:328::-;3220:6;3228;3236;3289:2;3277:9;3268:7;3264:23;3260:32;3257:52;;;3305:1;3302;3295:12;3257:52;3328:29;3347:9;3328:29;:::i;:::-;3318:39;;3376:38;3410:2;3399:9;3395:18;3376:38;:::i;:::-;3366:48;;3461:2;3450:9;3446:18;3433:32;3423:42;;3143:328;;;;;:::o;3476:248::-;3544:6;3552;3605:2;3593:9;3584:7;3580:23;3576:32;3573:52;;;3621:1;3618;3611:12;3573:52;-1:-1:-1;;3644:23:18;;;3714:2;3699:18;;;3686:32;;-1:-1:-1;3476:248:18:o;4841:254::-;4906:6;4914;4967:2;4955:9;4946:7;4942:23;4938:32;4935:52;;;4983:1;4980;4973:12;4935:52;5006:29;5025:9;5006:29;:::i;:::-;4996:39;;5054:35;5085:2;5074:9;5070:18;5054:35;:::i;:::-;5044:45;;4841:254;;;;;:::o;5100:334::-;5177:6;5185;5193;5246:2;5234:9;5225:7;5221:23;5217:32;5214:52;;;5262:1;5259;5252:12;5214:52;5285:29;5304:9;5285:29;:::i;:::-;5275:39;;5333:38;5367:2;5356:9;5352:18;5333:38;:::i;:::-;5323:48;;5390:38;5424:2;5413:9;5409:18;5390:38;:::i;:::-;5380:48;;5100:334;;;;;:::o;5439:184::-;5491:77;5488:1;5481:88;5588:4;5585:1;5578:15;5612:4;5609:1;5602:15;5628:334;5699:2;5693:9;5755:2;5745:13;;5760:66;5741:86;5729:99;;5858:18;5843:34;;5879:22;;;5840:62;5837:88;;;5905:18;;:::i;:::-;5941:2;5934:22;5628:334;;-1:-1:-1;5628:334:18:o;5967:245::-;6015:4;6048:18;6040:6;6037:30;6034:56;;;6070:18;;:::i;:::-;-1:-1:-1;6127:2:18;6115:15;6132:66;6111:88;6201:4;6107:99;;5967:245::o;6217:888::-;6312:6;6320;6328;6336;6389:3;6377:9;6368:7;6364:23;6360:33;6357:53;;;6406:1;6403;6396:12;6357:53;6429:29;6448:9;6429:29;:::i;:::-;6419:39;;6477:38;6511:2;6500:9;6496:18;6477:38;:::i;:::-;6467:48;;6562:2;6551:9;6547:18;6534:32;6524:42;;6617:2;6606:9;6602:18;6589:32;6644:18;6636:6;6633:30;6630:50;;;6676:1;6673;6666:12;6630:50;6699:22;;6752:4;6744:13;;6740:27;-1:-1:-1;6730:55:18;;6781:1;6778;6771:12;6730:55;6817:2;6804:16;6842:48;6858:31;6886:2;6858:31;:::i;:::-;6842:48;:::i;:::-;6913:2;6906:5;6899:17;6953:7;6948:2;6943;6939;6935:11;6931:20;6928:33;6925:53;;;6974:1;6971;6964:12;6925:53;7029:2;7024;7020;7016:11;7011:2;7004:5;7000:14;6987:45;7073:1;7068:2;7063;7056:5;7052:14;7048:23;7041:34;7094:5;7084:15;;;;;6217:888;;;;;;;:::o;7110:946::-;7194:6;7225:2;7268;7256:9;7247:7;7243:23;7239:32;7236:52;;;7284:1;7281;7274:12;7236:52;7324:9;7311:23;7353:18;7394:2;7386:6;7383:14;7380:34;;;7410:1;7407;7400:12;7380:34;7448:6;7437:9;7433:22;7423:32;;7493:7;7486:4;7482:2;7478:13;7474:27;7464:55;;7515:1;7512;7505:12;7464:55;7551:2;7538:16;7573:2;7569;7566:10;7563:36;;;7579:18;;:::i;:::-;7625:2;7622:1;7618:10;7608:20;;7648:28;7672:2;7668;7664:11;7648:28;:::i;:::-;7710:15;;;7780:11;;;7776:20;;;7741:12;;;;7808:19;;;7805:39;;;7840:1;7837;7830:12;7805:39;7864:11;;;;7884:142;7900:6;7895:3;7892:15;7884:142;;;7966:17;;7954:30;;7917:12;;;;8004;;;;7884:142;;;8045:5;7110:946;-1:-1:-1;;;;;;;;7110:946:18:o;8308:260::-;8376:6;8384;8437:2;8425:9;8416:7;8412:23;8408:32;8405:52;;;8453:1;8450;8443:12;8405:52;8476:29;8495:9;8476:29;:::i;:::-;8466:39;;8524:38;8558:2;8547:9;8543:18;8524:38;:::i;8824:437::-;8903:1;8899:12;;;;8946;;;8967:61;;9021:4;9013:6;9009:17;8999:27;;8967:61;9074:2;9066:6;9063:14;9043:18;9040:38;9037:218;;;9111:77;9108:1;9101:88;9212:4;9209:1;9202:15;9240:4;9237:1;9230:15;11080:184;11132:77;11129:1;11122:88;11229:4;11226:1;11219:15;11253:4;11250:1;11243:15;11968:184;12020:77;12017:1;12010:88;12117:4;12114:1;12107:15;12141:4;12138:1;12131:15;12157:128;12197:3;12228:1;12224:6;12221:1;12218:13;12215:39;;;12234:18;;:::i;:::-;-1:-1:-1;12270:9:18;;12157:128::o;12636:195::-;12675:3;12706:66;12699:5;12696:77;12693:103;;;12776:18;;:::i;:::-;-1:-1:-1;12823:1:18;12812:13;;12636:195::o;14598:635::-;14678:6;14731:2;14719:9;14710:7;14706:23;14702:32;14699:52;;;14747:1;14744;14737:12;14699:52;14780:9;14774:16;14813:18;14805:6;14802:30;14799:50;;;14845:1;14842;14835:12;14799:50;14868:22;;14921:4;14913:13;;14909:27;-1:-1:-1;14899:55:18;;14950:1;14947;14940:12;14899:55;14979:2;14973:9;15004:48;15020:31;15048:2;15020:31;:::i;15004:48::-;15075:2;15068:5;15061:17;15115:7;15110:2;15105;15101;15097:11;15093:20;15090:33;15087:53;;;15136:1;15133;15126:12;15087:53;15149:54;15200:2;15195;15188:5;15184:14;15179:2;15175;15171:11;15149:54;:::i;:::-;15222:5;14598:635;-1:-1:-1;;;;;14598:635:18:o;18458:125::-;18498:4;18526:1;18523;18520:8;18517:34;;;18531:18;;:::i;:::-;-1:-1:-1;18568:9:18;;18458:125::o;20421:266::-;20453:1;20479;20469:189;;20514:77;20511:1;20504:88;20615:4;20612:1;20605:15;20643:4;20640:1;20633:15;20469:189;-1:-1:-1;20672:9:18;;20421:266::o;22262:184::-;22314:77;22311:1;22304:88;22411:4;22408:1;22401:15;22435:4;22432:1;22425:15;23169:512;23363:4;23392:42;23473:2;23465:6;23461:15;23450:9;23443:34;23525:2;23517:6;23513:15;23508:2;23497:9;23493:18;23486:43;;23565:6;23560:2;23549:9;23545:18;23538:34;23608:3;23603:2;23592:9;23588:18;23581:31;23629:46;23670:3;23659:9;23655:19;23647:6;23629:46;:::i;:::-;23621:54;23169:512;-1:-1:-1;;;;;;23169:512:18:o;23686:249::-;23755:6;23808:2;23796:9;23787:7;23783:23;23779:32;23776:52;;;23824:1;23821;23814:12;23776:52;23856:9;23850:16;23875:30;23899:5;23875:30;:::i
Swarm Source
ipfs://e0eb3dd353aac516b9b88be332ad79c345d389fdf6f787801af8b48011e2d28c
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.