ERC-1155
Overview
Max Total Supply
6,135
Holders
1,810
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GOONYFRENS
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./ERC1155.sol"; import "./IERC1155.sol"; import "./Ownable.sol"; import "./Strings.sol"; contract GOONYFRENS is ERC1155, Ownable { using Strings for string; mapping(uint256 => uint256) private _totalSupply; //constants uint256 constant nft1 = 1; uint256 constant nft2 = 2; uint256 constant nft3 = 3; uint256 constant nft4 = 4; uint256 constant nft5 = 5; uint256 constant nft6 = 6; uint256 constant nft7 = 7; uint256 constant nft8 = 8; uint256 constant nft9 = 9; uint256 constant nft10 = 10; uint256 constant nft11 = 11; uint256 constant nft12 = 12; uint256 constant nft13 = 13; uint256 constant nft14 = 14; uint256 constant nft15 = 15; uint256 public nft1s; uint256 public nft2s; uint256 public nft3s; uint256 public nft4s; uint256 public nft5s; uint256 public nft6s; uint256 public nft7s; uint256 public nft8s; uint256 public nft9s; uint256 public nft10s; uint256 public nft11s; uint256 public nft12s; uint256 public nft13s; uint256 public nft14s; uint256 public nft15s; uint256 public supplyPerNFT = 500; string public _baseURI; string public _contractURI; bool saleLive = false; //mappings mapping(address => uint256) private mintCountMap1; mapping(address => uint256) public allowedMintCountMap1; uint256 private maxMintPerWallet1 = 1; mapping(address => uint256) private mintCountMap2; mapping(address => uint256) public allowedMintCountMap2; uint256 private maxMintPerWallet2 = 1; mapping(address => uint256) private mintCountMap3; mapping(address => uint256) public allowedMintCountMap3; uint256 private maxMintPerWallet3 = 1; mapping(address => uint256) private mintCountMap4; mapping(address => uint256) public allowedMintCountMap4; uint256 private maxMintPerWallet4 = 1; mapping(address => uint256) private mintCountMap5; mapping(address => uint256) public allowedMintCountMap5; uint256 private maxMintPerWallet5 = 1; mapping(address => uint256) private mintCountMap6; mapping(address => uint256) public allowedMintCountMap6; uint256 private maxMintPerWallet6 = 1; mapping(address => uint256) private mintCountMap7; mapping(address => uint256) public allowedMintCountMap7; uint256 private maxMintPerWallet7 = 1; mapping(address => uint256) private mintCountMap8; mapping(address => uint256) public allowedMintCountMap8; uint256 private maxMintPerWallet8 = 1; mapping(address => uint256) private mintCountMap9; mapping(address => uint256) public allowedMintCountMap9; uint256 private maxMintPerWallet9 = 1; mapping(address => uint256) private mintCountMap10; mapping(address => uint256) public allowedMintCountMap10; uint256 private maxMintPerWallet10 = 1; mapping(address => uint256) private mintCountMap11; mapping(address => uint256) public allowedMintCountMap11; uint256 private maxMintPerWallet11 = 1; mapping(address => uint256) private mintCountMap12; mapping(address => uint256) public allowedMintCountMap12; uint256 private maxMintPerWallet12 = 1; mapping(address => uint256) private mintCountMap13; mapping(address => uint256) public allowedMintCountMap13; uint256 private maxMintPerWallet13 = 1; mapping(address => uint256) private mintCountMap14; mapping(address => uint256) public allowedMintCountMap14; uint256 private maxMintPerWallet14 = 1; mapping(address => uint256) private mintCountMap15; mapping(address => uint256) public allowedMintCountMap15; uint256 private maxMintPerWallet15 = 1; constructor() ERC1155(_baseURI) {} // claim functions function claimnft1(uint256 qty) public { //bmc require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount1(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft1s <= supplyPerNFT); _mint(msg.sender, nft1, qty, ""); updateMintCount1(msg.sender, qty); nft1s += qty; } function claimnft2(uint256 qty) public { //bomb require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount2(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft2s <= supplyPerNFT); _mint(msg.sender, nft2, qty, ""); updateMintCount2(msg.sender, qty); nft2s += qty; } function claimnft3(uint256 qty) public { //boss require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount3(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft3s <= supplyPerNFT); _mint(msg.sender, nft3, qty, ""); updateMintCount3(msg.sender, qty); nft3s += qty; } function claimnft4(uint256 qty) public { //chainrun require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount4(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft4s <= supplyPerNFT); _mint(msg.sender, nft4, qty, ""); updateMintCount4(msg.sender, qty); nft4s += qty; } function claimnft5(uint256 qty) public { //cryptoon require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount5(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft5s <= supplyPerNFT); _mint(msg.sender, nft5, qty, ""); updateMintCount5(msg.sender, qty); nft5s += qty; } function claimnft6(uint256 qty) public { //dead require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount6(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft6s <= supplyPerNFT); _mint(msg.sender, nft6, qty, ""); updateMintCount6(msg.sender, qty); nft6s += qty; } function claimnft7(uint256 qty) public { //deebies require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount7(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft7s <= supplyPerNFT); _mint(msg.sender, nft7, qty, ""); updateMintCount7(msg.sender, qty); nft7s += qty; } function claimnft8(uint256 qty) public { //dizzy require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount8(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft8s <= supplyPerNFT); _mint(msg.sender, nft8, qty, ""); updateMintCount8(msg.sender, qty); nft8s += qty; } function claimnft9(uint256 qty) public { //doodles require(qty == 1,"You can only mint 1"); require(allowedMintCount9(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft9s <= supplyPerNFT); _mint(msg.sender, nft9, qty, ""); updateMintCount9(msg.sender, qty); nft9s += qty; } function claimnft10(uint256 qty) public { //evol require(qty == 1,"You can only mint 1"); require(allowedMintCount10(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft10s <= supplyPerNFT); _mint(msg.sender, nft10, qty, ""); updateMintCount10(msg.sender, qty); nft10s += qty; } function claimnft11(uint256 qty) public { //galatic require(qty == 1,"You can only mint 1"); require(allowedMintCount11(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft11s <= supplyPerNFT); _mint(msg.sender, nft11, qty, ""); updateMintCount11(msg.sender, qty); nft11s += qty; } function claimnft12(uint256 qty) public { //melted require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount12(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft12s <= supplyPerNFT); _mint(msg.sender, nft12, qty, ""); updateMintCount12(msg.sender, qty); nft12s += qty; } function claimnft13(uint256 qty) public { //smilesss require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount13(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft13s <= supplyPerNFT); _mint(msg.sender, nft13, qty, ""); updateMintCount13(msg.sender, qty); nft13s += qty; } function claimnft14(uint256 qty) public { //woodies require(qty == 1,"You can only mint 1"); require(allowedMintCount14(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft14s <= supplyPerNFT); _mint(msg.sender, nft14, qty, ""); updateMintCount14(msg.sender, qty); nft14s += qty; } function claimnft15(uint256 qty) public { //wow require(saleLive,"Sale is not live yet"); require(qty == 1,"You can only mint 1"); require(allowedMintCount15(msg.sender) >= qty,"You already claimed"); require(tx.origin == msg.sender); //stop contract buying require(nft15s <= supplyPerNFT); _mint(msg.sender, nft15, qty, ""); updateMintCount15(msg.sender, qty); nft15s += qty; } //mapping logic function updateMintCount1(address minter, uint256 count) private { mintCountMap1[minter] += count; } function allowedMintCount1(address minter) public view returns (uint256) { return maxMintPerWallet1 - mintCountMap1[minter]; } function setMaxPerWallet1(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet1 = _newMaxMintAmount; } function updateMintCount2(address minter, uint256 count) private { mintCountMap2[minter] += count; } function allowedMintCount2(address minter) public view returns (uint256) { return maxMintPerWallet2 - mintCountMap2[minter]; } function setMaxPerWallet2(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet2 = _newMaxMintAmount; } function updateMintCount3(address minter, uint256 count) private { mintCountMap3[minter] += count; } function allowedMintCount3(address minter) public view returns (uint256) { return maxMintPerWallet3 - mintCountMap3[minter]; } function setMaxPerWallet3(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet3 = _newMaxMintAmount; } function updateMintCount4(address minter, uint256 count) private { mintCountMap4[minter] += count; } function allowedMintCount4(address minter) public view returns (uint256) { return maxMintPerWallet4 - mintCountMap4[minter]; } function setMaxPerWallet4(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet4 = _newMaxMintAmount; } function updateMintCount5(address minter, uint256 count) private { mintCountMap5[minter] += count; } function allowedMintCount5(address minter) public view returns (uint256) { return maxMintPerWallet5 - mintCountMap5[minter]; } function setMaxPerWallet5(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet5 = _newMaxMintAmount; } function updateMintCount6(address minter, uint256 count) private { mintCountMap6[minter] += count; } function allowedMintCount6(address minter) public view returns (uint256) { return maxMintPerWallet6 - mintCountMap6[minter]; } function setMaxPerWallet6(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet6 = _newMaxMintAmount; } function updateMintCount7(address minter, uint256 count) private { mintCountMap7[minter] += count; } function allowedMintCount7(address minter) public view returns (uint256) { return maxMintPerWallet7 - mintCountMap7[minter]; } function setMaxPerWallet7(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet7 = _newMaxMintAmount; } function updateMintCount8(address minter, uint256 count) private { mintCountMap8[minter] += count; } function allowedMintCount8(address minter) public view returns (uint256) { return maxMintPerWallet8 - mintCountMap8[minter]; } function setMaxPerWallet8(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet8 = _newMaxMintAmount; } function updateMintCount9(address minter, uint256 count) private { mintCountMap9[minter] += count; } function allowedMintCount9(address minter) public view returns (uint256) { return maxMintPerWallet9 - mintCountMap9[minter]; } function setMaxPerWallet9(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet9 = _newMaxMintAmount; } function updateMintCount10(address minter, uint256 count) private { mintCountMap10[minter] += count; } function allowedMintCount10(address minter) public view returns (uint256) { return maxMintPerWallet10 - mintCountMap10[minter]; } function setMaxPerWallet10(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet10 = _newMaxMintAmount; } function updateMintCount11(address minter, uint256 count) private { mintCountMap11[minter] += count; } function allowedMintCount11(address minter) public view returns (uint256) { return maxMintPerWallet11 - mintCountMap11[minter]; } function setMaxPerWallet11(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet11 = _newMaxMintAmount; } function updateMintCount12(address minter, uint256 count) private { mintCountMap12[minter] += count; } function allowedMintCount12(address minter) public view returns (uint256) { return maxMintPerWallet12 - mintCountMap12[minter]; } function setMaxPerWallet12(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet12 = _newMaxMintAmount; } function updateMintCount13(address minter, uint256 count) private { mintCountMap13[minter] += count; } function allowedMintCount13(address minter) public view returns (uint256) { return maxMintPerWallet13 - mintCountMap13[minter]; } function setMaxPerWallet13(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet13 = _newMaxMintAmount; } function updateMintCount14(address minter, uint256 count) private { mintCountMap14[minter] += count; } function allowedMintCount14(address minter) public view returns (uint256) { return maxMintPerWallet14 - mintCountMap14[minter]; } function setMaxPerWallet14(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet14 = _newMaxMintAmount; } function updateMintCount15(address minter, uint256 count) private { mintCountMap15[minter] += count; } function allowedMintCount15(address minter) public view returns (uint256) { return maxMintPerWallet15 - mintCountMap15[minter]; } function setMaxPerWallet15(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWallet15 = _newMaxMintAmount; } function setBaseURI(string memory newuri) public onlyOwner { _baseURI = newuri; } function setContractURI(string memory newuri) public onlyOwner { _contractURI = newuri; } function setMaxPerNFT(uint256 _newMaxAmount) public onlyOwner { supplyPerNFT = _newMaxAmount; } function uri(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseURI, uint2str(tokenId))); } function contractURI() public view returns (string memory) { return _contractURI; } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) {return "0";} uint256 j = _i; uint256 len; while (j != 0) {len++; j /= 10;} bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } function exists(uint256 id) public view virtual returns (bool) { return totalSupply(id) > 0; } function setSale(bool _status) public onlyOwner { saleLive = _status; } function withdrawToOwner() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 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 v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "./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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount11","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount12","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount13","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount14","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount15","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCount9","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap10","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap11","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap12","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap13","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap14","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap15","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMintCountMap9","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft11","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft12","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft13","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft14","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft15","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft8","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"claimnft9","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft10s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft11s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft12s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft13s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft14s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft15s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft1s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft2s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft3s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft4s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft5s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft6s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft7s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft8s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft9s","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxAmount","type":"uint256"}],"name":"setMaxPerNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet11","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet12","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet13","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet14","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet15","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet8","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWallet9","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyPerNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526101f46014556000601760006101000a81548160ff0219169083151502179055506001601a556001601d5560016020556001602355600160265560016029556001602c556001602f556001603255600160355560016038556001603b556001603e55600160415560016044553480156200007d57600080fd5b50601580546200008d9062000245565b80601f0160208091040260200160405190810160405280929190818152602001828054620000bb9062000245565b80156200010c5780601f10620000e0576101008083540402835291602001916200010c565b820191906000526020600020905b815481529060010190602001808311620000ee57829003601f168201915b505050505062000122816200013460201b60201c565b506200012e336200014d565b62000282565b8051620001499060029060208401906200019f565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ad9062000245565b90600052602060002090601f016020900481019282620001d157600085556200021c565b82601f10620001ec57805160ff19168380011785556200021c565b828001600101855582156200021c579182015b828111156200021c578251825591602001919060010190620001ff565b506200022a9291506200022e565b5090565b5b808211156200022a57600081556001016200022f565b600181811c908216806200025a57607f821691505b602082108114156200027c57634e487b7160e01b600052602260045260246000fd5b50919050565b614f3080620002926000396000f3fe608060405234801561001057600080fd5b506004361061063a5760003560e01c806399ac6f5d1161033a578063d00a6afd116101bd578063e56257d811610104578063f2fde38b116100ad578063fba7efee11610087578063fba7efee14610d9e578063fe089afd14610db1578063fe36eb1d14610dd1578063fe3f5eef14610df157600080fd5b8063f2fde38b14610d65578063f95075ff14610d78578063f98ef55614610d8b57600080fd5b8063e985e9c5116100de578063e985e9c514610cf6578063ed402ae214610d3f578063f242432a14610d5257600080fd5b8063e56257d814610cd2578063e84a26e514610ce5578063e8a3d48514610cee57600080fd5b8063dcbb646111610166578063e320182b11610140578063e320182b14610c7f578063e384e39b14610c92578063e461734e14610cb257600080fd5b8063dcbb646114610c39578063ddd4d38614610c4c578063de0cef0914610c5f57600080fd5b8063d5fb59f511610197578063d5fb59f514610c00578063d6f68fad14610c13578063d7b5513d14610c2657600080fd5b8063d00a6afd14610bc7578063d19a7f2214610bda578063d4d8812214610bed57600080fd5b8063b84cc21511610281578063c0e727401161022a578063c754cbca11610204578063c754cbca14610ba2578063cc857ebb14610bab578063cf779f0514610bbe57600080fd5b8063c0e7274014610b7e578063c14aa39a14610b86578063c4a1bddd14610b9957600080fd5b8063bd85b0391161025b578063bd85b03914610b38578063bf6ac4bb14610b58578063c08c74a414610b6b57600080fd5b8063b84cc21514610b13578063b852896e14610b26578063baf2298814610b2f57600080fd5b8063a22cb465116102e3578063a7bc25f0116102bd578063a7bc25f014610ae4578063a86a147e14610af7578063aaf9e43d14610b0a57600080fd5b8063a22cb46514610ab5578063a374672214610ac8578063a467cd5914610adb57600080fd5b80639c7c2ed4116103145780639c7c2ed414610a555780639d0ae34114610a75578063a05d14fa14610a9557600080fd5b806399ac6f5d14610a1c5780639c21163914610a2f5780639c61287414610a4257600080fd5b80634e1273f4116104c2578063715018a6116104095780638091e48a116103b257806390f8d3fa1161038c57806390f8d3fa146109ed578063938e3d7b146109f6578063998cc63b14610a0957600080fd5b80638091e48a1461099f5780638da5cb5b146109b25780639028d0d1146109da57600080fd5b80637ba8aa25116103e35780637ba8aa25146109665780637d95b75c146109795780637e383a2c1461098c57600080fd5b8063715018a614610943578063743976a01461094b5780637a729b341461095357600080fd5b8063549634ae1161046b57806361d3c6371161044557806361d3c637146109145780636bb06e651461091d5780636bb0c2901461093057600080fd5b8063549634ae146108db57806355f804b3146108ee5780635e02e9c51461090157600080fd5b80634f558e791161049c5780634f558e79146108935780634fa014c3146108b5578063530ca14c146108c857600080fd5b80634e1273f4146108405780634f05ee94146108605780634f1346a51461088057600080fd5b806325cb1fb8116105865780633e1b4d161161052f57806345637a291161050957806345637a291461081b57806346b8b7e71461082e5780634bf3329a1461083757600080fd5b80633e1b4d16146107c85780633e2d39b3146107e857806344d6f8cd146107fb57600080fd5b80633c9e5c7d116105605780633c9e5c7d146107975780633cb40e16146107b75780633dd8d2a0146107bf57600080fd5b806325cb1fb8146107725780632caba8741461077b5780632eb2c2d61461078457600080fd5b806317c9e4e4116105e8578063229ce0ba116105c2578063229ce0ba1461072c57806323ed24461461073f578063243e38ae1461075f57600080fd5b806317c9e4e4146106e65780631d2e5a3a146107065780631f6b8f681461071957600080fd5b8063088d379e11610619578063088d379e1461069d57806309ee43c9146106a65780630e89341c146106c657600080fd5b8062fdd58e1461063f57806301ffc9a714610665578063036e25af14610688575b600080fd5b61065261064d36600461449f565b610e04565b6040519081526020015b60405180910390f35b6106786106733660046144f7565b610ec7565b604051901515815260200161065c565b61069b61069636600461451b565b610fac565b005b610652600c5481565b6106526106b4366004614534565b602b6020526000908152604090205481565b6106d96106d436600461451b565b611018565b60405161065c91906145c9565b6106526106f4366004614534565b602e6020526000908152604090205481565b61069b6107143660046145ec565b61104c565b61069b61072736600461451b565b6110e4565b61065261073a366004614534565b611150565b61065261074d366004614534565b60316020526000908152604090205481565b61069b61076d36600461451b565b611183565b610652600b5481565b61065260145481565b61069b6107923660046147b2565b6112da565b6106526107a5366004614534565b60406020819052600091825290205481565b61069b611389565b61065260125481565b6106526107d6366004614534565b601f6020526000908152604090205481565b61069b6107f636600461451b565b61141f565b610652610809366004614534565b60286020526000908152604090205481565b61069b61082936600461451b565b61156e565b61065260135481565b61065260115481565b61085361084e36600461485c565b6115da565b60405161065c9190614962565b61065261086e366004614534565b60436020526000908152604090205481565b61069b61088e36600461451b565b611718565b6106786108a136600461451b565b600090815260046020526040902054151590565b61069b6108c336600461451b565b611784565b6106526108d6366004614534565b6117f0565b61069b6108e936600461451b565b611823565b61069b6108fc366004614975565b61188f565b61065261090f366004614534565b61190d565b61065260075481565b61069b61092b36600461451b565b611940565b61069b61093e36600461451b565b6119ac565b61069b611afb565b6106d9611b6e565b610652610961366004614534565b611bfc565b61069b61097436600461451b565b611c2f565b61069b61098736600461451b565b611c9b565b61065261099a366004614534565b611d07565b61069b6109ad36600461451b565b611d3a565b60035460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161065c565b61069b6109e836600461451b565b611da6565b61065260095481565b61069b610a04366004614975565b611e12565b610652610a17366004614534565b611e8c565b610652610a2a366004614534565b611ebf565b61069b610a3d36600461451b565b611ef2565b61069b610a5036600461451b565b612041565b610652610a63366004614534565b603a6020526000908152604090205481565b610652610a83366004614534565b60376020526000908152604090205481565b610652610aa3366004614534565b60346020526000908152604090205481565b61069b610ac33660046149c6565b6120ad565b61069b610ad636600461451b565b6121d0565b61065260055481565b610652610af2366004614534565b61231f565b610652610b05366004614534565b612352565b610652600a5481565b61069b610b2136600461451b565b612385565b610652600e5481565b610652600d5481565b610652610b4636600461451b565b60009081526004602052604090205490565b610652610b66366004614534565b612482565b61069b610b7936600461451b565b6124b5565b6106d9612521565b61069b610b9436600461451b565b61252e565b610652600f5481565b61065260065481565b61069b610bb936600461451b565b61267d565b61065260105481565b61069b610bd536600461451b565b6127cc565b610652610be8366004614534565b61291b565b61069b610bfb36600461451b565b61294e565b61069b610c0e36600461451b565b612a4b565b61069b610c2136600461451b565b612b9a565b61069b610c3436600461451b565b612c97565b610652610c47366004614534565b612d94565b610652610c5a366004614534565b612dc7565b610652610c6d366004614534565b601c6020526000908152604090205481565b610652610c8d366004614534565b612dfb565b610652610ca0366004614534565b60226020526000908152604090205481565b610652610cc0366004614534565b60196020526000908152604090205481565b61069b610ce036600461451b565b612e2e565b61065260085481565b6106d9612e9a565b610678610d043660046149f9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61069b610d4d36600461451b565b612f2c565b61069b610d60366004614a23565b61307b565b61069b610d73366004614534565b613123565b61069b610d8636600461451b565b61321c565b61069b610d9936600461451b565b613288565b61069b610dac36600461451b565b6133d7565b610652610dbf366004614534565b60256020526000908152604090205481565b610652610ddf366004614534565b603d6020526000908152604090205481565b610652610dff366004614534565b613443565b600073ffffffffffffffffffffffffffffffffffffffff8316610e945760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480610f5a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b80610fa657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603b55565b6060601561102583613476565b604051602001611036929190614af8565b6040516020818303038152906040529050919050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60035473ffffffffffffffffffffffffffffffffffffffff16331461114b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602c55565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260336020526040812054603554610fa69190614c05565b60175460ff166111d55760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146112255760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061122f33613443565b101561127d5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461128957600080fd5b601454600554111561129a57600080fd5b6112b633600183604051806020016040528060008152506135d3565b6112c03382613720565b80600560008282546112d29190614c1c565b909155505050565b73ffffffffffffffffffffffffffffffffffffffff851633148061130357506113038533610d04565b6113755760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610e8b565b611382858585858561375e565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146113f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b60405133904780156108fc02916000818181858888f1935050505015801561141c573d6000803e3d6000fd5b50565b60175460ff166114715760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146114c15760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806114cb33611d07565b10156115195760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461152557600080fd5b601454601354111561153657600080fd5b61155233600f83604051806020016040528060008152506135d3565b61155c3382613a4a565b80601360008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff1633146115d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603255565b606081518351146116535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610e8b565b6000835167ffffffffffffffff81111561166f5761166f614607565b604051908082528060200260200182016040528015611698578160200160208202803683370190505b50905060005b8451811015611710576116e38582815181106116bc576116bc614c34565b60200260200101518583815181106116d6576116d6614c34565b6020026020010151610e04565b8282815181106116f5576116f5614c34565b602090810291909101015261170981614c63565b905061169e565b509392505050565b60035473ffffffffffffffffffffffffffffffffffffffff16331461177f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602655565b60035473ffffffffffffffffffffffffffffffffffffffff1633146117eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602355565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260366020526040812054603854610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff16331461188a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b604155565b60035473ffffffffffffffffffffffffffffffffffffffff1633146118f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b80516119099060159060208401906143dd565b5050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602a6020526040812054602c54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff1633146119a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603555565b60175460ff166119fe5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114611a4e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80611a583361291b565b1015611aa65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314611ab257600080fd5b6014546008541115611ac357600080fd5b611adf33600483604051806020016040528060008152506135d3565b611ae93382613a7f565b80600860008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff163314611b625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b611b6c6000613ab4565b565b60158054611b7b90614a88565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba790614a88565b8015611bf45780601f10611bc957610100808354040283529160200191611bf4565b820191906000526020600020905b815481529060010190602001808311611bd757829003601f168201915b505050505081565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260396020526040812054603b54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314611c965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602f55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611d025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603855565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260426020526040812054604454610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314611da15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b604455565b60035473ffffffffffffffffffffffffffffffffffffffff163314611e0d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601d55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611e795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b80516119099060169060208401906143dd565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260246020526040812054602654610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603f6020526040812054604154610fa69190614c05565b60175460ff16611f445760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114611f945760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80611f9e33612d94565b1015611fec5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314611ff857600080fd5b601454600a54111561200957600080fd5b61202533600683604051806020016040528060008152506135d3565b61202f3382613b2b565b80600a60008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff1633146120a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601455565b3373ffffffffffffffffffffffffffffffffffffffff831614156121395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610e8b565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60175460ff166122225760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146122725760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061227c33611e8c565b10156122ca5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b3233146122d657600080fd5b60145460095411156122e757600080fd5b61230333600583604051806020016040528060008152506135d3565b61230d3382613b60565b80600960008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603c6020526040812054603e54610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260306020526040812054603254610fa69190614c05565b806001146123d55760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806123df33611ebf565b101561242d5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461243957600080fd5b601454601254111561244a57600080fd5b61246633600e83604051806020016040528060008152506135d3565b6124703382613b95565b80601260008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602d6020526040812054602f54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff16331461251c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603e55565b60168054611b7b90614a88565b60175460ff166125805760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146125d05760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806125da33612dc7565b10156126285760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461263457600080fd5b601454600754111561264557600080fd5b61266133600383604051806020016040528060008152506135d3565b61266b3382613bca565b80600760008282546112d29190614c1c565b60175460ff166126cf5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461271f5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806127293361190d565b10156127775760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461278357600080fd5b601454600b54111561279457600080fd5b6127b033600783604051806020016040528060008152506135d3565b6127ba3382613bff565b80600b60008282546112d29190614c1c565b60175460ff1661281e5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461286e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061287833612482565b10156128c65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b3233146128d257600080fd5b601454600c5411156128e357600080fd5b6128ff33600883604051806020016040528060008152506135d3565b6129093382613c34565b80600c60008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260216020526040812054602354610fa69190614c05565b8060011461299e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806129a8336117f0565b10156129f65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612a0257600080fd5b601454600f541115612a1357600080fd5b612a2f33600b83604051806020016040528060008152506135d3565b612a393382613c69565b80600f60008282546112d29190614c1c565b60175460ff16612a9d5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114612aed5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612af73361231f565b1015612b455760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612b5157600080fd5b6014546011541115612b6257600080fd5b612b7e33600d83604051806020016040528060008152506135d3565b612b883382613c9e565b80601160008282546112d29190614c1c565b80600114612bea5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612bf433611150565b1015612c425760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612c4e57600080fd5b601454600e541115612c5f57600080fd5b612c7b33600a83604051806020016040528060008152506135d3565b612c853382613cd3565b80600e60008282546112d29190614c1c565b80600114612ce75760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612cf133612352565b1015612d3f5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612d4b57600080fd5b601454600d541115612d5c57600080fd5b612d7833600983604051806020016040528060008152506135d3565b612d823382613d08565b80600d60008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260276020526040812054602954610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601e602090815260408220549054610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601b6020526040812054601d54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314612e955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602955565b606060168054612ea990614a88565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed590614a88565b8015612f225780601f10612ef757610100808354040283529160200191612f22565b820191906000526020600020905b815481529060010190602001808311612f0557829003601f168201915b5050505050905090565b60175460ff16612f7e5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114612fce5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612fd833612dfb565b10156130265760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461303257600080fd5b601454600654111561304357600080fd5b61305f33600283604051806020016040528060008152506135d3565b6130693382613d3d565b80600660008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff85163314806130a457506130a48533610d04565b6131165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610e8b565b6113828585858585613d72565b60035473ffffffffffffffffffffffffffffffffffffffff16331461318a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b73ffffffffffffffffffffffffffffffffffffffff81166132135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e8b565b61141c81613ab4565b60035473ffffffffffffffffffffffffffffffffffffffff1633146132835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602055565b60175460ff166132da5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461332a5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061333433611bfc565b10156133825760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461338e57600080fd5b601454601054111561339f57600080fd5b6133bb33600c83604051806020016040528060008152506135d3565b6133c53382613f6f565b80601060008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff16331461343e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601a55565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260186020526040812054601a54610fa69190614c05565b6060816134b657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156134e057806134ca81614c63565b91506134d99050600a83614c9c565b91506134ba565b60008167ffffffffffffffff8111156134fb576134fb614607565b6040519080825280601f01601f191660200182016040528015613525576020820181803683370190505b509050815b85156135ca5761353b600182614c05565b9050600061354a600a88614c9c565b61355590600a614cd7565b61355f9088614c05565b61356a906030614d14565b905060008160f81b90508084848151811061358757613587614c34565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c1600a89614c9c565b9750505061352a565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff841661365c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e8b565b336136768160008761366d88613fa4565b61138288613fa4565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812080548592906136b3908490614c1c565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461138281600087878787613fef565b73ffffffffffffffffffffffffffffffffffffffff821660009081526018602052604081208054839290613755908490614c1c565b90915550505050565b81518351146137d55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610e8b565b73ffffffffffffffffffffffffffffffffffffffff841661385e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e8b565b3360005b84518110156139b557600085828151811061387f5761387f614c34565b60200260200101519050600085838151811061389d5761389d614c34565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156139505760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610e8b565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061399a908490614c1c565b92505081905550505050806139ae90614c63565b9050613862565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613a2c929190614d39565b60405180910390a4613a4281878787878761423b565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526042602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526021602052604081208054839290613755908490614c1c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526027602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526024602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603f602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601e602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602a602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602d602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526036602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603c602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526033602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526030602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601b602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff8416613dfb5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e8b565b33613e0b81878761366d88613fa4565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915290205483811015613eaf5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610e8b565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083208785039055908816825281208054869290613ef9908490614c1c565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613f66828888888888613fef565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526039602052604081208054839290613755908490614c1c565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613fde57613fde614c34565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15613a42576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906140669089908990889088908890600401614d5e565b602060405180830381600087803b15801561408057600080fd5b505af19250505080156140ce575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526140cb91810190614dae565b60015b614184576140da614dcb565b806308c379a0141561411457506140ef614de7565b806140fa5750614116565b8060405162461bcd60e51b8152600401610e8b91906145c9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613f665760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610e8b565b73ffffffffffffffffffffffffffffffffffffffff84163b15613a42576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906142b29089908990889088908890600401614e8f565b602060405180830381600087803b1580156142cc57600080fd5b505af192505050801561431a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261431791810190614dae565b60015b614326576140da614dcb565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613f665760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610e8b565b8280546143e990614a88565b90600052602060002090601f01602090048101928261440b5760008555614451565b82601f1061442457805160ff1916838001178555614451565b82800160010185558215614451579182015b82811115614451578251825591602001919060010190614436565b5061445d929150614461565b5090565b5b8082111561445d5760008155600101614462565b803573ffffffffffffffffffffffffffffffffffffffff8116811461449a57600080fd5b919050565b600080604083850312156144b257600080fd5b6144bb83614476565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461141c57600080fd5b60006020828403121561450957600080fd5b8135614514816144c9565b9392505050565b60006020828403121561452d57600080fd5b5035919050565b60006020828403121561454657600080fd5b61451482614476565b60005b8381101561456a578181015183820152602001614552565b83811115614579576000848401525b50505050565b6000815180845261459781602086016020860161454f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000614514602083018461457f565b8035801515811461449a57600080fd5b6000602082840312156145fe57600080fd5b614514826145dc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561467a5761467a614607565b6040525050565b600067ffffffffffffffff82111561469b5761469b614607565b5060051b60200190565b600082601f8301126146b657600080fd5b813560206146c382614681565b6040516146d08282614636565b83815260059390931b85018201928281019150868411156146f057600080fd5b8286015b8481101561470b57803583529183019183016146f4565b509695505050505050565b600067ffffffffffffffff83111561473057614730614607565b60405161476560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8701160182614636565b80915083815284848401111561477a57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126147a357600080fd5b61451483833560208501614716565b600080600080600060a086880312156147ca57600080fd5b6147d386614476565b94506147e160208701614476565b9350604086013567ffffffffffffffff808211156147fe57600080fd5b61480a89838a016146a5565b9450606088013591508082111561482057600080fd5b61482c89838a016146a5565b9350608088013591508082111561484257600080fd5b5061484f88828901614792565b9150509295509295909350565b6000806040838503121561486f57600080fd5b823567ffffffffffffffff8082111561488757600080fd5b818501915085601f83011261489b57600080fd5b813560206148a882614681565b6040516148b58282614636565b83815260059390931b85018201928281019150898411156148d557600080fd5b948201945b838610156148fa576148eb86614476565b825294820194908201906148da565b9650508601359250508082111561491057600080fd5b5061491d858286016146a5565b9150509250929050565b600081518084526020808501945080840160005b838110156149575781518752958201959082019060010161493b565b509495945050505050565b6020815260006145146020830184614927565b60006020828403121561498757600080fd5b813567ffffffffffffffff81111561499e57600080fd5b8201601f810184136149af57600080fd5b6149be84823560208401614716565b949350505050565b600080604083850312156149d957600080fd5b6149e283614476565b91506149f0602084016145dc565b90509250929050565b60008060408385031215614a0c57600080fd5b614a1583614476565b91506149f060208401614476565b600080600080600060a08688031215614a3b57600080fd5b614a4486614476565b9450614a5260208701614476565b93506040860135925060608601359150608086013567ffffffffffffffff811115614a7c57600080fd5b61484f88828901614792565b600181811c90821680614a9c57607f821691505b60208210811415614ad6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008151614aee81856020860161454f565b9290920192915050565b600080845481600182811c915080831680614b1457607f831692505b6020808410821415614b4d577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015614b615760018114614b9057614bbd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614bbd565b60008b81526020902060005b86811015614bb55781548b820152908501908301614b9c565b505084890196505b505050505050614bcd8185614adc565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614c1757614c17614bd6565b500390565b60008219821115614c2f57614c2f614bd6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c9557614c95614bd6565b5060010190565b600082614cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0f57614d0f614bd6565b500290565b600060ff821660ff84168060ff03821115614d3157614d31614bd6565b019392505050565b604081526000614d4c6040830185614927565b8281036020840152614bcd8185614927565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152614da360a083018461457f565b979650505050505050565b600060208284031215614dc057600080fd5b8151614514816144c9565b600060033d1115614de45760046000803e5060005160e01c5b90565b600060443d1015614df55790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715614e4357505050505090565b8285019150815181811115614e5b5750505050505090565b843d8701016020828501011115614e755750505050505090565b614e8460208286010187614636565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152614ec860a0830186614927565b8281036060840152614eda8186614927565b90508281036080840152614eee818561457f565b9897505050505050505056fea26469706673582212205230d3ab299474f4edc0fbcbe6fd66ca1f37071ab58e9f6c716ea165db6f3e3864736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061063a5760003560e01c806399ac6f5d1161033a578063d00a6afd116101bd578063e56257d811610104578063f2fde38b116100ad578063fba7efee11610087578063fba7efee14610d9e578063fe089afd14610db1578063fe36eb1d14610dd1578063fe3f5eef14610df157600080fd5b8063f2fde38b14610d65578063f95075ff14610d78578063f98ef55614610d8b57600080fd5b8063e985e9c5116100de578063e985e9c514610cf6578063ed402ae214610d3f578063f242432a14610d5257600080fd5b8063e56257d814610cd2578063e84a26e514610ce5578063e8a3d48514610cee57600080fd5b8063dcbb646111610166578063e320182b11610140578063e320182b14610c7f578063e384e39b14610c92578063e461734e14610cb257600080fd5b8063dcbb646114610c39578063ddd4d38614610c4c578063de0cef0914610c5f57600080fd5b8063d5fb59f511610197578063d5fb59f514610c00578063d6f68fad14610c13578063d7b5513d14610c2657600080fd5b8063d00a6afd14610bc7578063d19a7f2214610bda578063d4d8812214610bed57600080fd5b8063b84cc21511610281578063c0e727401161022a578063c754cbca11610204578063c754cbca14610ba2578063cc857ebb14610bab578063cf779f0514610bbe57600080fd5b8063c0e7274014610b7e578063c14aa39a14610b86578063c4a1bddd14610b9957600080fd5b8063bd85b0391161025b578063bd85b03914610b38578063bf6ac4bb14610b58578063c08c74a414610b6b57600080fd5b8063b84cc21514610b13578063b852896e14610b26578063baf2298814610b2f57600080fd5b8063a22cb465116102e3578063a7bc25f0116102bd578063a7bc25f014610ae4578063a86a147e14610af7578063aaf9e43d14610b0a57600080fd5b8063a22cb46514610ab5578063a374672214610ac8578063a467cd5914610adb57600080fd5b80639c7c2ed4116103145780639c7c2ed414610a555780639d0ae34114610a75578063a05d14fa14610a9557600080fd5b806399ac6f5d14610a1c5780639c21163914610a2f5780639c61287414610a4257600080fd5b80634e1273f4116104c2578063715018a6116104095780638091e48a116103b257806390f8d3fa1161038c57806390f8d3fa146109ed578063938e3d7b146109f6578063998cc63b14610a0957600080fd5b80638091e48a1461099f5780638da5cb5b146109b25780639028d0d1146109da57600080fd5b80637ba8aa25116103e35780637ba8aa25146109665780637d95b75c146109795780637e383a2c1461098c57600080fd5b8063715018a614610943578063743976a01461094b5780637a729b341461095357600080fd5b8063549634ae1161046b57806361d3c6371161044557806361d3c637146109145780636bb06e651461091d5780636bb0c2901461093057600080fd5b8063549634ae146108db57806355f804b3146108ee5780635e02e9c51461090157600080fd5b80634f558e791161049c5780634f558e79146108935780634fa014c3146108b5578063530ca14c146108c857600080fd5b80634e1273f4146108405780634f05ee94146108605780634f1346a51461088057600080fd5b806325cb1fb8116105865780633e1b4d161161052f57806345637a291161050957806345637a291461081b57806346b8b7e71461082e5780634bf3329a1461083757600080fd5b80633e1b4d16146107c85780633e2d39b3146107e857806344d6f8cd146107fb57600080fd5b80633c9e5c7d116105605780633c9e5c7d146107975780633cb40e16146107b75780633dd8d2a0146107bf57600080fd5b806325cb1fb8146107725780632caba8741461077b5780632eb2c2d61461078457600080fd5b806317c9e4e4116105e8578063229ce0ba116105c2578063229ce0ba1461072c57806323ed24461461073f578063243e38ae1461075f57600080fd5b806317c9e4e4146106e65780631d2e5a3a146107065780631f6b8f681461071957600080fd5b8063088d379e11610619578063088d379e1461069d57806309ee43c9146106a65780630e89341c146106c657600080fd5b8062fdd58e1461063f57806301ffc9a714610665578063036e25af14610688575b600080fd5b61065261064d36600461449f565b610e04565b6040519081526020015b60405180910390f35b6106786106733660046144f7565b610ec7565b604051901515815260200161065c565b61069b61069636600461451b565b610fac565b005b610652600c5481565b6106526106b4366004614534565b602b6020526000908152604090205481565b6106d96106d436600461451b565b611018565b60405161065c91906145c9565b6106526106f4366004614534565b602e6020526000908152604090205481565b61069b6107143660046145ec565b61104c565b61069b61072736600461451b565b6110e4565b61065261073a366004614534565b611150565b61065261074d366004614534565b60316020526000908152604090205481565b61069b61076d36600461451b565b611183565b610652600b5481565b61065260145481565b61069b6107923660046147b2565b6112da565b6106526107a5366004614534565b60406020819052600091825290205481565b61069b611389565b61065260125481565b6106526107d6366004614534565b601f6020526000908152604090205481565b61069b6107f636600461451b565b61141f565b610652610809366004614534565b60286020526000908152604090205481565b61069b61082936600461451b565b61156e565b61065260135481565b61065260115481565b61085361084e36600461485c565b6115da565b60405161065c9190614962565b61065261086e366004614534565b60436020526000908152604090205481565b61069b61088e36600461451b565b611718565b6106786108a136600461451b565b600090815260046020526040902054151590565b61069b6108c336600461451b565b611784565b6106526108d6366004614534565b6117f0565b61069b6108e936600461451b565b611823565b61069b6108fc366004614975565b61188f565b61065261090f366004614534565b61190d565b61065260075481565b61069b61092b36600461451b565b611940565b61069b61093e36600461451b565b6119ac565b61069b611afb565b6106d9611b6e565b610652610961366004614534565b611bfc565b61069b61097436600461451b565b611c2f565b61069b61098736600461451b565b611c9b565b61065261099a366004614534565b611d07565b61069b6109ad36600461451b565b611d3a565b60035460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161065c565b61069b6109e836600461451b565b611da6565b61065260095481565b61069b610a04366004614975565b611e12565b610652610a17366004614534565b611e8c565b610652610a2a366004614534565b611ebf565b61069b610a3d36600461451b565b611ef2565b61069b610a5036600461451b565b612041565b610652610a63366004614534565b603a6020526000908152604090205481565b610652610a83366004614534565b60376020526000908152604090205481565b610652610aa3366004614534565b60346020526000908152604090205481565b61069b610ac33660046149c6565b6120ad565b61069b610ad636600461451b565b6121d0565b61065260055481565b610652610af2366004614534565b61231f565b610652610b05366004614534565b612352565b610652600a5481565b61069b610b2136600461451b565b612385565b610652600e5481565b610652600d5481565b610652610b4636600461451b565b60009081526004602052604090205490565b610652610b66366004614534565b612482565b61069b610b7936600461451b565b6124b5565b6106d9612521565b61069b610b9436600461451b565b61252e565b610652600f5481565b61065260065481565b61069b610bb936600461451b565b61267d565b61065260105481565b61069b610bd536600461451b565b6127cc565b610652610be8366004614534565b61291b565b61069b610bfb36600461451b565b61294e565b61069b610c0e36600461451b565b612a4b565b61069b610c2136600461451b565b612b9a565b61069b610c3436600461451b565b612c97565b610652610c47366004614534565b612d94565b610652610c5a366004614534565b612dc7565b610652610c6d366004614534565b601c6020526000908152604090205481565b610652610c8d366004614534565b612dfb565b610652610ca0366004614534565b60226020526000908152604090205481565b610652610cc0366004614534565b60196020526000908152604090205481565b61069b610ce036600461451b565b612e2e565b61065260085481565b6106d9612e9a565b610678610d043660046149f9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61069b610d4d36600461451b565b612f2c565b61069b610d60366004614a23565b61307b565b61069b610d73366004614534565b613123565b61069b610d8636600461451b565b61321c565b61069b610d9936600461451b565b613288565b61069b610dac36600461451b565b6133d7565b610652610dbf366004614534565b60256020526000908152604090205481565b610652610ddf366004614534565b603d6020526000908152604090205481565b610652610dff366004614534565b613443565b600073ffffffffffffffffffffffffffffffffffffffff8316610e945760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526020818152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480610f5a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b80610fa657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603b55565b6060601561102583613476565b604051602001611036929190614af8565b6040516020818303038152906040529050919050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60035473ffffffffffffffffffffffffffffffffffffffff16331461114b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602c55565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260336020526040812054603554610fa69190614c05565b60175460ff166111d55760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146112255760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061122f33613443565b101561127d5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461128957600080fd5b601454600554111561129a57600080fd5b6112b633600183604051806020016040528060008152506135d3565b6112c03382613720565b80600560008282546112d29190614c1c565b909155505050565b73ffffffffffffffffffffffffffffffffffffffff851633148061130357506113038533610d04565b6113755760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610e8b565b611382858585858561375e565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146113f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b60405133904780156108fc02916000818181858888f1935050505015801561141c573d6000803e3d6000fd5b50565b60175460ff166114715760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146114c15760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806114cb33611d07565b10156115195760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461152557600080fd5b601454601354111561153657600080fd5b61155233600f83604051806020016040528060008152506135d3565b61155c3382613a4a565b80601360008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff1633146115d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603255565b606081518351146116535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610e8b565b6000835167ffffffffffffffff81111561166f5761166f614607565b604051908082528060200260200182016040528015611698578160200160208202803683370190505b50905060005b8451811015611710576116e38582815181106116bc576116bc614c34565b60200260200101518583815181106116d6576116d6614c34565b6020026020010151610e04565b8282815181106116f5576116f5614c34565b602090810291909101015261170981614c63565b905061169e565b509392505050565b60035473ffffffffffffffffffffffffffffffffffffffff16331461177f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602655565b60035473ffffffffffffffffffffffffffffffffffffffff1633146117eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602355565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260366020526040812054603854610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff16331461188a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b604155565b60035473ffffffffffffffffffffffffffffffffffffffff1633146118f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b80516119099060159060208401906143dd565b5050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602a6020526040812054602c54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff1633146119a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603555565b60175460ff166119fe5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114611a4e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80611a583361291b565b1015611aa65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314611ab257600080fd5b6014546008541115611ac357600080fd5b611adf33600483604051806020016040528060008152506135d3565b611ae93382613a7f565b80600860008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff163314611b625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b611b6c6000613ab4565b565b60158054611b7b90614a88565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba790614a88565b8015611bf45780601f10611bc957610100808354040283529160200191611bf4565b820191906000526020600020905b815481529060010190602001808311611bd757829003601f168201915b505050505081565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260396020526040812054603b54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314611c965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602f55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611d025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603855565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260426020526040812054604454610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314611da15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b604455565b60035473ffffffffffffffffffffffffffffffffffffffff163314611e0d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601d55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611e795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b80516119099060169060208401906143dd565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260246020526040812054602654610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603f6020526040812054604154610fa69190614c05565b60175460ff16611f445760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114611f945760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80611f9e33612d94565b1015611fec5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314611ff857600080fd5b601454600a54111561200957600080fd5b61202533600683604051806020016040528060008152506135d3565b61202f3382613b2b565b80600a60008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff1633146120a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601455565b3373ffffffffffffffffffffffffffffffffffffffff831614156121395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610e8b565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60175460ff166122225760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146122725760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061227c33611e8c565b10156122ca5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b3233146122d657600080fd5b60145460095411156122e757600080fd5b61230333600583604051806020016040528060008152506135d3565b61230d3382613b60565b80600960008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152603c6020526040812054603e54610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260306020526040812054603254610fa69190614c05565b806001146123d55760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806123df33611ebf565b101561242d5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461243957600080fd5b601454601254111561244a57600080fd5b61246633600e83604051806020016040528060008152506135d3565b6124703382613b95565b80601260008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602d6020526040812054602f54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff16331461251c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b603e55565b60168054611b7b90614a88565b60175460ff166125805760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b806001146125d05760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806125da33612dc7565b10156126285760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461263457600080fd5b601454600754111561264557600080fd5b61266133600383604051806020016040528060008152506135d3565b61266b3382613bca565b80600760008282546112d29190614c1c565b60175460ff166126cf5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461271f5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806127293361190d565b10156127775760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461278357600080fd5b601454600b54111561279457600080fd5b6127b033600783604051806020016040528060008152506135d3565b6127ba3382613bff565b80600b60008282546112d29190614c1c565b60175460ff1661281e5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461286e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061287833612482565b10156128c65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b3233146128d257600080fd5b601454600c5411156128e357600080fd5b6128ff33600883604051806020016040528060008152506135d3565b6129093382613c34565b80600c60008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260216020526040812054602354610fa69190614c05565b8060011461299e5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b806129a8336117f0565b10156129f65760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612a0257600080fd5b601454600f541115612a1357600080fd5b612a2f33600b83604051806020016040528060008152506135d3565b612a393382613c69565b80600f60008282546112d29190614c1c565b60175460ff16612a9d5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114612aed5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612af73361231f565b1015612b455760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612b5157600080fd5b6014546011541115612b6257600080fd5b612b7e33600d83604051806020016040528060008152506135d3565b612b883382613c9e565b80601160008282546112d29190614c1c565b80600114612bea5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612bf433611150565b1015612c425760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612c4e57600080fd5b601454600e541115612c5f57600080fd5b612c7b33600a83604051806020016040528060008152506135d3565b612c853382613cd3565b80600e60008282546112d29190614c1c565b80600114612ce75760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612cf133612352565b1015612d3f5760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b323314612d4b57600080fd5b601454600d541115612d5c57600080fd5b612d7833600983604051806020016040528060008152506135d3565b612d823382613d08565b80600d60008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260276020526040812054602954610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601e602090815260408220549054610fa69190614c05565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601b6020526040812054601d54610fa69190614c05565b60035473ffffffffffffffffffffffffffffffffffffffff163314612e955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602955565b606060168054612ea990614a88565b80601f0160208091040260200160405190810160405280929190818152602001828054612ed590614a88565b8015612f225780601f10612ef757610100808354040283529160200191612f22565b820191906000526020600020905b815481529060010190602001808311612f0557829003601f168201915b5050505050905090565b60175460ff16612f7e5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b80600114612fce5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b80612fd833612dfb565b10156130265760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461303257600080fd5b601454600654111561304357600080fd5b61305f33600283604051806020016040528060008152506135d3565b6130693382613d3d565b80600660008282546112d29190614c1c565b73ffffffffffffffffffffffffffffffffffffffff85163314806130a457506130a48533610d04565b6131165760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610e8b565b6113828585858585613d72565b60035473ffffffffffffffffffffffffffffffffffffffff16331461318a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b73ffffffffffffffffffffffffffffffffffffffff81166132135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e8b565b61141c81613ab4565b60035473ffffffffffffffffffffffffffffffffffffffff1633146132835760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b602055565b60175460ff166132da5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206c697665207965740000000000000000000000006044820152606401610e8b565b8060011461332a5760405162461bcd60e51b815260206004820152601360248201527f596f752063616e206f6e6c79206d696e742031000000000000000000000000006044820152606401610e8b565b8061333433611bfc565b10156133825760405162461bcd60e51b815260206004820152601360248201527f596f7520616c726561647920636c61696d6564000000000000000000000000006044820152606401610e8b565b32331461338e57600080fd5b601454601054111561339f57600080fd5b6133bb33600c83604051806020016040528060008152506135d3565b6133c53382613f6f565b80601060008282546112d29190614c1c565b60035473ffffffffffffffffffffffffffffffffffffffff16331461343e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e8b565b601a55565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260186020526040812054601a54610fa69190614c05565b6060816134b657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156134e057806134ca81614c63565b91506134d99050600a83614c9c565b91506134ba565b60008167ffffffffffffffff8111156134fb576134fb614607565b6040519080825280601f01601f191660200182016040528015613525576020820181803683370190505b509050815b85156135ca5761353b600182614c05565b9050600061354a600a88614c9c565b61355590600a614cd7565b61355f9088614c05565b61356a906030614d14565b905060008160f81b90508084848151811061358757613587614c34565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c1600a89614c9c565b9750505061352a565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff841661365c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e8b565b336136768160008761366d88613fa4565b61138288613fa4565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812080548592906136b3908490614c1c565b9091555050604080518581526020810185905273ffffffffffffffffffffffffffffffffffffffff80881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461138281600087878787613fef565b73ffffffffffffffffffffffffffffffffffffffff821660009081526018602052604081208054839290613755908490614c1c565b90915550505050565b81518351146137d55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610e8b565b73ffffffffffffffffffffffffffffffffffffffff841661385e5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e8b565b3360005b84518110156139b557600085828151811061387f5761387f614c34565b60200260200101519050600085838151811061389d5761389d614c34565b6020908102919091018101516000848152808352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156139505760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610e8b565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061399a908490614c1c565b92505081905550505050806139ae90614c63565b9050613862565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613a2c929190614d39565b60405180910390a4613a4281878787878761423b565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526042602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526021602052604081208054839290613755908490614c1c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526027602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526024602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603f602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601e602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602a602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602d602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526036602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152603c602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526033602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526030602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601b602052604081208054839290613755908490614c1c565b73ffffffffffffffffffffffffffffffffffffffff8416613dfb5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e8b565b33613e0b81878761366d88613fa4565b60008481526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915290205483811015613eaf5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610e8b565b60008581526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b8116855292528083208785039055908816825281208054869290613ef9908490614c1c565b9091555050604080518681526020810186905273ffffffffffffffffffffffffffffffffffffffff808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613f66828888888888613fef565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526039602052604081208054839290613755908490614c1c565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613fde57613fde614c34565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15613a42576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906140669089908990889088908890600401614d5e565b602060405180830381600087803b15801561408057600080fd5b505af19250505080156140ce575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526140cb91810190614dae565b60015b614184576140da614dcb565b806308c379a0141561411457506140ef614de7565b806140fa5750614116565b8060405162461bcd60e51b8152600401610e8b91906145c9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610e8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613f665760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610e8b565b73ffffffffffffffffffffffffffffffffffffffff84163b15613a42576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906142b29089908990889088908890600401614e8f565b602060405180830381600087803b1580156142cc57600080fd5b505af192505050801561431a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261431791810190614dae565b60015b614326576140da614dcb565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613f665760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610e8b565b8280546143e990614a88565b90600052602060002090601f01602090048101928261440b5760008555614451565b82601f1061442457805160ff1916838001178555614451565b82800160010185558215614451579182015b82811115614451578251825591602001919060010190614436565b5061445d929150614461565b5090565b5b8082111561445d5760008155600101614462565b803573ffffffffffffffffffffffffffffffffffffffff8116811461449a57600080fd5b919050565b600080604083850312156144b257600080fd5b6144bb83614476565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461141c57600080fd5b60006020828403121561450957600080fd5b8135614514816144c9565b9392505050565b60006020828403121561452d57600080fd5b5035919050565b60006020828403121561454657600080fd5b61451482614476565b60005b8381101561456a578181015183820152602001614552565b83811115614579576000848401525b50505050565b6000815180845261459781602086016020860161454f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000614514602083018461457f565b8035801515811461449a57600080fd5b6000602082840312156145fe57600080fd5b614514826145dc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff8211171561467a5761467a614607565b6040525050565b600067ffffffffffffffff82111561469b5761469b614607565b5060051b60200190565b600082601f8301126146b657600080fd5b813560206146c382614681565b6040516146d08282614636565b83815260059390931b85018201928281019150868411156146f057600080fd5b8286015b8481101561470b57803583529183019183016146f4565b509695505050505050565b600067ffffffffffffffff83111561473057614730614607565b60405161476560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8701160182614636565b80915083815284848401111561477a57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126147a357600080fd5b61451483833560208501614716565b600080600080600060a086880312156147ca57600080fd5b6147d386614476565b94506147e160208701614476565b9350604086013567ffffffffffffffff808211156147fe57600080fd5b61480a89838a016146a5565b9450606088013591508082111561482057600080fd5b61482c89838a016146a5565b9350608088013591508082111561484257600080fd5b5061484f88828901614792565b9150509295509295909350565b6000806040838503121561486f57600080fd5b823567ffffffffffffffff8082111561488757600080fd5b818501915085601f83011261489b57600080fd5b813560206148a882614681565b6040516148b58282614636565b83815260059390931b85018201928281019150898411156148d557600080fd5b948201945b838610156148fa576148eb86614476565b825294820194908201906148da565b9650508601359250508082111561491057600080fd5b5061491d858286016146a5565b9150509250929050565b600081518084526020808501945080840160005b838110156149575781518752958201959082019060010161493b565b509495945050505050565b6020815260006145146020830184614927565b60006020828403121561498757600080fd5b813567ffffffffffffffff81111561499e57600080fd5b8201601f810184136149af57600080fd5b6149be84823560208401614716565b949350505050565b600080604083850312156149d957600080fd5b6149e283614476565b91506149f0602084016145dc565b90509250929050565b60008060408385031215614a0c57600080fd5b614a1583614476565b91506149f060208401614476565b600080600080600060a08688031215614a3b57600080fd5b614a4486614476565b9450614a5260208701614476565b93506040860135925060608601359150608086013567ffffffffffffffff811115614a7c57600080fd5b61484f88828901614792565b600181811c90821680614a9c57607f821691505b60208210811415614ad6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008151614aee81856020860161454f565b9290920192915050565b600080845481600182811c915080831680614b1457607f831692505b6020808410821415614b4d577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015614b615760018114614b9057614bbd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614bbd565b60008b81526020902060005b86811015614bb55781548b820152908501908301614b9c565b505084890196505b505050505050614bcd8185614adc565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614c1757614c17614bd6565b500390565b60008219821115614c2f57614c2f614bd6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c9557614c95614bd6565b5060010190565b600082614cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0f57614d0f614bd6565b500290565b600060ff821660ff84168060ff03821115614d3157614d31614bd6565b019392505050565b604081526000614d4c6040830185614927565b8281036020840152614bcd8185614927565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152614da360a083018461457f565b979650505050505050565b600060208284031215614dc057600080fd5b8151614514816144c9565b600060033d1115614de45760046000803e5060005160e01c5b90565b600060443d1015614df55790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715614e4357505050505090565b8285019150815181811115614e5b5750505050505090565b843d8701016020828501011115614e755750505050505090565b614e8460208286010187614636565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152614ec860a0830186614927565b8281036060840152614eda8186614927565b90508281036080840152614eee818561457f565b9897505050505050505056fea26469706673582212205230d3ab299474f4edc0fbcbe6fd66ca1f37071ab58e9f6c716ea165db6f3e3864736f6c63430008090033
Deployed Bytecode Sourcemap
162:17438:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2122:231:3;;;;;;:::i;:::-;;:::i;:::-;;;620:25:12;;;608:2;593:18;2122:231:3;;;;;;;;1145:310;;;;;;:::i;:::-;;:::i;:::-;;;1253:14:12;;1246:22;1228:41;;1216:2;1201:18;1145:310:3;1088:187:12;14944:118:5;;;;;;:::i;:::-;;:::i;:::-;;927:20;;;;;;2298:55;;;;;;:::i;:::-;;;;;;;;;;;;;;16519:145;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2460:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17409:76;;;;;;:::i;:::-;;:::i;13030:116::-;;;;;;:::i;:::-;;:::i;14030:139::-;;;;;;:::i;:::-;;:::i;2622:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3780:446;;;;;;:::i;:::-;;:::i;903:20::-;;;;;;1127:33;;;;;;4217:442:3;;;;;;:::i;:::-;;:::i;3445:56:5:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;17490:107;;;:::i;1075:21::-;;;;;;1650:55;;;;;;:::i;:::-;;;;;;;;;;;;;;10015:453;;;;;;:::i;:::-;;:::i;2136:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;13788:116;;;;;;:::i;:::-;;:::i;1100:21::-;;;;;;1050;;;;;;2519:524:3;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3610:56:5:-;;;;;;:::i;:::-;;;;;;;;;;;;;;12272:116;;;;;;:::i;:::-;;:::i;17302:99::-;;;;;;:::i;:::-;17359:4;17276:16;;;:12;:16;;;;;;-1:-1:-1;;;17302:99:5;11893:116;;;;;;:::i;:::-;;:::i;14416:139::-;;;;;;:::i;:::-;;:::i;15716:118::-;;;;;;:::i;:::-;;:::i;16227:86::-;;;;;;:::i;:::-;;:::i;12891:136::-;;;;;;:::i;:::-;;:::i;807:20::-;;;;;;14172:118;;;;;;:::i;:::-;;:::i;5141:450::-;;;;;;:::i;:::-;;:::i;1650:94:10:-;;;:::i;1166:22:5:-;;;:::i;14802:139::-;;;;;;:::i;:::-;;:::i;13409:116::-;;;;;;:::i;:::-;;:::i;14558:118::-;;;;;;:::i;:::-;;:::i;15962:139::-;;;;;;:::i;:::-;;:::i;16104:118::-;;;;;;:::i;:::-;;:::i;999:87:10:-;1072:6;;999:87;;1072:6;;;;8482:74:12;;8470:2;8455:18;999:87:10;8336:226:12;11135:116:5;;;;;;:::i;:::-;;:::i;855:20::-;;;;;;16316:94;;;;;;:::i;:::-;;:::i;12133:136::-;;;;;;:::i;:::-;;:::i;15574:139::-;;;;;;:::i;:::-;;:::i;6051:453::-;;;;;;:::i;:::-;;:::i;16415:99::-;;;;;;:::i;:::-;;:::i;3115:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;2950;;;;;;:::i;:::-;;;;;;;;;;;;;;2785;;;;;;:::i;:::-;;;;;;;;;;;;;;3116:311:3;;;;;;:::i;:::-;;:::i;5596:450:5:-;;;;;;:::i;:::-;;:::i;756:20::-;;;;;;15188:139;;;;;;:::i;:::-;;:::i;13649:136::-;;;;;;:::i;:::-;;:::i;879:20::-;;;;;;9601:409;;;;;;:::i;:::-;;:::i;975:21::-;;;;;;951:20;;;;;;17193:104;;;;;;:::i;:::-;17255:7;17276:16;;;:12;:16;;;;;;;17193:104;13270:136;;;;;;:::i;:::-;;:::i;15330:118::-;;;;;;:::i;:::-;;:::i;1192:26::-;;;:::i;4686:450::-;;;;;;:::i;:::-;;:::i;1000:21::-;;;;;;783:20;;;;;;6509:459;;;;;;:::i;:::-;;:::i;1025:21::-;;;;;;6973:455;;;;;;:::i;:::-;;:::i;11754:136::-;;;;;;:::i;:::-;;:::i;8255:409::-;;;;;;:::i;:::-;;:::i;9133:463::-;;;;;;:::i;:::-;;:::i;7843:407::-;;;;;;:::i;:::-;;:::i;7433:405::-;;;;;;:::i;:::-;;:::i;12512:136::-;;;;;;:::i;:::-;;:::i;11375:::-;;;;;;:::i;:::-;;:::i;1488:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;10996:136;;;;;;:::i;:::-;;:::i;1812:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1326;;;;;;:::i;:::-;;;;;;;;;;;;;;12651:116;;;;;;:::i;:::-;;:::i;831:20::-;;;;;;16667:88;;;:::i;3499:168:3:-;;;;;;:::i;:::-;3622:27;;;;3598:4;3622:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3499:168;4232:449:5;;;;;;:::i;:::-;;:::i;3739:401:3:-;;;;;;:::i;:::-;;:::i;1899:192:10:-;;;;;;:::i;:::-;;:::i;11514:116:5:-;;;;;;:::i;:::-;;:::i;8669:459::-;;;;;;:::i;:::-;;:::i;10752:116::-;;;;;;:::i;:::-;;:::i;1974:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3280:56;;;;;;:::i;:::-;;;;;;;;;;;;;;10613:136;;;;;;:::i;:::-;;:::i;2122:231:3:-;2208:7;2236:21;;;2228:77;;;;-1:-1:-1;;;2228:77:3;;9904:2:12;2228:77:3;;;9886:21:12;9943:2;9923:18;;;9916:30;9982:34;9962:18;;;9955:62;10053:13;10033:18;;;10026:41;10084:19;;2228:77:3;;;;;;;;;-1:-1:-1;2323:9:3;:13;;;;;;;;;;;:22;;;;;;;;;;;;;2122:231::o;1145:310::-;1247:4;1284:41;;;1299:26;1284:41;;:110;;-1:-1:-1;1342:52:3;;;1357:37;1342:52;1284:110;:163;;;-1:-1:-1;911:25:4;896:40;;;;1411:36:3;1264:183;1145:310;-1:-1:-1;;1145:310:3:o;14944:118:5:-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;15019:18:5::1;:38:::0;14944:118::o;16519:145::-;16579:13;16630:8;16640:17;16649:7;16640:8;:17::i;:::-;16613:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16599:60;;16519:145;;;:::o;17409:76::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;17462:8:5::1;:18:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;17409:76::o;13030:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;13104:17:5::1;:37:::0;13030:116::o;14030:139::-;14139:22;;;14095:7;14139:22;;;:14;:22;;;;;;14118:18;;:43;;14139:22;14118:43;:::i;3780:446::-;3845:8;;;;3837:40;;;;-1:-1:-1;;;3837:40:5;;13048:2:12;3837:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;3837:40:5;12846:344:12;3837:40:5;3896:3;3903:1;3896:8;3888:39;;;;-1:-1:-1;;;3888:39:5;;13397:2:12;3888:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;3888:39:5;13195:343:12;3888:39:5;3978:3;3945:29;3963:10;3945:17;:29::i;:::-;:36;;3937:67;;;;-1:-1:-1;;;3937:67:5;;13745:2:12;3937:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;3937:67:5;13543:343:12;3937:67:5;4019:9;4032:10;4019:23;4011:32;;;;;;4095:12;;4086:5;;:21;;4078:30;;;;;;4119:32;4125:10;331:1;4143:3;4119:32;;;;;;;;;;;;:5;:32::i;:::-;4162:33;4179:10;4191:3;4162:16;:33::i;:::-;4215:3;4206:5;;:12;;;;;;;:::i;:::-;;;;-1:-1:-1;;;3780:446:5:o;4217:442:3:-;4450:20;;;681:10:1;4450:20:3;;:60;;-1:-1:-1;4474:36:3;4491:4;681:10:1;3499:168:3;:::i;4474:36::-;4428:160;;;;-1:-1:-1;;;4428:160:3;;14226:2:12;4428:160:3;;;14208:21:12;14265:2;14245:18;;;14238:30;14304:34;14284:18;;;14277:62;14375:20;14355:18;;;14348:48;14413:19;;4428:160:3;14024:414:12;4428:160:3;4599:52;4622:4;4628:2;4632:3;4637:7;4646:4;4599:22;:52::i;:::-;4217:442;;;;;:::o;17490:107:5:-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;17541:51:5::1;::::0;17549:10:::1;::::0;17570:21:::1;17541:51:::0;::::1;;;::::0;::::1;::::0;;;17570:21;17549:10;17541:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;17490:107::o:0;10015:453::-;10081:8;;;;10073:40;;;;-1:-1:-1;;;10073:40:5;;13048:2:12;10073:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;10073:40:5;12846:344:12;10073:40:5;10132:3;10139:1;10132:8;10124:39;;;;-1:-1:-1;;;10124:39:5;;13397:2:12;10124:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;10124:39:5;13195:343:12;10124:39:5;10215:3;10181:30;10200:10;10181:18;:30::i;:::-;:37;;10173:68;;;;-1:-1:-1;;;10173:68:5;;13745:2:12;10173:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;10173:68:5;13543:343:12;10173:68:5;10256:9;10269:10;10256:23;10248:32;;;;;;10333:12;;10323:6;;:22;;10315:31;;;;;;10357:33;10363:10;748:2;10382:3;10357:33;;;;;;;;;;;;:5;:33::i;:::-;10401:34;10419:10;10431:3;10401:17;:34::i;:::-;10457:3;10447:6;;:13;;;;;;;:::i;13788:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;13862:17:5::1;:37:::0;13788:116::o;2519:524:3:-;2675:16;2736:3;:10;2717:8;:15;:29;2709:83;;;;-1:-1:-1;;;2709:83:3;;14645:2:12;2709:83:3;;;14627:21:12;14684:2;14664:18;;;14657:30;14723:34;14703:18;;;14696:62;14794:11;14774:18;;;14767:39;14823:19;;2709:83:3;14443:405:12;2709:83:3;2805:30;2852:8;:15;2838:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2838:30:3;;2805:63;;2886:9;2881:122;2905:8;:15;2901:1;:19;2881:122;;;2961:30;2971:8;2980:1;2971:11;;;;;;;;:::i;:::-;;;;;;;2984:3;2988:1;2984:6;;;;;;;;:::i;:::-;;;;;;;2961:9;:30::i;:::-;2942:13;2956:1;2942:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2922:3;;;:::i;:::-;;;2881:122;;;-1:-1:-1;3022:13:3;2519:524;-1:-1:-1;;;2519:524:3:o;12272:116:5:-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;12346:17:5::1;:37:::0;12272:116::o;11893:::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;11967:17:5::1;:37:::0;11893:116::o;14416:139::-;14525:22;;;14481:7;14525:22;;;:14;:22;;;;;;14504:18;;:43;;14525:22;14504:43;:::i;15716:118::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;15791:18:5::1;:38:::0;15716:118::o;16227:86::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;16291:17:5;;::::1;::::0;:8:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;16227:86:::0;:::o;12891:136::-;12998:21;;;12955:7;12998:21;;;:13;:21;;;;;;12978:17;;:41;;12998:21;12978:41;:::i;14172:118::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;14247:18:5::1;:38:::0;14172:118::o;5141:450::-;5210:8;;;;5202:40;;;;-1:-1:-1;;;5202:40:5;;13048:2:12;5202:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;5202:40:5;12846:344:12;5202:40:5;5261:3;5268:1;5261:8;5253:39;;;;-1:-1:-1;;;5253:39:5;;13397:2:12;5253:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;5253:39:5;13195:343:12;5253:39:5;5343:3;5310:29;5328:10;5310:17;:29::i;:::-;:36;;5302:67;;;;-1:-1:-1;;;5302:67:5;;13745:2:12;5302:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;5302:67:5;13543:343:12;5302:67:5;5384:9;5397:10;5384:23;5376:32;;;;;;5460:12;;5451:5;;:21;;5443:30;;;;;;5484:32;5490:10;418:1;5508:3;5484:32;;;;;;;;;;;;:5;:32::i;:::-;5527:33;5544:10;5556:3;5527:16;:33::i;:::-;5580:3;5571:5;;:12;;;;;;;:::i;1650:94:10:-;1072:6;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;1166:22:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14802:139::-;14911:22;;;14867:7;14911:22;;;:14;:22;;;;;;14890:18;;:43;;14911:22;14890:43;:::i;13409:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;13483:17:5::1;:37:::0;13409:116::o;14558:118::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;14633:18:5::1;:38:::0;14558:118::o;15962:139::-;16071:22;;;16027:7;16071:22;;;:14;:22;;;;;;16050:18;;:43;;16071:22;16050:43;:::i;16104:118::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;16179:18:5::1;:38:::0;16104:118::o;11135:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;11209:17:5::1;:37:::0;11135:116::o;16316:94::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;16384:21:5;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;12133:136::-:0;12240:21;;;12197:7;12240:21;;;:13;:21;;;;;;12220:17;;:41;;12240:21;12220:41;:::i;15574:139::-;15683:22;;;15639:7;15683:22;;;:14;:22;;;;;;15662:18;;:43;;15683:22;15662:43;:::i;6051:453::-;6117:8;;;;6109:40;;;;-1:-1:-1;;;6109:40:5;;13048:2:12;6109:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;6109:40:5;12846:344:12;6109:40:5;6168:3;6175:1;6168:8;6160:39;;;;-1:-1:-1;;;6160:39:5;;13397:2:12;6160:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;6160:39:5;13195:343:12;6160:39:5;6250:3;6217:29;6235:10;6217:17;:29::i;:::-;:36;;6209:67;;;;-1:-1:-1;;;6209:67:5;;13745:2:12;6209:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;6209:67:5;13543:343:12;6209:67:5;6291:9;6304:10;6291:23;6283:32;;;;;;6370:12;;6361:5;;:21;;6353:30;;;;;;6394:32;6400:10;476:1;6418:3;6394:32;;;;;;;;;;;;:5;:32::i;:::-;6437:33;6454:10;6466:3;6437:16;:33::i;:::-;6493:3;6484:5;;:12;;;;;;;:::i;16415:99::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;16481:12:5::1;:28:::0;16415:99::o;3116:311:3:-;681:10:1;3219:24:3;;;;;3211:78;;;;-1:-1:-1;;;3211:78:3;;15444:2:12;3211:78:3;;;15426:21:12;15483:2;15463:18;;;15456:30;15522:34;15502:18;;;15495:62;15593:11;15573:18;;;15566:39;15622:19;;3211:78:3;15242:405:12;3211:78:3;681:10:1;3302:32:3;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;3371:48;;1228:41:12;;;3302:42:3;;681:10:1;3371:48:3;;1201:18:12;3371:48:3;;;;;;;3116:311;;:::o;5596:450:5:-;5665:8;;;;5657:40;;;;-1:-1:-1;;;5657:40:5;;13048:2:12;5657:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;5657:40:5;12846:344:12;5657:40:5;5716:3;5723:1;5716:8;5708:39;;;;-1:-1:-1;;;5708:39:5;;13397:2:12;5708:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;5708:39:5;13195:343:12;5708:39:5;5798:3;5765:29;5783:10;5765:17;:29::i;:::-;:36;;5757:67;;;;-1:-1:-1;;;5757:67:5;;13745:2:12;5757:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;5757:67:5;13543:343:12;5757:67:5;5839:9;5852:10;5839:23;5831:32;;;;;;5915:12;;5906:5;;:21;;5898:30;;;;;;5939:32;5945:10;447:1;5963:3;5939:32;;;;;;;;;;;;:5;:32::i;:::-;5982:33;5999:10;6011:3;5982:16;:33::i;:::-;6035:3;6026:5;;:12;;;;;;;:::i;15188:139::-;15297:22;;;15253:7;15297:22;;;:14;:22;;;;;;15276:18;;:43;;15297:22;15276:43;:::i;13649:136::-;13756:21;;;13713:7;13756:21;;;:13;:21;;;;;;13736:17;;:41;;13756:21;13736:41;:::i;9601:409::-;9671:3;9678:1;9671:8;9663:39;;;;-1:-1:-1;;;9663:39:5;;13397:2:12;9663:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;9663:39:5;13195:343:12;9663:39:5;9754:3;9720:30;9739:10;9720:18;:30::i;:::-;:37;;9712:68;;;;-1:-1:-1;;;9712:68:5;;13745:2:12;9712:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;9712:68:5;13543:343:12;9712:68:5;9795:9;9808:10;9795:23;9787:32;;;;;;9872:12;;9862:6;;:22;;9854:31;;;;;;9896:33;9902:10;717:2;9921:3;9896:33;;;;;;;;;;;;:5;:33::i;:::-;9940:34;9958:10;9970:3;9940:17;:34::i;:::-;9999:3;9989:6;;:13;;;;;;;:::i;13270:136::-;13377:21;;;13334:7;13377:21;;;:13;:21;;;;;;13357:17;;:41;;13377:21;13357:41;:::i;15330:118::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;15405:18:5::1;:38:::0;15330:118::o;1192:26::-;;;;;;;:::i;4686:450::-;4751:8;;;;4743:40;;;;-1:-1:-1;;;4743:40:5;;13048:2:12;4743:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;4743:40:5;12846:344:12;4743:40:5;4802:3;4809:1;4802:8;4794:39;;;;-1:-1:-1;;;4794:39:5;;13397:2:12;4794:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;4794:39:5;13195:343:12;4794:39:5;4884:3;4851:29;4869:10;4851:17;:29::i;:::-;:36;;4843:67;;;;-1:-1:-1;;;4843:67:5;;13745:2:12;4843:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;4843:67:5;13543:343:12;4843:67:5;4925:9;4938:10;4925:23;4917:32;;;;;;5005:12;;4996:5;;:21;;4988:30;;;;;;5029:32;5035:10;389:1;5053:3;5029:32;;;;;;;;;;;;:5;:32::i;:::-;5072:33;5089:10;5101:3;5072:16;:33::i;:::-;5125:3;5116:5;;:12;;;;;;;:::i;6509:459::-;6578:8;;;;6570:40;;;;-1:-1:-1;;;6570:40:5;;13048:2:12;6570:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;6570:40:5;12846:344:12;6570:40:5;6629:3;6636:1;6629:8;6621:39;;;;-1:-1:-1;;;6621:39:5;;13397:2:12;6621:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;6621:39:5;13195:343:12;6621:39:5;6711:3;6678:29;6696:10;6678:17;:29::i;:::-;:36;;6670:67;;;;-1:-1:-1;;;6670:67:5;;13745:2:12;6670:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;6670:67:5;13543:343:12;6670:67:5;6752:9;6765:10;6752:23;6744:32;;;;;;6832:12;;6823:5;;:21;;6815:30;;;;;;6856:32;6862:10;505:1;6880:3;6856:32;;;;;;;;;;;;:5;:32::i;:::-;6899:33;6916:10;6928:3;6899:16;:33::i;:::-;6957:3;6948:5;;:12;;;;;;;:::i;6973:455::-;7040:8;;;;7032:40;;;;-1:-1:-1;;;7032:40:5;;13048:2:12;7032:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;7032:40:5;12846:344:12;7032:40:5;7091:3;7098:1;7091:8;7083:39;;;;-1:-1:-1;;;7083:39:5;;13397:2:12;7083:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;7083:39:5;13195:343:12;7083:39:5;7173:3;7140:29;7158:10;7140:17;:29::i;:::-;:36;;7132:67;;;;-1:-1:-1;;;7132:67:5;;13745:2:12;7132:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;7132:67:5;13543:343:12;7132:67:5;7214:9;7227:10;7214:23;7206:32;;;;;;7290:12;;7281:5;;:21;;7273:30;;;;;;7314:32;7320:10;534:1;7338:3;7314:32;;;;;;;;;;;;:5;:32::i;:::-;7357:33;7374:10;7386:3;7357:16;:33::i;:::-;7417:3;7408:5;;:12;;;;;;;:::i;11754:136::-;11861:21;;;11818:7;11861:21;;;:13;:21;;;;;;11841:17;;:41;;11861:21;11841:41;:::i;8255:409::-;8325:3;8332:1;8325:8;8317:39;;;;-1:-1:-1;;;8317:39:5;;13397:2:12;8317:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;8317:39:5;13195:343:12;8317:39:5;8408:3;8374:30;8393:10;8374:18;:30::i;:::-;:37;;8366:68;;;;-1:-1:-1;;;8366:68:5;;13745:2:12;8366:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;8366:68:5;13543:343:12;8366:68:5;8449:9;8462:10;8449:23;8441:32;;;;;;8526:12;;8516:6;;:22;;8508:31;;;;;;8550:33;8556:10;624:2;8575:3;8550:33;;;;;;;;;;;;:5;:33::i;:::-;8594:34;8612:10;8624:3;8594:17;:34::i;:::-;8654:3;8644:6;;:13;;;;;;;:::i;9133:463::-;9204:8;;;;9196:40;;;;-1:-1:-1;;;9196:40:5;;13048:2:12;9196:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;9196:40:5;12846:344:12;9196:40:5;9255:3;9262:1;9255:8;9247:39;;;;-1:-1:-1;;;9247:39:5;;13397:2:12;9247:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;9247:39:5;13195:343:12;9247:39:5;9338:3;9304:30;9323:10;9304:18;:30::i;:::-;:37;;9296:68;;;;-1:-1:-1;;;9296:68:5;;13745:2:12;9296:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;9296:68:5;13543:343:12;9296:68:5;9379:9;9392:10;9379:23;9371:32;;;;;;9456:12;;9446:6;;:22;;9438:31;;;;;;9480:33;9486:10;686:2;9505:3;9480:33;;;;;;;;;;;;:5;:33::i;:::-;9524:34;9542:10;9554:3;9524:17;:34::i;:::-;9585:3;9575:6;;:13;;;;;;;:::i;7843:407::-;7910:3;7917:1;7910:8;7902:39;;;;-1:-1:-1;;;7902:39:5;;13397:2:12;7902:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;7902:39:5;13195:343:12;7902:39:5;7993:3;7959:30;7978:10;7959:18;:30::i;:::-;:37;;7951:68;;;;-1:-1:-1;;;7951:68:5;;13745:2:12;7951:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;7951:68:5;13543:343:12;7951:68:5;8034:9;8047:10;8034:23;8026:32;;;;;;8111:12;;8101:6;;:22;;8093:31;;;;;;8135:33;8141:10;593:2;8160:3;8135:33;;;;;;;;;;;;:5;:33::i;:::-;8179:34;8197:10;8209:3;8179:17;:34::i;:::-;8239:3;8229:6;;:13;;;;;;;:::i;7433:405::-;7502:3;7509:1;7502:8;7494:39;;;;-1:-1:-1;;;7494:39:5;;13397:2:12;7494:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;7494:39:5;13195:343:12;7494:39:5;7584:3;7551:29;7569:10;7551:17;:29::i;:::-;:36;;7543:67;;;;-1:-1:-1;;;7543:67:5;;13745:2:12;7543:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;7543:67:5;13543:343:12;7543:67:5;7625:9;7638:10;7625:23;7617:32;;;;;;7701:12;;7692:5;;:21;;7684:30;;;;;;7725:32;7731:10;563:1;7749:3;7725:32;;;;;;;;;;;;:5;:32::i;:::-;7768:33;7785:10;7797:3;7768:16;:33::i;:::-;7827:3;7818:5;;:12;;;;;;;:::i;12512:136::-;12619:21;;;12576:7;12619:21;;;:13;:21;;;;;;12599:17;;:41;;12619:21;12599:41;:::i;11375:136::-;11482:21;;;11439:7;11482:21;;;:13;:21;;;;;;;;11462:17;;:41;;11482:21;11462:41;:::i;10996:136::-;11103:21;;;11060:7;11103:21;;;:13;:21;;;;;;11083:17;;:41;;11103:21;11083:41;:::i;12651:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;12725:17:5::1;:37:::0;12651:116::o;16667:88::-;16711:13;16738:12;16731:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16667:88;:::o;4232:449::-;4298:8;;;;4290:40;;;;-1:-1:-1;;;4290:40:5;;13048:2:12;4290:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;4290:40:5;12846:344:12;4290:40:5;4349:3;4356:1;4349:8;4341:39;;;;-1:-1:-1;;;4341:39:5;;13397:2:12;4341:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;4341:39:5;13195:343:12;4341:39:5;4431:3;4398:29;4416:10;4398:17;:29::i;:::-;:36;;4390:67;;;;-1:-1:-1;;;4390:67:5;;13745:2:12;4390:67:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;4390:67:5;13543:343:12;4390:67:5;4472:9;4485:10;4472:23;4464:32;;;;;;4548:12;;4539:5;;:21;;4531:30;;;;;;4572:32;4578:10;360:1;4596:3;4572:32;;;;;;;;;;;;:5;:32::i;:::-;4615:33;4632:10;4644:3;4615:16;:33::i;:::-;4670:3;4661:5;;:12;;;;;;;:::i;3739:401:3:-;3947:20;;;681:10:1;3947:20:3;;:60;;-1:-1:-1;3971:36:3;3988:4;681:10:1;3499:168:3;:::i;3971:36::-;3925:151;;;;-1:-1:-1;;;3925:151:3;;15854:2:12;3925:151:3;;;15836:21:12;15893:2;15873:18;;;15866:30;15932:34;15912:18;;;15905:62;16003:11;15983:18;;;15976:39;16032:19;;3925:151:3;15652:405:12;3925:151:3;4087:45;4105:4;4111:2;4115;4119:6;4127:4;4087:17;:45::i;1899:192:10:-;1072:6;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;1988:22:::1;::::0;::::1;1980:73;;;::::0;-1:-1:-1;;;1980:73:10;;16264:2:12;1980:73:10::1;::::0;::::1;16246:21:12::0;16303:2;16283:18;;;16276:30;16342:34;16322:18;;;16315:62;16413:8;16393:18;;;16386:36;16439:19;;1980:73:10::1;16062:402:12::0;1980:73:10::1;2064:19;2074:8;2064:9;:19::i;11514:116:5:-:0;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;11588:17:5::1;:37:::0;11514:116::o;8669:459::-;8738:8;;;;8730:40;;;;-1:-1:-1;;;8730:40:5;;13048:2:12;8730:40:5;;;13030:21:12;13087:2;13067:18;;;13060:30;13126:22;13106:18;;;13099:50;13166:18;;8730:40:5;12846:344:12;8730:40:5;8789:3;8796:1;8789:8;8781:39;;;;-1:-1:-1;;;8781:39:5;;13397:2:12;8781:39:5;;;13379:21:12;13436:2;13416:18;;;13409:30;13475:21;13455:18;;;13448:49;13514:18;;8781:39:5;13195:343:12;8781:39:5;8872:3;8838:30;8857:10;8838:18;:30::i;:::-;:37;;8830:68;;;;-1:-1:-1;;;8830:68:5;;13745:2:12;8830:68:5;;;13727:21:12;13784:2;13764:18;;;13757:30;13823:21;13803:18;;;13796:49;13862:18;;8830:68:5;13543:343:12;8830:68:5;8913:9;8926:10;8913:23;8905:32;;;;;;8990:12;;8980:6;;:22;;8972:31;;;;;;9014:33;9020:10;655:2;9039:3;9014:33;;;;;;;;;;;;:5;:33::i;:::-;9058:34;9076:10;9088:3;9058:17;:34::i;:::-;9117:3;9107:6;;:13;;;;;;;:::i;10752:116::-;1072:6:10;;1219:23;1072:6;681:10:1;1219:23:10;1211:68;;;;-1:-1:-1;;;1211:68:10;;10316:2:12;1211:68:10;;;10298:21:12;;;10335:18;;;10328:30;10394:34;10374:18;;;10367:62;10446:18;;1211:68:10;10114:356:12;1211:68:10;10826:17:5::1;:37:::0;10752:116::o;10613:136::-;10720:21;;;10677:7;10720:21;;;:13;:21;;;;;;10700:17;;:41;;10720:21;10700:41;:::i;16758:430::-;16811:27;16849:7;16845:26;;-1:-1:-1;;16859:10:5;;;;;;;;;;;;;;;;;;16758:430::o;16845:26::-;16888:2;16876:9;16912:32;16919:6;;16912:32;;16928:5;;;;:::i;:::-;;-1:-1:-1;16935:7:5;;-1:-1:-1;16940:2:5;16935:7;;:::i;:::-;;;16912:32;;;16949:17;16979:3;16969:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16969:14:5;-1:-1:-1;16949:34:5;-1:-1:-1;17001:3:5;17009:151;17016:7;;17009:151;;17035:5;17039:1;17035;:5;:::i;:::-;17031:9;-1:-1:-1;17046:10:5;17077:7;17082:2;17077;:7;:::i;:::-;17076:14;;17088:2;17076:14;:::i;:::-;17071:19;;:2;:19;:::i;:::-;17060:31;;:2;:31;:::i;:::-;17046:46;;17098:9;17117:4;17110:12;;17098:24;;17138:2;17128:4;17133:1;17128:7;;;;;;;;:::i;:::-;;;;:12;;;;;;;;;;-1:-1:-1;17146:8:5;17152:2;17146:8;;:::i;:::-;;;17025:135;;17009:151;;;-1:-1:-1;17178:4:5;16758:430;-1:-1:-1;;;;16758:430:5:o;8708:599:3:-;8866:21;;;8858:67;;;;-1:-1:-1;;;8858:67:3;;17392:2:12;8858:67:3;;;17374:21:12;17431:2;17411:18;;;17404:30;17470:34;17450:18;;;17443:62;17541:3;17521:18;;;17514:31;17562:19;;8858:67:3;17190:397:12;8858:67:3;681:10:1;8982:107:3;681:10:1;8938:16:3;9025:7;9034:21;9052:2;9034:17;:21::i;:::-;9057:25;9075:6;9057:17;:25::i;8982:107::-;9102:9;:13;;;;;;;;;;;:22;;;;;;;;;;:32;;9128:6;;9102:9;:32;;9128:6;;9102:32;:::i;:::-;;;;-1:-1:-1;;9150:57:3;;;17766:25:12;;;17822:2;17807:18;;17800:34;;;9150:57:3;;;;;9183:1;;9150:57;;;;;;17739:18:12;9150:57:3;;;;;;;9220:79;9251:8;9269:1;9273:7;9282:2;9286:6;9294:4;9220:30;:79::i;10497:110:5:-;10569:21;;;;;;;:13;:21;;;;;:30;;10594:5;;10569:21;:30;;10594:5;;10569:30;:::i;:::-;;;;-1:-1:-1;;;;10497:110:5:o;6301:1074:3:-;6528:7;:14;6514:3;:10;:28;6506:81;;;;-1:-1:-1;;;6506:81:3;;18047:2:12;6506:81:3;;;18029:21:12;18086:2;18066:18;;;18059:30;18125:34;18105:18;;;18098:62;18196:10;18176:18;;;18169:38;18224:19;;6506:81:3;17845:404:12;6506:81:3;6606:16;;;6598:66;;;;-1:-1:-1;;;6598:66:3;;18456:2:12;6598:66:3;;;18438:21:12;18495:2;18475:18;;;18468:30;18534:34;18514:18;;;18507:62;18605:7;18585:18;;;18578:35;18630:19;;6598:66:3;18254:401:12;6598:66:3;681:10:1;6677:16:3;6794:421;6818:3;:10;6814:1;:14;6794:421;;;6850:10;6863:3;6867:1;6863:6;;;;;;;;:::i;:::-;;;;;;;6850:19;;6884:14;6901:7;6909:1;6901:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6928:19;6950:13;;;;;;;;;;:19;;;;;;;;;;;;;6901:10;;-1:-1:-1;6992:21:3;;;;6984:76;;;;-1:-1:-1;;;6984:76:3;;18862:2:12;6984:76:3;;;18844:21:12;18901:2;18881:18;;;18874:30;18940:34;18920:18;;;18913:62;19011:12;18991:18;;;18984:40;19041:19;;6984:76:3;18660:406:12;6984:76:3;7104:9;:13;;;;;;;;;;;:19;;;;;;;;;;;7126:20;;;7104:42;;7176:17;;;;;;;:27;;7126:20;;7104:9;7176:27;;7126:20;;7176:27;:::i;:::-;;;;;;;;6835:380;;;6830:3;;;;:::i;:::-;;;6794:421;;;;7262:2;7232:47;;7256:4;7232:47;;7246:8;7232:47;;;7266:3;7271:7;7232:47;;;;;;;:::i;:::-;;;;;;;;7292:75;7328:8;7338:4;7344:2;7348:3;7353:7;7362:4;7292:35;:75::i;:::-;6495:880;6301:1074;;;;;:::o;15844:112:5:-;15917:22;;;;;;;:14;:22;;;;;:31;;15943:5;;15917:22;:31;;15943:5;;15917:31;:::i;11638:110::-;11710:21;;;;;;;:13;:21;;;;;:30;;11735:5;;11710:21;:30;;11735:5;;11710:30;:::i;2099:173:10:-;2174:6;;;;2191:17;;;;;;;;;;;2224:40;;2174:6;;;2191:17;2174:6;;2224:40;;2155:16;;2224:40;2144:128;2099:173;:::o;12396:110:5:-;12468:21;;;;;;;:13;:21;;;;;:30;;12493:5;;12468:21;:30;;12493:5;;12468:30;:::i;12017:110::-;12089:21;;;;;;;:13;:21;;;;;:30;;12114:5;;12089:21;:30;;12114:5;;12089:30;:::i;15456:112::-;15529:22;;;;;;;:14;:22;;;;;:31;;15555:5;;15529:22;:31;;15555:5;;15529:31;:::i;11259:110::-;11331:21;;;;;;;:13;:21;;;;;:30;;11356:5;;11331:21;:30;;11356:5;;11331:30;:::i;12775:110::-;12847:21;;;;;;;:13;:21;;;;;:30;;12872:5;;12847:21;:30;;12872:5;;12847:30;:::i;13154:110::-;13226:21;;;;;;;:13;:21;;;;;:30;;13251:5;;13226:21;:30;;13251:5;;13226:30;:::i;14298:112::-;14371:22;;;;;;;:14;:22;;;;;:31;;14397:5;;14371:22;:31;;14397:5;;14371:31;:::i;15070:112::-;15143:22;;;;;;;:14;:22;;;;;:31;;15169:5;;15143:22;:31;;15169:5;;15143:31;:::i;13912:112::-;13985:22;;;;;;;:14;:22;;;;;:31;;14011:5;;13985:22;:31;;14011:5;;13985:31;:::i;13533:110::-;13605:21;;;;;;;:13;:21;;;;;:30;;13630:5;;13605:21;:30;;13630:5;;13605:30;:::i;10880:110::-;10952:21;;;;;;;:13;:21;;;;;:30;;10977:5;;10952:21;:30;;10977:5;;10952:30;:::i;5123:820:3:-;5311:16;;;5303:66;;;;-1:-1:-1;;;5303:66:3;;18456:2:12;5303:66:3;;;18438:21:12;18495:2;18475:18;;;18468:30;18534:34;18514:18;;;18507:62;18605:7;18585:18;;;18578:35;18630:19;;5303:66:3;18254:401:12;5303:66:3;681:10:1;5426:96:3;681:10:1;5457:4:3;5463:2;5467:21;5485:2;5467:17;:21::i;5426:96::-;5535:19;5557:13;;;;;;;;;;;:19;;;;;;;;;;;5595:21;;;;5587:76;;;;-1:-1:-1;;;5587:76:3;;18862:2:12;5587:76:3;;;18844:21:12;18901:2;18881:18;;;18874:30;18940:34;18920:18;;;18913:62;19011:12;18991:18;;;18984:40;19041:19;;5587:76:3;18660:406:12;5587:76:3;5699:9;:13;;;;;;;;;;;:19;;;;;;;;;;;5721:20;;;5699:42;;5763:17;;;;;;;:27;;5721:20;;5699:9;5763:27;;5721:20;;5763:27;:::i;:::-;;;;-1:-1:-1;;5808:46:3;;;17766:25:12;;;17822:2;17807:18;;17800:34;;;5808:46:3;;;;;;;;;;;;;;;17739:18:12;5808:46:3;;;;;;;5867:68;5898:8;5908:4;5914:2;5918;5922:6;5930:4;5867:30;:68::i;:::-;5292:651;;5123:820;;;;;:::o;14684:112:5:-;14757:22;;;;;;;:14;:22;;;;;:31;;14783:5;;14757:22;:31;;14783:5;;14757:31;:::i;15219:198:3:-;15339:16;;;15353:1;15339:16;;;;;;;;;15285;;15314:22;;15339:16;;;;;;;;;;;;-1:-1:-1;15339:16:3;15314:41;;15377:7;15366:5;15372:1;15366:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;15404:5;15219:198;-1:-1:-1;;15219:198:3:o;13638:748::-;13853:13;;;1066:20:0;1114:8;13849:530:3;;13889:72;;;;;:38;;;;;;:72;;13928:8;;13938:4;;13944:2;;13948:6;;13956:4;;13889:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13889:72:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13885:483;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14241:6;14234:14;;-1:-1:-1;;;14234:14:3;;;;;;;;:::i;13885:483::-;;;14290:62;;-1:-1:-1;;;14290:62:3;;21517:2:12;14290:62:3;;;21499:21:12;21556:2;21536:18;;;21529:30;21595:34;21575:18;;;21568:62;21666:22;21646:18;;;21639:50;21706:19;;14290:62:3;21315:416:12;13885:483:3;14011:59;;;14023:47;14011:59;14007:158;;14095:50;;-1:-1:-1;;;14095:50:3;;21938:2:12;14095:50:3;;;21920:21:12;21977:2;21957:18;;;21950:30;22016:34;21996:18;;;21989:62;22087:10;22067:18;;;22060:38;22115:19;;14095:50:3;21736:404:12;14394:817:3;14634:13;;;1066:20:0;1114:8;14630:574:3;;14670:79;;;;;:43;;;;;;:79;;14714:8;;14724:4;;14730:3;;14735:7;;14744:4;;14670:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14670:79:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14666:527;;;;:::i;:::-;14831:64;;;14843:52;14831:64;14827:163;;14920:50;;-1:-1:-1;;;14920:50:3;;21938:2:12;14920:50:3;;;21920:21:12;21977:2;21957:18;;;21950:30;22016:34;21996:18;;;21989:62;22087:10;22067:18;;;22060:38;22115:19;;14920:50:3;21736:404:12;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:12;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:12:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;:::-;1072:5;838:245;-1:-1:-1;;;838:245:12:o;1280:180::-;1339:6;1392:2;1380:9;1371:7;1367:23;1363:32;1360:52;;;1408:1;1405;1398:12;1360:52;-1:-1:-1;1431:23:12;;1280:180;-1:-1:-1;1280:180:12:o;1465:186::-;1524:6;1577:2;1565:9;1556:7;1552:23;1548:32;1545:52;;;1593:1;1590;1583:12;1545:52;1616:29;1635:9;1616:29;:::i;1656:258::-;1728:1;1738:113;1752:6;1749:1;1746:13;1738:113;;;1828:11;;;1822:18;1809:11;;;1802:39;1774:2;1767:10;1738:113;;;1869:6;1866:1;1863:13;1860:48;;;1904:1;1895:6;1890:3;1886:16;1879:27;1860:48;;1656:258;;;:::o;1919:328::-;1972:3;2010:5;2004:12;2037:6;2032:3;2025:19;2053:63;2109:6;2102:4;2097:3;2093:14;2086:4;2079:5;2075:16;2053:63;:::i;:::-;2161:2;2149:15;2166:66;2145:88;2136:98;;;;2236:4;2132:109;;1919:328;-1:-1:-1;;1919:328:12:o;2252:231::-;2401:2;2390:9;2383:21;2364:4;2421:56;2473:2;2462:9;2458:18;2450:6;2421:56;:::i;2488:160::-;2553:20;;2609:13;;2602:21;2592:32;;2582:60;;2638:1;2635;2628:12;2653:180;2709:6;2762:2;2750:9;2741:7;2737:23;2733:32;2730:52;;;2778:1;2775;2768:12;2730:52;2801:26;2817:9;2801:26;:::i;2838:184::-;2890:77;2887:1;2880:88;2987:4;2984:1;2977:15;3011:4;3008:1;3001:15;3027:308;3133:66;3128:2;3122:4;3118:13;3114:86;3106:6;3102:99;3267:6;3255:10;3252:22;3231:18;3219:10;3216:34;3213:62;3210:88;;;3278:18;;:::i;:::-;3314:2;3307:22;-1:-1:-1;;3027:308:12:o;3340:183::-;3400:4;3433:18;3425:6;3422:30;3419:56;;;3455:18;;:::i;:::-;-1:-1:-1;3500:1:12;3496:14;3512:4;3492:25;;3340:183::o;3528:724::-;3582:5;3635:3;3628:4;3620:6;3616:17;3612:27;3602:55;;3653:1;3650;3643:12;3602:55;3689:6;3676:20;3715:4;3738:43;3778:2;3738:43;:::i;:::-;3810:2;3804:9;3822:31;3850:2;3842:6;3822:31;:::i;:::-;3888:18;;;3980:1;3976:10;;;;3964:23;;3960:32;;;3922:15;;;;-1:-1:-1;4004:15:12;;;4001:35;;;4032:1;4029;4022:12;4001:35;4068:2;4060:6;4056:15;4080:142;4096:6;4091:3;4088:15;4080:142;;;4162:17;;4150:30;;4200:12;;;;4113;;4080:142;;;-1:-1:-1;4240:6:12;3528:724;-1:-1:-1;;;;;;3528:724:12:o;4257:527::-;4321:5;4355:18;4347:6;4344:30;4341:56;;;4377:18;;:::i;:::-;4426:2;4420:9;4438:128;4560:4;4491:66;4486:2;4478:6;4474:15;4470:88;4466:99;4458:6;4438:128;:::i;:::-;4584:6;4575:15;;4614:6;4606;4599:22;4654:3;4645:6;4640:3;4636:16;4633:25;4630:45;;;4671:1;4668;4661:12;4630:45;4721:6;4716:3;4709:4;4701:6;4697:17;4684:44;4776:1;4769:4;4760:6;4752;4748:19;4744:30;4737:41;;4257:527;;;;;:::o;4789:220::-;4831:5;4884:3;4877:4;4869:6;4865:17;4861:27;4851:55;;4902:1;4899;4892:12;4851:55;4924:79;4999:3;4990:6;4977:20;4970:4;4962:6;4958:17;4924:79;:::i;5014:943::-;5168:6;5176;5184;5192;5200;5253:3;5241:9;5232:7;5228:23;5224:33;5221:53;;;5270:1;5267;5260:12;5221:53;5293:29;5312:9;5293:29;:::i;:::-;5283:39;;5341:38;5375:2;5364:9;5360:18;5341:38;:::i;:::-;5331:48;;5430:2;5419:9;5415:18;5402:32;5453:18;5494:2;5486:6;5483:14;5480:34;;;5510:1;5507;5500:12;5480:34;5533:61;5586:7;5577:6;5566:9;5562:22;5533:61;:::i;:::-;5523:71;;5647:2;5636:9;5632:18;5619:32;5603:48;;5676:2;5666:8;5663:16;5660:36;;;5692:1;5689;5682:12;5660:36;5715:63;5770:7;5759:8;5748:9;5744:24;5715:63;:::i;:::-;5705:73;;5831:3;5820:9;5816:19;5803:33;5787:49;;5861:2;5851:8;5848:16;5845:36;;;5877:1;5874;5867:12;5845:36;;5900:51;5943:7;5932:8;5921:9;5917:24;5900:51;:::i;:::-;5890:61;;;5014:943;;;;;;;;:::o;5962:1208::-;6080:6;6088;6141:2;6129:9;6120:7;6116:23;6112:32;6109:52;;;6157:1;6154;6147:12;6109:52;6197:9;6184:23;6226:18;6267:2;6259:6;6256:14;6253:34;;;6283:1;6280;6273:12;6253:34;6321:6;6310:9;6306:22;6296:32;;6366:7;6359:4;6355:2;6351:13;6347:27;6337:55;;6388:1;6385;6378:12;6337:55;6424:2;6411:16;6446:4;6469:43;6509:2;6469:43;:::i;:::-;6541:2;6535:9;6553:31;6581:2;6573:6;6553:31;:::i;:::-;6619:18;;;6707:1;6703:10;;;;6695:19;;6691:28;;;6653:15;;;;-1:-1:-1;6731:19:12;;;6728:39;;;6763:1;6760;6753:12;6728:39;6787:11;;;;6807:148;6823:6;6818:3;6815:15;6807:148;;;6889:23;6908:3;6889:23;:::i;:::-;6877:36;;6840:12;;;;6933;;;;6807:148;;;6974:6;-1:-1:-1;;7018:18:12;;7005:32;;-1:-1:-1;;7049:16:12;;;7046:36;;;7078:1;7075;7068:12;7046:36;;7101:63;7156:7;7145:8;7134:9;7130:24;7101:63;:::i;:::-;7091:73;;;5962:1208;;;;;:::o;7175:435::-;7228:3;7266:5;7260:12;7293:6;7288:3;7281:19;7319:4;7348:2;7343:3;7339:12;7332:19;;7385:2;7378:5;7374:14;7406:1;7416:169;7430:6;7427:1;7424:13;7416:169;;;7491:13;;7479:26;;7525:12;;;;7560:15;;;;7452:1;7445:9;7416:169;;;-1:-1:-1;7601:3:12;;7175:435;-1:-1:-1;;;;;7175:435:12:o;7615:261::-;7794:2;7783:9;7776:21;7757:4;7814:56;7866:2;7855:9;7851:18;7843:6;7814:56;:::i;7881:450::-;7950:6;8003:2;7991:9;7982:7;7978:23;7974:32;7971:52;;;8019:1;8016;8009:12;7971:52;8059:9;8046:23;8092:18;8084:6;8081:30;8078:50;;;8124:1;8121;8114:12;8078:50;8147:22;;8200:4;8192:13;;8188:27;-1:-1:-1;8178:55:12;;8229:1;8226;8219:12;8178:55;8252:73;8317:7;8312:2;8299:16;8294:2;8290;8286:11;8252:73;:::i;:::-;8242:83;7881:450;-1:-1:-1;;;;7881:450:12:o;8567:254::-;8632:6;8640;8693:2;8681:9;8672:7;8668:23;8664:32;8661:52;;;8709:1;8706;8699:12;8661:52;8732:29;8751:9;8732:29;:::i;:::-;8722:39;;8780:35;8811:2;8800:9;8796:18;8780:35;:::i;:::-;8770:45;;8567:254;;;;;:::o;8826:260::-;8894:6;8902;8955:2;8943:9;8934:7;8930:23;8926:32;8923:52;;;8971:1;8968;8961:12;8923:52;8994:29;9013:9;8994:29;:::i;:::-;8984:39;;9042:38;9076:2;9065:9;9061:18;9042:38;:::i;9091:606::-;9195:6;9203;9211;9219;9227;9280:3;9268:9;9259:7;9255:23;9251:33;9248:53;;;9297:1;9294;9287:12;9248:53;9320:29;9339:9;9320:29;:::i;:::-;9310:39;;9368:38;9402:2;9391:9;9387:18;9368:38;:::i;:::-;9358:48;;9453:2;9442:9;9438:18;9425:32;9415:42;;9504:2;9493:9;9489:18;9476:32;9466:42;;9559:3;9548:9;9544:19;9531:33;9587:18;9579:6;9576:30;9573:50;;;9619:1;9616;9609:12;9573:50;9642:49;9683:7;9674:6;9663:9;9659:22;9642:49;:::i;10475:437::-;10554:1;10550:12;;;;10597;;;10618:61;;10672:4;10664:6;10660:17;10650:27;;10618:61;10725:2;10717:6;10714:14;10694:18;10691:38;10688:218;;;10762:77;10759:1;10752:88;10863:4;10860:1;10853:15;10891:4;10888:1;10881:15;10688:218;;10475:437;;;:::o;11043:185::-;11085:3;11123:5;11117:12;11138:52;11183:6;11178:3;11171:4;11164:5;11160:16;11138:52;:::i;:::-;11206:16;;;;;11043:185;-1:-1:-1;;11043:185:12:o;11233:1289::-;11409:3;11438:1;11471:6;11465:13;11501:3;11523:1;11551:9;11547:2;11543:18;11533:28;;11611:2;11600:9;11596:18;11633;11623:61;;11677:4;11669:6;11665:17;11655:27;;11623:61;11703:2;11751;11743:6;11740:14;11720:18;11717:38;11714:222;;;11790:77;11785:3;11778:90;11891:4;11888:1;11881:15;11921:4;11916:3;11909:17;11714:222;11952:18;11979:162;;;;12155:1;12150:320;;;;11945:525;;11979:162;12027:66;12016:9;12012:82;12007:3;12000:95;12124:6;12119:3;12115:16;12108:23;;11979:162;;12150:320;10990:1;10983:14;;;11027:4;11014:18;;12245:1;12259:165;12273:6;12270:1;12267:13;12259:165;;;12351:14;;12338:11;;;12331:35;12394:16;;;;12288:10;;12259:165;;;12263:3;;12453:6;12448:3;12444:16;12437:23;;11945:525;;;;;;;12486:30;12512:3;12504:6;12486:30;:::i;:::-;12479:37;11233:1289;-1:-1:-1;;;;;11233:1289:12:o;12527:184::-;12579:77;12576:1;12569:88;12676:4;12673:1;12666:15;12700:4;12697:1;12690:15;12716:125;12756:4;12784:1;12781;12778:8;12775:34;;;12789:18;;:::i;:::-;-1:-1:-1;12826:9:12;;12716:125::o;13891:128::-;13931:3;13962:1;13958:6;13955:1;13952:13;13949:39;;;13968:18;;:::i;:::-;-1:-1:-1;14004:9:12;;13891:128::o;14853:184::-;14905:77;14902:1;14895:88;15002:4;14999:1;14992:15;15026:4;15023:1;15016:15;15042:195;15081:3;15112:66;15105:5;15102:77;15099:103;;;15182:18;;:::i;:::-;-1:-1:-1;15229:1:12;15218:13;;15042:195::o;16469:274::-;16509:1;16535;16525:189;;16570:77;16567:1;16560:88;16671:4;16668:1;16661:15;16699:4;16696:1;16689:15;16525:189;-1:-1:-1;16728:9:12;;16469:274::o;16748:228::-;16788:7;16914:1;16846:66;16842:74;16839:1;16836:81;16831:1;16824:9;16817:17;16813:105;16810:131;;;16921:18;;:::i;:::-;-1:-1:-1;16961:9:12;;16748:228::o;16981:204::-;17019:3;17055:4;17052:1;17048:12;17087:4;17084:1;17080:12;17122:3;17116:4;17112:14;17107:3;17104:23;17101:49;;;17130:18;;:::i;:::-;17166:13;;16981:204;-1:-1:-1;;;16981:204:12:o;19071:465::-;19328:2;19317:9;19310:21;19291:4;19354:56;19406:2;19395:9;19391:18;19383:6;19354:56;:::i;:::-;19458:9;19450:6;19446:22;19441:2;19430:9;19426:18;19419:50;19486:44;19523:6;19515;19486:44;:::i;19541:595::-;19763:4;19792:42;19873:2;19865:6;19861:15;19850:9;19843:34;19925:2;19917:6;19913:15;19908:2;19897:9;19893:18;19886:43;;19965:6;19960:2;19949:9;19945:18;19938:34;20008:6;20003:2;19992:9;19988:18;19981:34;20052:3;20046;20035:9;20031:19;20024:32;20073:57;20125:3;20114:9;20110:19;20102:6;20073:57;:::i;:::-;20065:65;19541:595;-1:-1:-1;;;;;;;19541:595:12:o;20141:249::-;20210:6;20263:2;20251:9;20242:7;20238:23;20234:32;20231:52;;;20279:1;20276;20269:12;20231:52;20311:9;20305:16;20330:30;20354:5;20330:30;:::i;20395:179::-;20430:3;20472:1;20454:16;20451:23;20448:120;;;20518:1;20515;20512;20497:23;-1:-1:-1;20555:1:12;20549:8;20544:3;20540:18;20448:120;20395:179;:::o;20579:731::-;20618:3;20660:4;20642:16;20639:26;20636:39;;;20579:731;:::o;20636:39::-;20702:2;20696:9;20724:66;20845:2;20827:16;20823:25;20820:1;20814:4;20799:50;20878:4;20872:11;20902:16;20937:18;21008:2;21001:4;20993:6;20989:17;20986:25;20981:2;20973:6;20970:14;20967:45;20964:58;;;21015:5;;;;;20579:731;:::o;20964:58::-;21052:6;21046:4;21042:17;21031:28;;21088:3;21082:10;21115:2;21107:6;21104:14;21101:27;;;21121:5;;;;;;20579:731;:::o;21101:27::-;21205:2;21186:16;21180:4;21176:27;21172:36;21165:4;21156:6;21151:3;21147:16;21143:27;21140:69;21137:82;;;21212:5;;;;;;20579:731;:::o;21137:82::-;21228:57;21279:4;21270:6;21262;21258:19;21254:30;21248:4;21228:57;:::i;:::-;-1:-1:-1;21301:3:12;;20579:731;-1:-1:-1;;;;;20579:731:12:o;22145:861::-;22467:4;22496:42;22577:2;22569:6;22565:15;22554:9;22547:34;22629:2;22621:6;22617:15;22612:2;22601:9;22597:18;22590:43;;22669:3;22664:2;22653:9;22649:18;22642:31;22696:57;22748:3;22737:9;22733:19;22725:6;22696:57;:::i;:::-;22801:9;22793:6;22789:22;22784:2;22773:9;22769:18;22762:50;22835:44;22872:6;22864;22835:44;:::i;:::-;22821:58;;22928:9;22920:6;22916:22;22910:3;22899:9;22895:19;22888:51;22956:44;22993:6;22985;22956:44;:::i;:::-;22948:52;22145:861;-1:-1:-1;;;;;;;;22145:861:12:o
Swarm Source
ipfs://5230d3ab299474f4edc0fbcbe6fd66ca1f37071ab58e9f6c716ea165db6f3e38
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.