Overview
TokenID
1
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
QuantumMintPass
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /* Inspiration from MetaHero MintPass https://etherscan.io/address/0x797a48c46be32aafcedcfd3d8992493d8a1f256b */ pragma solidity ^0.8.0; import "./IQuantumMintPass.sol"; import "./OSContractURI.sol"; import "./ERC2981.sol"; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol'; import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol'; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/utils/Address.sol"; contract QuantumMintPass is ERC2981, IQuantumMintPass, OSContractURI, Ownable, ERC1155Supply, ERC1155Burnable { struct MintPass { bytes32 merkleRoot; uint256 price; string uriSuffix; address redeemableContract; // contract of the redeemable NFT } event Claimed(uint mpId, address indexed account, uint amount); string public name; string public symbol; uint private _counter; address payable private _treasury; mapping (uint256 => MintPass) public mintPasses; mapping (uint256 => mapping (address => bool)) public claimed; constructor(string memory baseURI, address payable treasury) ERC1155(baseURI) { name = "Quantum MintPass"; symbol = "QPASS"; _treasury = treasury; } function setBaseURI(string memory baseURI) external onlyOwner { _setURI(baseURI); } function setContractURI(string calldata newUri) onlyOwner override public { super.setContractURI(newUri); } function setRoyalteFee(uint256 fee) onlyOwner override public { royaltyFee = fee; } function addMintPass( bytes32 merkleRoot, uint256 price, string memory uriSuffix, address redeemableContract ) external onlyOwner { mintPasses[_counter++] = MintPass( merkleRoot, price, uriSuffix, redeemableContract ); } function editMintPass( uint256 mpId, bytes32 merkleRoot, uint256 price, string memory uriSuffix, address redeemableContract ) external onlyOwner { mintPasses[mpId] = MintPass( merkleRoot, price, uriSuffix, redeemableContract ); } function burnFromRedeem( address user, uint256 mpId, uint256 amount ) external override { require(mintPasses[mpId].redeemableContract == msg.sender, "burnFromRedeem: Only allowed from redeemable contract"); _burn(user, mpId, amount); } function claim( uint256 mpId, uint256 amount, bytes32[] calldata merkleProof ) external payable { MintPass memory mp = mintPasses[mpId]; require(msg.value == mp.price * amount, "claim: invalid msg.value"); require(mp.merkleRoot.length > 0, "claim: mint pass does not exist"); require(!claimed[mpId][msg.sender], "claim: already claimed"); bytes32 node = keccak256(abi.encodePacked(msg.sender, amount)); require(MerkleProof.verify(merkleProof, mp.merkleRoot, node),"claim: Invalid proof."); claimed[mpId][msg.sender] = true; _mint(msg.sender, mpId, amount, ""); emit Claimed(mpId, msg.sender, amount); Address.sendValue(_treasury, msg.value); } function uri(uint256 _id) public view override returns (string memory) { require(totalSupply(_id) > 0, "URI: nonexistent token"); return string(abi.encodePacked(super.uri(_id), mintPasses[_id].uriSuffix)); } function royaltyInfo(uint256 tokenId,uint256 salePrice) public override view returns ( address receiver, uint256 royaltyAmount ) { return (_treasury, (salePrice * royaltyFee) / 10000); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC1155) returns (bool) { return super.supportsInterface(interfaceId); } function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual override(ERC1155, ERC1155Supply) { super._mint(account, id, amount, data); } function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override(ERC1155, ERC1155Supply) { super._mintBatch(to, ids, amounts, data); } function _burn( address account, uint256 id, uint256 amount ) internal virtual override(ERC1155, ERC1155Supply) { super._burn(account, id, amount); } function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual override(ERC1155, ERC1155Supply) { super._burnBatch(account, ids, amounts); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override(ERC1155) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
// 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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates weither any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_mint}. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual override { super._mint(account, id, amount, data); _totalSupply[id] += amount; } /** * @dev See {ERC1155-_mintBatch}. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._mintBatch(to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } /** * @dev See {ERC1155-_burn}. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual override { super._burn(account, id, amount); _totalSupply[id] -= amount; } /** * @dev See {ERC1155-_burnBatch}. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual override { super._burnBatch(account, ids, amounts); for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC1155.sol"; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; abstract contract ERC2981 is IERC2981, ERC165 { /* % * 10000 example : 5% -> 0.05 * 10000 */ uint256 internal royaltyFee; function setRoyalteFee(uint256 fee) public virtual; function royaltyInfo(uint256 tokenId,uint256 salePrice) public virtual override(IERC2981) view returns ( address receiver, uint256 royaltyAmount ); function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract OSContractURI { string internal _contractURI; function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string calldata uri) virtual public { _contractURI = uri; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IQuantumMintPass { function burnFromRedeem(address user, uint256 mpId, uint256 amount) external; }
// 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 Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/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.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.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; /** * @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 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 "../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 "../../utils/introspection/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; import "../../utils/introspection/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 "../utils/introspection/IERC165.sol";
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address payable","name":"treasury","type":"address"}],"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":false,"internalType":"uint256","name":"mpId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","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":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uriSuffix","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"}],"name":"addMintPass","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"mpId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFromRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mpId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mpId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uriSuffix","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"}],"name":"editMintPass","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPasses","outputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uriSuffix","type":"string"},{"internalType":"address","name":"redeemableContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"baseURI","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":"fee","type":"uint256"}],"name":"setRoyalteFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005a9c38038062005a9c833981810160405281019062000037919062000372565b81620000586200004c6200014f60201b60201c565b6200015760201b60201c565b62000069816200021d60201b60201c565b506040518060400160405280601081526020017f5175616e74756d204d696e74506173730000000000000000000000000000000081525060079080519060200190620000b792919062000239565b506040518060400160405280600581526020017f5150415353000000000000000000000000000000000000000000000000000000815250600890805190602001906200010592919062000239565b5080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200054b565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600590805190602001906200023592919062000239565b5050565b82805462000247906200049d565b90600052602060002090601f0160209004810192826200026b5760008555620002b7565b82601f106200028657805160ff1916838001178555620002b7565b82800160010185558215620002b7579182015b82811115620002b657825182559160200191906001019062000299565b5b509050620002c69190620002ca565b5090565b5b80821115620002e5576000816000905550600101620002cb565b5090565b600062000300620002fa8462000400565b620003cc565b9050828152602081018484840111156200031957600080fd5b6200032684828562000467565b509392505050565b6000815190506200033f8162000531565b92915050565b600082601f8301126200035757600080fd5b815162000369848260208601620002e9565b91505092915050565b600080604083850312156200038657600080fd5b600083015167ffffffffffffffff811115620003a157600080fd5b620003af8582860162000345565b9250506020620003c2858286016200032e565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620003f657620003f562000502565b5b8060405250919050565b600067ffffffffffffffff8211156200041e576200041d62000502565b5b601f19601f8301169050602081019050919050565b6000620004408262000447565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620004875780820151818401526020810190506200046a565b8381111562000497576000848401525b50505050565b60006002820490506001821680620004b657607f821691505b60208210811415620004cd57620004cc620004d3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200053c8162000433565b81146200054857600080fd5b50565b615541806200055b6000396000f3fe6080604052600436106101b65760003560e01c8063715018a6116100ec578063bd85b0391161008a578063e985e9c511610064578063e985e9c514610634578063f242432a14610671578063f2fde38b1461069a578063f5298aca146106c3576101b6565b8063bd85b039146105a3578063c34f4adc146105e0578063e8a3d48514610609576101b6565b806395d89b41116100c657806395d89b41146104f3578063a22cb4651461051e578063ae0b51df14610547578063af95f9fb14610563576101b6565b8063715018a6146104885780638da5cb5b1461049f578063938e3d7b146104ca576101b6565b80632eb2c2d6116101595780634f558e79116101335780634f558e79146103d057806351f5fefd1461040d57806355f804b3146104365780636b20c4541461045f576101b6565b80632eb2c2d6146103415780633aeca2101461036a5780634e1273f414610393576101b6565b80630b8548a4116101955780630b8548a4146102605780630e89341c14610289578063120aa877146102c65780632a55205a14610303576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806306fdde0314610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613b09565b6106ec565b6040516101ef9190614eaa565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613c7b565b6107b6565b60405161022c9190614b41565b60405180910390f35b34801561024157600080fd5b5061024a6107c8565b6040516102579190614ba8565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613d53565b610856565b005b34801561029557600080fd5b506102b060048036038101906102ab9190613d53565b6108dc565b6040516102bd9190614ba8565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613d7c565b61096f565b6040516102fa9190614b41565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613e47565b61099e565b604051610338929190614abf565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613900565b6109ea565b005b34801561037657600080fd5b50610391600480360381019061038c9190613b45565b610a8b565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613b94565b610b3f565b6040516103c79190614ae8565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613d53565b610cf0565b6040516104049190614b41565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613c00565b610d04565b005b34801561044257600080fd5b5061045d60048036038101906104589190613d12565b610e61565b005b34801561046b57600080fd5b5061048660048036038101906104819190613a4e565b610ee9565b005b34801561049457600080fd5b5061049d610f86565b005b3480156104ab57600080fd5b506104b461100e565b6040516104c191906149e2565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec9190613ccd565b611038565b005b3480156104ff57600080fd5b506105086110c2565b6040516105159190614ba8565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190613acd565b611150565b005b610561600480360381019061055c9190613e83565b6112d1565b005b34801561056f57600080fd5b5061058a60048036038101906105859190613d53565b6116ef565b60405161059a9493929190614b5c565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613d53565b6117c7565b6040516105d79190614eaa565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190613db8565b6117e4565b005b34801561061557600080fd5b5061061e61192c565b60405161062b9190614ba8565b60405180910390f35b34801561064057600080fd5b5061065b600480360381019061065691906138c4565b6119be565b6040516106689190614b41565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906139bf565b611a52565b005b3480156106a657600080fd5b506106c160048036038101906106bc919061389b565b611af3565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190613b45565b611beb565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614c0a565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006107c182611c88565b9050919050565b600780546107d590615248565b80601f016020809104026020016040519081016040528092919081815260200182805461080190615248565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b505050505081565b61085e611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661087c61100e565b73ffffffffffffffffffffffffffffffffffffffff16146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990614dca565b60405180910390fd5b8060008190555050565b606060006108e9836117c7565b11610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090614dea565b60405180910390fd5b61093282611d72565b600b60008481526020019081526020016000206002016040516020016109599291906149a9565b6040516020818303038152906040529050919050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600054856109d591906150fa565b6109df91906150c9565b915091509250929050565b6109f2611d6a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a385750610a3785610a32611d6a565b6119be565b5b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90614d6a565b60405180910390fd5b610a848585858585611e06565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b600084815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690614e2a565b60405180910390fd5b610b3a838383612169565b505050565b60608151835114610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614e4a565b60405180910390fd5b6000835167ffffffffffffffff811115610bc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bf65781602001602082028036833780820191505090505b50905060005b8451811015610ce557610c8f858281518110610c41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106ec565b828281518110610cc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610cde9061527a565b9050610bfc565b508091505092915050565b600080610cfc836117c7565b119050919050565b610d0c611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610d2a61100e565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614dca565b60405180910390fd5b60405180608001604052808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815250600b600060096000815480929190610dce9061527a565b91905055815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610e10929190613464565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b610e69611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610e8761100e565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614dca565b60405180910390fd5b610ee681612179565b50565b610ef1611d6a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f375750610f3683610f31611d6a565b6119be565b5b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614caa565b60405180910390fd5b610f81838383612193565b505050565b610f8e611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610fac61100e565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614dca565b60405180910390fd5b61100c60006121a3565b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611040611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661105e61100e565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614dca565b60405180910390fd5b6110be8282612269565b5050565b600880546110cf90615248565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb90615248565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff1661116f611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614156111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614e0a565b60405180910390fd5b80600460006111d3611d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611280611d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c59190614b41565b60405180910390a35050565b6000600b6000868152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201805461131590615248565b80601f016020809104026020016040519081016040528092919081815260200182805461134190615248565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508381602001516113ff91906150fa565b3414611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790614c6a565b60405180910390fd5b6000816000015150602060ff161161148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490614c2a565b60405180910390fd5b600c600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290614d2a565b60405180910390fd5b60003385604051602001611540929190614951565b6040516020818303038152906040528051906020012090506115a8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083600001518361227f565b6115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614cca565b60405180910390fd5b6001600c600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061166b3387876040518060200160405280600081525061235b565b3373ffffffffffffffffffffffffffffffffffffffff167f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02687876040516116b3929190614ec5565b60405180910390a26116e7600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163461236d565b505050505050565b600b60205280600052604060002060009150905080600001549080600101549080600201805461171e90615248565b80601f016020809104026020016040519081016040528092919081815260200182805461174a90615248565b80156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b600060066000838152602001908152602001600020549050919050565b6117ec611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661180a61100e565b73ffffffffffffffffffffffffffffffffffffffff1614611860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185790614dca565b60405180910390fd5b60405180608001604052808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815250600b6000878152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906118da929190613464565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b60606001805461193b90615248565b80601f016020809104026020016040519081016040528092919081815260200182805461196790615248565b80156119b45780601f10611989576101008083540402835291602001916119b4565b820191906000526020600020905b81548152906001019060200180831161199757829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5a611d6a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611aa05750611a9f85611a9a611d6a565b6119be565b5b611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614caa565b60405180910390fd5b611aec8585858585612461565b5050505050565b611afb611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611b1961100e565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614dca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614c4a565b60405180910390fd5b611be8816121a3565b50565b611bf3611d6a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c395750611c3883611c33611d6a565b6119be565b5b611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614caa565b60405180910390fd5b611c83838383612169565b505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d635750611d62826126e6565b5b9050919050565b600033905090565b606060058054611d8190615248565b80601f0160208091040260200160405190810160405280929190818152602001828054611dad90615248565b8015611dfa5780601f10611dcf57610100808354040283529160200191611dfa565b820191906000526020600020905b815481529060010190602001808311611ddd57829003601f168201915b50505050509050919050565b8151835114611e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4190614e6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb190614d4a565b60405180910390fd5b6000611ec4611d6a565b9050611ed4818787878787612760565b60005b84518110156120d4576000858281518110611f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611f60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990614daa565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b99190615073565b92505081905550505050806120cd9061527a565b9050611ed7565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161214b929190614b0a565b60405180910390a4612161818787878787612776565b505050505050565b612174838383612946565b505050565b806005908051906020019061218f929190613464565b5050565b61219e838383612980565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b81816001919061227a9291906134ea565b505050565b60008082905060005b855181101561234d5760008682815181106122cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161230d5782816040516020016122f092919061497d565b604051602081830303815290604052805190602001209250612339565b808360405160200161232092919061497d565b6040516020818303038152906040528051906020012092505b5080806123459061527a565b915050612288565b508381149150509392505050565b61236784848484612a58565b50505050565b804710156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614d0a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123d6906149cd565b60006040518083038185875af1925050503d8060008114612413576040519150601f19603f3d011682016040523d82523d6000602084013e612418565b606091505b505090508061245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614cea565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c890614d4a565b60405180910390fd5b60006124db611d6a565b90506124fb8187876124ec88612a94565b6124f588612a94565b87612760565b60006003600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258a90614daa565b60405180910390fd5b8381036003600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836003600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264a9190615073565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516126c7929190614ec5565b60405180910390a46126dd828888888888612b5a565b50505050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612759575061275882612d2a565b5b9050919050565b61276e868686868686612d94565b505050505050565b6127958473ffffffffffffffffffffffffffffffffffffffff16612d9c565b1561293e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016127db9594939291906149fd565b602060405180830381600087803b1580156127f557600080fd5b505af192505050801561282657506040513d601f19601f820116820180604052508101906128239190613ca4565b60015b6128b5576128326153e2565b8061283d575061287a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128719190614ba8565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ac90614bca565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461293c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293390614bea565b60405180910390fd5b505b505050505050565b612951838383612daf565b806006600084815260200190815260200160002060008282546129749190615154565b92505081905550505050565b61298b838383612fce565b60005b8251811015612a52578181815181106129d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160066000858481518110612a15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612a3a9190615154565b9250508190555080612a4b9061527a565b905061298e565b50505050565b612a64848484846132cd565b81600660008581526020019081526020016000206000828254612a879190615073565b9250508190555050505050565b60606000600167ffffffffffffffff811115612ad9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612b075781602001602082028036833780820191505090505b5090508281600081518110612b45577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612b798473ffffffffffffffffffffffffffffffffffffffff16612d9c565b15612d22578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612bbf959493929190614a65565b602060405180830381600087803b158015612bd957600080fd5b505af1925050508015612c0a57506040513d601f19601f82011682018060405250810190612c079190613ca4565b60015b612c9957612c166153e2565b80612c215750612c5e565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c559190614ba8565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090614bca565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790614bea565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1690614d8a565b60405180910390fd5b6000612e29611d6a565b9050612e5981856000612e3b87612a94565b612e4487612a94565b60405180602001604052806000815250612760565b60006003600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890614c8a565b60405180910390fd5b8281036003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612fbf929190614ec5565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614d8a565b60405180910390fd5b8051825114613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990614e6a565b60405180910390fd5b600061308c611d6a565b90506130ac81856000868660405180602001604052806000815250612760565b60005b83518110156132475760008482815181106130f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110613138577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006003600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d190614c8a565b60405180910390fd5b8181036003600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061323f9061527a565b9150506130af565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516132bf929190614b0a565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614e8a565b60405180910390fd5b6000613347611d6a565b90506133688160008761335988612a94565b61336288612a94565b87612760565b826003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133c89190615073565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613446929190614ec5565b60405180910390a461345d81600087878787612b5a565b5050505050565b82805461347090615248565b90600052602060002090601f01602090048101928261349257600085556134d9565b82601f106134ab57805160ff19168380011785556134d9565b828001600101855582156134d9579182015b828111156134d85782518255916020019190600101906134bd565b5b5090506134e69190613570565b5090565b8280546134f690615248565b90600052602060002090601f016020900481019282613518576000855561355f565b82601f1061353157803560ff191683800117855561355f565b8280016001018555821561355f579182015b8281111561355e578235825591602001919060010190613543565b5b50905061356c9190613570565b5090565b5b80821115613589576000816000905550600101613571565b5090565b60006135a061359b84614f1f565b614eee565b905080838252602082019050828560208602820111156135bf57600080fd5b60005b858110156135ef57816135d588826136e1565b8452602084019350602083019250506001810190506135c2565b5050509392505050565b600061360c61360784614f4b565b614eee565b9050808382526020820190508285602086028201111561362b57600080fd5b60005b8581101561365b57816136418882613886565b84526020840193506020830192505060018101905061362e565b5050509392505050565b600061367861367384614f77565b614eee565b90508281526020810184848401111561369057600080fd5b61369b848285615206565b509392505050565b60006136b66136b184614fa7565b614eee565b9050828152602081018484840111156136ce57600080fd5b6136d9848285615206565b509392505050565b6000813590506136f081615498565b92915050565b600082601f83011261370757600080fd5b813561371784826020860161358d565b91505092915050565b60008083601f84011261373257600080fd5b8235905067ffffffffffffffff81111561374b57600080fd5b60208301915083602082028301111561376357600080fd5b9250929050565b600082601f83011261377b57600080fd5b813561378b8482602086016135f9565b91505092915050565b6000813590506137a3816154af565b92915050565b6000813590506137b8816154c6565b92915050565b6000813590506137cd816154dd565b92915050565b6000815190506137e2816154dd565b92915050565b600082601f8301126137f957600080fd5b8135613809848260208601613665565b91505092915050565b60008083601f84011261382457600080fd5b8235905067ffffffffffffffff81111561383d57600080fd5b60208301915083600182028301111561385557600080fd5b9250929050565b600082601f83011261386d57600080fd5b813561387d8482602086016136a3565b91505092915050565b600081359050613895816154f4565b92915050565b6000602082840312156138ad57600080fd5b60006138bb848285016136e1565b91505092915050565b600080604083850312156138d757600080fd5b60006138e5858286016136e1565b92505060206138f6858286016136e1565b9150509250929050565b600080600080600060a0868803121561391857600080fd5b6000613926888289016136e1565b9550506020613937888289016136e1565b945050604086013567ffffffffffffffff81111561395457600080fd5b6139608882890161376a565b935050606086013567ffffffffffffffff81111561397d57600080fd5b6139898882890161376a565b925050608086013567ffffffffffffffff8111156139a657600080fd5b6139b2888289016137e8565b9150509295509295909350565b600080600080600060a086880312156139d757600080fd5b60006139e5888289016136e1565b95505060206139f6888289016136e1565b9450506040613a0788828901613886565b9350506060613a1888828901613886565b925050608086013567ffffffffffffffff811115613a3557600080fd5b613a41888289016137e8565b9150509295509295909350565b600080600060608486031215613a6357600080fd5b6000613a71868287016136e1565b935050602084013567ffffffffffffffff811115613a8e57600080fd5b613a9a8682870161376a565b925050604084013567ffffffffffffffff811115613ab757600080fd5b613ac38682870161376a565b9150509250925092565b60008060408385031215613ae057600080fd5b6000613aee858286016136e1565b9250506020613aff85828601613794565b9150509250929050565b60008060408385031215613b1c57600080fd5b6000613b2a858286016136e1565b9250506020613b3b85828601613886565b9150509250929050565b600080600060608486031215613b5a57600080fd5b6000613b68868287016136e1565b9350506020613b7986828701613886565b9250506040613b8a86828701613886565b9150509250925092565b60008060408385031215613ba757600080fd5b600083013567ffffffffffffffff811115613bc157600080fd5b613bcd858286016136f6565b925050602083013567ffffffffffffffff811115613bea57600080fd5b613bf68582860161376a565b9150509250929050565b60008060008060808587031215613c1657600080fd5b6000613c24878288016137a9565b9450506020613c3587828801613886565b935050604085013567ffffffffffffffff811115613c5257600080fd5b613c5e8782880161385c565b9250506060613c6f878288016136e1565b91505092959194509250565b600060208284031215613c8d57600080fd5b6000613c9b848285016137be565b91505092915050565b600060208284031215613cb657600080fd5b6000613cc4848285016137d3565b91505092915050565b60008060208385031215613ce057600080fd5b600083013567ffffffffffffffff811115613cfa57600080fd5b613d0685828601613812565b92509250509250929050565b600060208284031215613d2457600080fd5b600082013567ffffffffffffffff811115613d3e57600080fd5b613d4a8482850161385c565b91505092915050565b600060208284031215613d6557600080fd5b6000613d7384828501613886565b91505092915050565b60008060408385031215613d8f57600080fd5b6000613d9d85828601613886565b9250506020613dae858286016136e1565b9150509250929050565b600080600080600060a08688031215613dd057600080fd5b6000613dde88828901613886565b9550506020613def888289016137a9565b9450506040613e0088828901613886565b935050606086013567ffffffffffffffff811115613e1d57600080fd5b613e298882890161385c565b9250506080613e3a888289016136e1565b9150509295509295909350565b60008060408385031215613e5a57600080fd5b6000613e6885828601613886565b9250506020613e7985828601613886565b9150509250929050565b60008060008060608587031215613e9957600080fd5b6000613ea787828801613886565b9450506020613eb887828801613886565b935050604085013567ffffffffffffffff811115613ed557600080fd5b613ee187828801613720565b925092505092959194509250565b6000613efb838361491c565b60208301905092915050565b613f1081615188565b82525050565b613f27613f2282615188565b6152c3565b82525050565b6000613f3882614ffc565b613f42818561502a565b9350613f4d83614fd7565b8060005b83811015613f7e578151613f658882613eef565b9750613f708361501d565b925050600181019050613f51565b5085935050505092915050565b613f948161519a565b82525050565b613fa3816151a6565b82525050565b613fba613fb5826151a6565b6152d5565b82525050565b6000613fcb82615007565b613fd5818561503b565b9350613fe5818560208601615215565b613fee816153b7565b840191505092915050565b600061400482615012565b61400e8185615057565b935061401e818560208601615215565b614027816153b7565b840191505092915050565b600061403d82615012565b6140478185615068565b9350614057818560208601615215565b80840191505092915050565b6000815461407081615248565b61407a8186615068565b9450600182166000811461409557600181146140a6576140d9565b60ff198316865281860193506140d9565b6140af85614fe7565b60005b838110156140d1578154818901526001820191506020810190506140b2565b838801955050505b50505092915050565b60006140ef603483615057565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614155602883615057565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141bb602b83615057565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614221601f83615057565b91507f636c61696d3a206d696e74207061737320646f6573206e6f74206578697374006000830152602082019050919050565b6000614261602683615057565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c7601883615057565b91507f636c61696d3a20696e76616c6964206d73672e76616c756500000000000000006000830152602082019050919050565b6000614307602483615057565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436d602983615057565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d3601583615057565b91507f636c61696d3a20496e76616c69642070726f6f662e00000000000000000000006000830152602082019050919050565b6000614413603a83615057565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000614479601d83615057565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006144b9601683615057565b91507f636c61696d3a20616c726561647920636c61696d6564000000000000000000006000830152602082019050919050565b60006144f9602583615057565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061455f603283615057565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006145c5602383615057565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061462b602a83615057565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614691602083615057565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146d1601683615057565b91507f5552493a206e6f6e6578697374656e7420746f6b656e000000000000000000006000830152602082019050919050565b600061471160008361504c565b9150600082019050919050565b600061472b602983615057565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614791603583615057565b91507f6275726e46726f6d52656465656d3a204f6e6c7920616c6c6f7765642066726f60008301527f6d2072656465656d61626c6520636f6e747261637400000000000000000000006020830152604082019050919050565b60006147f7602983615057565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b600061485d602883615057565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148c3602183615057565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614925816151fc565b82525050565b614934816151fc565b82525050565b61494b614946826151fc565b6152f1565b82525050565b600061495d8285613f16565b60148201915061496d828461493a565b6020820191508190509392505050565b60006149898285613fa9565b6020820191506149998284613fa9565b6020820191508190509392505050565b60006149b58285614032565b91506149c18284614063565b91508190509392505050565b60006149d882614704565b9150819050919050565b60006020820190506149f76000830184613f07565b92915050565b600060a082019050614a126000830188613f07565b614a1f6020830187613f07565b8181036040830152614a318186613f2d565b90508181036060830152614a458185613f2d565b90508181036080830152614a598184613fc0565b90509695505050505050565b600060a082019050614a7a6000830188613f07565b614a876020830187613f07565b614a94604083018661492b565b614aa1606083018561492b565b8181036080830152614ab38184613fc0565b90509695505050505050565b6000604082019050614ad46000830185613f07565b614ae1602083018461492b565b9392505050565b60006020820190508181036000830152614b028184613f2d565b905092915050565b60006040820190508181036000830152614b248185613f2d565b90508181036020830152614b388184613f2d565b90509392505050565b6000602082019050614b566000830184613f8b565b92915050565b6000608082019050614b716000830187613f9a565b614b7e602083018661492b565b8181036040830152614b908185613ff9565b9050614b9f6060830184613f07565b95945050505050565b60006020820190508181036000830152614bc28184613ff9565b905092915050565b60006020820190508181036000830152614be3816140e2565b9050919050565b60006020820190508181036000830152614c0381614148565b9050919050565b60006020820190508181036000830152614c23816141ae565b9050919050565b60006020820190508181036000830152614c4381614214565b9050919050565b60006020820190508181036000830152614c6381614254565b9050919050565b60006020820190508181036000830152614c83816142ba565b9050919050565b60006020820190508181036000830152614ca3816142fa565b9050919050565b60006020820190508181036000830152614cc381614360565b9050919050565b60006020820190508181036000830152614ce3816143c6565b9050919050565b60006020820190508181036000830152614d0381614406565b9050919050565b60006020820190508181036000830152614d238161446c565b9050919050565b60006020820190508181036000830152614d43816144ac565b9050919050565b60006020820190508181036000830152614d63816144ec565b9050919050565b60006020820190508181036000830152614d8381614552565b9050919050565b60006020820190508181036000830152614da3816145b8565b9050919050565b60006020820190508181036000830152614dc38161461e565b9050919050565b60006020820190508181036000830152614de381614684565b9050919050565b60006020820190508181036000830152614e03816146c4565b9050919050565b60006020820190508181036000830152614e238161471e565b9050919050565b60006020820190508181036000830152614e4381614784565b9050919050565b60006020820190508181036000830152614e63816147ea565b9050919050565b60006020820190508181036000830152614e8381614850565b9050919050565b60006020820190508181036000830152614ea3816148b6565b9050919050565b6000602082019050614ebf600083018461492b565b92915050565b6000604082019050614eda600083018561492b565b614ee7602083018461492b565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614f1557614f14615388565b5b8060405250919050565b600067ffffffffffffffff821115614f3a57614f39615388565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f6657614f65615388565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f9257614f91615388565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fc257614fc1615388565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061507e826151fc565b9150615089836151fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150be576150bd6152fb565b5b828201905092915050565b60006150d4826151fc565b91506150df836151fc565b9250826150ef576150ee61532a565b5b828204905092915050565b6000615105826151fc565b9150615110836151fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615149576151486152fb565b5b828202905092915050565b600061515f826151fc565b915061516a836151fc565b92508282101561517d5761517c6152fb565b5b828203905092915050565b6000615193826151dc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615233578082015181840152602081019050615218565b83811115615242576000848401525b50505050565b6000600282049050600182168061526057607f821691505b6020821081141561527457615273615359565b5b50919050565b6000615285826151fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152b8576152b76152fb565b5b600182019050919050565b60006152ce826152df565b9050919050565b6000819050919050565b60006152ea826153c8565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156153f257615495565b60046000803e6154036000516153d5565b6308c379a081146154145750615495565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561544057505050615495565b808201805167ffffffffffffffff81111561545f575050505050615495565b8060208301013d850181111561547a57505050505050615495565b615483826153b7565b60208401016040528296505050505050505b90565b6154a181615188565b81146154ac57600080fd5b50565b6154b88161519a565b81146154c357600080fd5b50565b6154cf816151a6565b81146154da57600080fd5b50565b6154e6816151b0565b81146154f157600080fd5b50565b6154fd816151fc565b811461550857600080fd5b5056fea26469706673582212201e4bb45efbe5ddc9701786617b42f4e52de52c97beb53694048b260ef1c0025b64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe9000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e7175616e74756d2e6172742f76312f6d657461646174612f6d696e74706173732f00000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101b65760003560e01c8063715018a6116100ec578063bd85b0391161008a578063e985e9c511610064578063e985e9c514610634578063f242432a14610671578063f2fde38b1461069a578063f5298aca146106c3576101b6565b8063bd85b039146105a3578063c34f4adc146105e0578063e8a3d48514610609576101b6565b806395d89b41116100c657806395d89b41146104f3578063a22cb4651461051e578063ae0b51df14610547578063af95f9fb14610563576101b6565b8063715018a6146104885780638da5cb5b1461049f578063938e3d7b146104ca576101b6565b80632eb2c2d6116101595780634f558e79116101335780634f558e79146103d057806351f5fefd1461040d57806355f804b3146104365780636b20c4541461045f576101b6565b80632eb2c2d6146103415780633aeca2101461036a5780634e1273f414610393576101b6565b80630b8548a4116101955780630b8548a4146102605780630e89341c14610289578063120aa877146102c65780632a55205a14610303576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806306fdde0314610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613b09565b6106ec565b6040516101ef9190614eaa565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613c7b565b6107b6565b60405161022c9190614b41565b60405180910390f35b34801561024157600080fd5b5061024a6107c8565b6040516102579190614ba8565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613d53565b610856565b005b34801561029557600080fd5b506102b060048036038101906102ab9190613d53565b6108dc565b6040516102bd9190614ba8565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613d7c565b61096f565b6040516102fa9190614b41565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613e47565b61099e565b604051610338929190614abf565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613900565b6109ea565b005b34801561037657600080fd5b50610391600480360381019061038c9190613b45565b610a8b565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613b94565b610b3f565b6040516103c79190614ae8565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613d53565b610cf0565b6040516104049190614b41565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190613c00565b610d04565b005b34801561044257600080fd5b5061045d60048036038101906104589190613d12565b610e61565b005b34801561046b57600080fd5b5061048660048036038101906104819190613a4e565b610ee9565b005b34801561049457600080fd5b5061049d610f86565b005b3480156104ab57600080fd5b506104b461100e565b6040516104c191906149e2565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec9190613ccd565b611038565b005b3480156104ff57600080fd5b506105086110c2565b6040516105159190614ba8565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190613acd565b611150565b005b610561600480360381019061055c9190613e83565b6112d1565b005b34801561056f57600080fd5b5061058a60048036038101906105859190613d53565b6116ef565b60405161059a9493929190614b5c565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613d53565b6117c7565b6040516105d79190614eaa565b60405180910390f35b3480156105ec57600080fd5b5061060760048036038101906106029190613db8565b6117e4565b005b34801561061557600080fd5b5061061e61192c565b60405161062b9190614ba8565b60405180910390f35b34801561064057600080fd5b5061065b600480360381019061065691906138c4565b6119be565b6040516106689190614b41565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906139bf565b611a52565b005b3480156106a657600080fd5b506106c160048036038101906106bc919061389b565b611af3565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190613b45565b611beb565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614c0a565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006107c182611c88565b9050919050565b600780546107d590615248565b80601f016020809104026020016040519081016040528092919081815260200182805461080190615248565b801561084e5780601f106108235761010080835404028352916020019161084e565b820191906000526020600020905b81548152906001019060200180831161083157829003601f168201915b505050505081565b61085e611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661087c61100e565b73ffffffffffffffffffffffffffffffffffffffff16146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c990614dca565b60405180910390fd5b8060008190555050565b606060006108e9836117c7565b11610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090614dea565b60405180910390fd5b61093282611d72565b600b60008481526020019081526020016000206002016040516020016109599291906149a9565b6040516020818303038152906040529050919050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600054856109d591906150fa565b6109df91906150c9565b915091509250929050565b6109f2611d6a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a385750610a3785610a32611d6a565b6119be565b5b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90614d6a565b60405180910390fd5b610a848585858585611e06565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600b600084815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690614e2a565b60405180910390fd5b610b3a838383612169565b505050565b60608151835114610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614e4a565b60405180910390fd5b6000835167ffffffffffffffff811115610bc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bf65781602001602082028036833780820191505090505b50905060005b8451811015610ce557610c8f858281518110610c41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106ec565b828281518110610cc8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610cde9061527a565b9050610bfc565b508091505092915050565b600080610cfc836117c7565b119050919050565b610d0c611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610d2a61100e565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614dca565b60405180910390fd5b60405180608001604052808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815250600b600060096000815480929190610dce9061527a565b91905055815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610e10929190613464565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b610e69611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610e8761100e565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614dca565b60405180910390fd5b610ee681612179565b50565b610ef1611d6a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f375750610f3683610f31611d6a565b6119be565b5b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90614caa565b60405180910390fd5b610f81838383612193565b505050565b610f8e611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610fac61100e565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614dca565b60405180910390fd5b61100c60006121a3565b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611040611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661105e61100e565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab90614dca565b60405180910390fd5b6110be8282612269565b5050565b600880546110cf90615248565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb90615248565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b505050505081565b8173ffffffffffffffffffffffffffffffffffffffff1661116f611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614156111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614e0a565b60405180910390fd5b80600460006111d3611d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611280611d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c59190614b41565b60405180910390a35050565b6000600b6000868152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201805461131590615248565b80601f016020809104026020016040519081016040528092919081815260200182805461134190615248565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508381602001516113ff91906150fa565b3414611440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143790614c6a565b60405180910390fd5b6000816000015150602060ff161161148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490614c2a565b60405180910390fd5b600c600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290614d2a565b60405180910390fd5b60003385604051602001611540929190614951565b6040516020818303038152906040528051906020012090506115a8848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083600001518361227f565b6115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614cca565b60405180910390fd5b6001600c600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061166b3387876040518060200160405280600081525061235b565b3373ffffffffffffffffffffffffffffffffffffffff167f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02687876040516116b3929190614ec5565b60405180910390a26116e7600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163461236d565b505050505050565b600b60205280600052604060002060009150905080600001549080600101549080600201805461171e90615248565b80601f016020809104026020016040519081016040528092919081815260200182805461174a90615248565b80156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b600060066000838152602001908152602001600020549050919050565b6117ec611d6a565b73ffffffffffffffffffffffffffffffffffffffff1661180a61100e565b73ffffffffffffffffffffffffffffffffffffffff1614611860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185790614dca565b60405180910390fd5b60405180608001604052808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815250600b6000878152602001908152602001600020600082015181600001556020820151816001015560408201518160020190805190602001906118da929190613464565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b60606001805461193b90615248565b80601f016020809104026020016040519081016040528092919081815260200182805461196790615248565b80156119b45780601f10611989576101008083540402835291602001916119b4565b820191906000526020600020905b81548152906001019060200180831161199757829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5a611d6a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611aa05750611a9f85611a9a611d6a565b6119be565b5b611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614caa565b60405180910390fd5b611aec8585858585612461565b5050505050565b611afb611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611b1961100e565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614dca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614c4a565b60405180910390fd5b611be8816121a3565b50565b611bf3611d6a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c395750611c3883611c33611d6a565b6119be565b5b611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90614caa565b60405180910390fd5b611c83838383612169565b505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d635750611d62826126e6565b5b9050919050565b600033905090565b606060058054611d8190615248565b80601f0160208091040260200160405190810160405280929190818152602001828054611dad90615248565b8015611dfa5780601f10611dcf57610100808354040283529160200191611dfa565b820191906000526020600020905b815481529060010190602001808311611ddd57829003601f168201915b50505050509050919050565b8151835114611e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4190614e6a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb190614d4a565b60405180910390fd5b6000611ec4611d6a565b9050611ed4818787878787612760565b60005b84518110156120d4576000858281518110611f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611f60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990614daa565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b99190615073565b92505081905550505050806120cd9061527a565b9050611ed7565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161214b929190614b0a565b60405180910390a4612161818787878787612776565b505050505050565b612174838383612946565b505050565b806005908051906020019061218f929190613464565b5050565b61219e838383612980565b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b81816001919061227a9291906134ea565b505050565b60008082905060005b855181101561234d5760008682815181106122cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161230d5782816040516020016122f092919061497d565b604051602081830303815290604052805190602001209250612339565b808360405160200161232092919061497d565b6040516020818303038152906040528051906020012092505b5080806123459061527a565b915050612288565b508381149150509392505050565b61236784848484612a58565b50505050565b804710156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614d0a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123d6906149cd565b60006040518083038185875af1925050503d8060008114612413576040519150601f19603f3d011682016040523d82523d6000602084013e612418565b606091505b505090508061245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614cea565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c890614d4a565b60405180910390fd5b60006124db611d6a565b90506124fb8187876124ec88612a94565b6124f588612a94565b87612760565b60006003600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258a90614daa565b60405180910390fd5b8381036003600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836003600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264a9190615073565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516126c7929190614ec5565b60405180910390a46126dd828888888888612b5a565b50505050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612759575061275882612d2a565b5b9050919050565b61276e868686868686612d94565b505050505050565b6127958473ffffffffffffffffffffffffffffffffffffffff16612d9c565b1561293e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016127db9594939291906149fd565b602060405180830381600087803b1580156127f557600080fd5b505af192505050801561282657506040513d601f19601f820116820180604052508101906128239190613ca4565b60015b6128b5576128326153e2565b8061283d575061287a565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128719190614ba8565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ac90614bca565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461293c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293390614bea565b60405180910390fd5b505b505050505050565b612951838383612daf565b806006600084815260200190815260200160002060008282546129749190615154565b92505081905550505050565b61298b838383612fce565b60005b8251811015612a52578181815181106129d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160066000858481518110612a15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254612a3a9190615154565b9250508190555080612a4b9061527a565b905061298e565b50505050565b612a64848484846132cd565b81600660008581526020019081526020016000206000828254612a879190615073565b9250508190555050505050565b60606000600167ffffffffffffffff811115612ad9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612b075781602001602082028036833780820191505090505b5090508281600081518110612b45577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612b798473ffffffffffffffffffffffffffffffffffffffff16612d9c565b15612d22578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612bbf959493929190614a65565b602060405180830381600087803b158015612bd957600080fd5b505af1925050508015612c0a57506040513d601f19601f82011682018060405250810190612c079190613ca4565b60015b612c9957612c166153e2565b80612c215750612c5e565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c559190614ba8565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9090614bca565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790614bea565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1690614d8a565b60405180910390fd5b6000612e29611d6a565b9050612e5981856000612e3b87612a94565b612e4487612a94565b60405180602001604052806000815250612760565b60006003600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890614c8a565b60405180910390fd5b8281036003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612fbf929190614ec5565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614d8a565b60405180910390fd5b8051825114613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990614e6a565b60405180910390fd5b600061308c611d6a565b90506130ac81856000868660405180602001604052806000815250612760565b60005b83518110156132475760008482815181106130f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110613138577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006003600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d190614c8a565b60405180910390fd5b8181036003600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061323f9061527a565b9150506130af565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516132bf929190614b0a565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614e8a565b60405180910390fd5b6000613347611d6a565b90506133688160008761335988612a94565b61336288612a94565b87612760565b826003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133c89190615073565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613446929190614ec5565b60405180910390a461345d81600087878787612b5a565b5050505050565b82805461347090615248565b90600052602060002090601f01602090048101928261349257600085556134d9565b82601f106134ab57805160ff19168380011785556134d9565b828001600101855582156134d9579182015b828111156134d85782518255916020019190600101906134bd565b5b5090506134e69190613570565b5090565b8280546134f690615248565b90600052602060002090601f016020900481019282613518576000855561355f565b82601f1061353157803560ff191683800117855561355f565b8280016001018555821561355f579182015b8281111561355e578235825591602001919060010190613543565b5b50905061356c9190613570565b5090565b5b80821115613589576000816000905550600101613571565b5090565b60006135a061359b84614f1f565b614eee565b905080838252602082019050828560208602820111156135bf57600080fd5b60005b858110156135ef57816135d588826136e1565b8452602084019350602083019250506001810190506135c2565b5050509392505050565b600061360c61360784614f4b565b614eee565b9050808382526020820190508285602086028201111561362b57600080fd5b60005b8581101561365b57816136418882613886565b84526020840193506020830192505060018101905061362e565b5050509392505050565b600061367861367384614f77565b614eee565b90508281526020810184848401111561369057600080fd5b61369b848285615206565b509392505050565b60006136b66136b184614fa7565b614eee565b9050828152602081018484840111156136ce57600080fd5b6136d9848285615206565b509392505050565b6000813590506136f081615498565b92915050565b600082601f83011261370757600080fd5b813561371784826020860161358d565b91505092915050565b60008083601f84011261373257600080fd5b8235905067ffffffffffffffff81111561374b57600080fd5b60208301915083602082028301111561376357600080fd5b9250929050565b600082601f83011261377b57600080fd5b813561378b8482602086016135f9565b91505092915050565b6000813590506137a3816154af565b92915050565b6000813590506137b8816154c6565b92915050565b6000813590506137cd816154dd565b92915050565b6000815190506137e2816154dd565b92915050565b600082601f8301126137f957600080fd5b8135613809848260208601613665565b91505092915050565b60008083601f84011261382457600080fd5b8235905067ffffffffffffffff81111561383d57600080fd5b60208301915083600182028301111561385557600080fd5b9250929050565b600082601f83011261386d57600080fd5b813561387d8482602086016136a3565b91505092915050565b600081359050613895816154f4565b92915050565b6000602082840312156138ad57600080fd5b60006138bb848285016136e1565b91505092915050565b600080604083850312156138d757600080fd5b60006138e5858286016136e1565b92505060206138f6858286016136e1565b9150509250929050565b600080600080600060a0868803121561391857600080fd5b6000613926888289016136e1565b9550506020613937888289016136e1565b945050604086013567ffffffffffffffff81111561395457600080fd5b6139608882890161376a565b935050606086013567ffffffffffffffff81111561397d57600080fd5b6139898882890161376a565b925050608086013567ffffffffffffffff8111156139a657600080fd5b6139b2888289016137e8565b9150509295509295909350565b600080600080600060a086880312156139d757600080fd5b60006139e5888289016136e1565b95505060206139f6888289016136e1565b9450506040613a0788828901613886565b9350506060613a1888828901613886565b925050608086013567ffffffffffffffff811115613a3557600080fd5b613a41888289016137e8565b9150509295509295909350565b600080600060608486031215613a6357600080fd5b6000613a71868287016136e1565b935050602084013567ffffffffffffffff811115613a8e57600080fd5b613a9a8682870161376a565b925050604084013567ffffffffffffffff811115613ab757600080fd5b613ac38682870161376a565b9150509250925092565b60008060408385031215613ae057600080fd5b6000613aee858286016136e1565b9250506020613aff85828601613794565b9150509250929050565b60008060408385031215613b1c57600080fd5b6000613b2a858286016136e1565b9250506020613b3b85828601613886565b9150509250929050565b600080600060608486031215613b5a57600080fd5b6000613b68868287016136e1565b9350506020613b7986828701613886565b9250506040613b8a86828701613886565b9150509250925092565b60008060408385031215613ba757600080fd5b600083013567ffffffffffffffff811115613bc157600080fd5b613bcd858286016136f6565b925050602083013567ffffffffffffffff811115613bea57600080fd5b613bf68582860161376a565b9150509250929050565b60008060008060808587031215613c1657600080fd5b6000613c24878288016137a9565b9450506020613c3587828801613886565b935050604085013567ffffffffffffffff811115613c5257600080fd5b613c5e8782880161385c565b9250506060613c6f878288016136e1565b91505092959194509250565b600060208284031215613c8d57600080fd5b6000613c9b848285016137be565b91505092915050565b600060208284031215613cb657600080fd5b6000613cc4848285016137d3565b91505092915050565b60008060208385031215613ce057600080fd5b600083013567ffffffffffffffff811115613cfa57600080fd5b613d0685828601613812565b92509250509250929050565b600060208284031215613d2457600080fd5b600082013567ffffffffffffffff811115613d3e57600080fd5b613d4a8482850161385c565b91505092915050565b600060208284031215613d6557600080fd5b6000613d7384828501613886565b91505092915050565b60008060408385031215613d8f57600080fd5b6000613d9d85828601613886565b9250506020613dae858286016136e1565b9150509250929050565b600080600080600060a08688031215613dd057600080fd5b6000613dde88828901613886565b9550506020613def888289016137a9565b9450506040613e0088828901613886565b935050606086013567ffffffffffffffff811115613e1d57600080fd5b613e298882890161385c565b9250506080613e3a888289016136e1565b9150509295509295909350565b60008060408385031215613e5a57600080fd5b6000613e6885828601613886565b9250506020613e7985828601613886565b9150509250929050565b60008060008060608587031215613e9957600080fd5b6000613ea787828801613886565b9450506020613eb887828801613886565b935050604085013567ffffffffffffffff811115613ed557600080fd5b613ee187828801613720565b925092505092959194509250565b6000613efb838361491c565b60208301905092915050565b613f1081615188565b82525050565b613f27613f2282615188565b6152c3565b82525050565b6000613f3882614ffc565b613f42818561502a565b9350613f4d83614fd7565b8060005b83811015613f7e578151613f658882613eef565b9750613f708361501d565b925050600181019050613f51565b5085935050505092915050565b613f948161519a565b82525050565b613fa3816151a6565b82525050565b613fba613fb5826151a6565b6152d5565b82525050565b6000613fcb82615007565b613fd5818561503b565b9350613fe5818560208601615215565b613fee816153b7565b840191505092915050565b600061400482615012565b61400e8185615057565b935061401e818560208601615215565b614027816153b7565b840191505092915050565b600061403d82615012565b6140478185615068565b9350614057818560208601615215565b80840191505092915050565b6000815461407081615248565b61407a8186615068565b9450600182166000811461409557600181146140a6576140d9565b60ff198316865281860193506140d9565b6140af85614fe7565b60005b838110156140d1578154818901526001820191506020810190506140b2565b838801955050505b50505092915050565b60006140ef603483615057565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614155602883615057565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141bb602b83615057565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614221601f83615057565b91507f636c61696d3a206d696e74207061737320646f6573206e6f74206578697374006000830152602082019050919050565b6000614261602683615057565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c7601883615057565b91507f636c61696d3a20696e76616c6964206d73672e76616c756500000000000000006000830152602082019050919050565b6000614307602483615057565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436d602983615057565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d3601583615057565b91507f636c61696d3a20496e76616c69642070726f6f662e00000000000000000000006000830152602082019050919050565b6000614413603a83615057565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000614479601d83615057565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006144b9601683615057565b91507f636c61696d3a20616c726561647920636c61696d6564000000000000000000006000830152602082019050919050565b60006144f9602583615057565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061455f603283615057565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006145c5602383615057565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061462b602a83615057565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614691602083615057565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146d1601683615057565b91507f5552493a206e6f6e6578697374656e7420746f6b656e000000000000000000006000830152602082019050919050565b600061471160008361504c565b9150600082019050919050565b600061472b602983615057565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614791603583615057565b91507f6275726e46726f6d52656465656d3a204f6e6c7920616c6c6f7765642066726f60008301527f6d2072656465656d61626c6520636f6e747261637400000000000000000000006020830152604082019050919050565b60006147f7602983615057565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b600061485d602883615057565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148c3602183615057565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614925816151fc565b82525050565b614934816151fc565b82525050565b61494b614946826151fc565b6152f1565b82525050565b600061495d8285613f16565b60148201915061496d828461493a565b6020820191508190509392505050565b60006149898285613fa9565b6020820191506149998284613fa9565b6020820191508190509392505050565b60006149b58285614032565b91506149c18284614063565b91508190509392505050565b60006149d882614704565b9150819050919050565b60006020820190506149f76000830184613f07565b92915050565b600060a082019050614a126000830188613f07565b614a1f6020830187613f07565b8181036040830152614a318186613f2d565b90508181036060830152614a458185613f2d565b90508181036080830152614a598184613fc0565b90509695505050505050565b600060a082019050614a7a6000830188613f07565b614a876020830187613f07565b614a94604083018661492b565b614aa1606083018561492b565b8181036080830152614ab38184613fc0565b90509695505050505050565b6000604082019050614ad46000830185613f07565b614ae1602083018461492b565b9392505050565b60006020820190508181036000830152614b028184613f2d565b905092915050565b60006040820190508181036000830152614b248185613f2d565b90508181036020830152614b388184613f2d565b90509392505050565b6000602082019050614b566000830184613f8b565b92915050565b6000608082019050614b716000830187613f9a565b614b7e602083018661492b565b8181036040830152614b908185613ff9565b9050614b9f6060830184613f07565b95945050505050565b60006020820190508181036000830152614bc28184613ff9565b905092915050565b60006020820190508181036000830152614be3816140e2565b9050919050565b60006020820190508181036000830152614c0381614148565b9050919050565b60006020820190508181036000830152614c23816141ae565b9050919050565b60006020820190508181036000830152614c4381614214565b9050919050565b60006020820190508181036000830152614c6381614254565b9050919050565b60006020820190508181036000830152614c83816142ba565b9050919050565b60006020820190508181036000830152614ca3816142fa565b9050919050565b60006020820190508181036000830152614cc381614360565b9050919050565b60006020820190508181036000830152614ce3816143c6565b9050919050565b60006020820190508181036000830152614d0381614406565b9050919050565b60006020820190508181036000830152614d238161446c565b9050919050565b60006020820190508181036000830152614d43816144ac565b9050919050565b60006020820190508181036000830152614d63816144ec565b9050919050565b60006020820190508181036000830152614d8381614552565b9050919050565b60006020820190508181036000830152614da3816145b8565b9050919050565b60006020820190508181036000830152614dc38161461e565b9050919050565b60006020820190508181036000830152614de381614684565b9050919050565b60006020820190508181036000830152614e03816146c4565b9050919050565b60006020820190508181036000830152614e238161471e565b9050919050565b60006020820190508181036000830152614e4381614784565b9050919050565b60006020820190508181036000830152614e63816147ea565b9050919050565b60006020820190508181036000830152614e8381614850565b9050919050565b60006020820190508181036000830152614ea3816148b6565b9050919050565b6000602082019050614ebf600083018461492b565b92915050565b6000604082019050614eda600083018561492b565b614ee7602083018461492b565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614f1557614f14615388565b5b8060405250919050565b600067ffffffffffffffff821115614f3a57614f39615388565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f6657614f65615388565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f9257614f91615388565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fc257614fc1615388565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061507e826151fc565b9150615089836151fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150be576150bd6152fb565b5b828201905092915050565b60006150d4826151fc565b91506150df836151fc565b9250826150ef576150ee61532a565b5b828204905092915050565b6000615105826151fc565b9150615110836151fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615149576151486152fb565b5b828202905092915050565b600061515f826151fc565b915061516a836151fc565b92508282101561517d5761517c6152fb565b5b828203905092915050565b6000615193826151dc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615233578082015181840152602081019050615218565b83811115615242576000848401525b50505050565b6000600282049050600182168061526057607f821691505b6020821081141561527457615273615359565b5b50919050565b6000615285826151fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152b8576152b76152fb565b5b600182019050919050565b60006152ce826152df565b9050919050565b6000819050919050565b60006152ea826153c8565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156153f257615495565b60046000803e6154036000516153d5565b6308c379a081146154145750615495565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561544057505050615495565b808201805167ffffffffffffffff81111561545f575050505050615495565b8060208301013d850181111561547a57505050505050615495565b615483826153b7565b60208401016040528296505050505050505b90565b6154a181615188565b81146154ac57600080fd5b50565b6154b88161519a565b81146154c357600080fd5b50565b6154cf816151a6565b81146154da57600080fd5b50565b6154e6816151b0565b81146154f157600080fd5b50565b6154fd816151fc565b811461550857600080fd5b5056fea26469706673582212201e4bb45efbe5ddc9701786617b42f4e52de52c97beb53694048b260ef1c0025b64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe9000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e7175616e74756d2e6172742f76312f6d657461646174612f6d696e74706173732f00000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://api.quantum.art/v1/metadata/mintpass/
Arg [1] : treasury (address): 0xe0faf18f33c307Ca812B80c771ad3c9E5f043Fe9
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000e0faf18f33c307ca812b80c771ad3c9e5f043fe9
Arg [2] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [3] : 68747470733a2f2f6170692e7175616e74756d2e6172742f76312f6d65746164
Arg [4] : 6174612f6d696e74706173732f00000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ 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.