ETH Price: $3,034.84 (+2.87%)

LegionVentures (LV)
 

Overview

TokenID

2197

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Legion Ventures NFT Collection is made up of 1200 unique, randomly-generated, artworks.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LegionVentures

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 14 of 16: LegionVentures.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC1155Burnable.sol";

contract LegionVentures is ERC721, Ownable {
    using Address for address;
    using Strings for uint256;
    
    // metadata
    bool public metadataLocked = false;
    string public baseURI = "";

    // supply and phases
    mapping (uint256 => uint256) public mintIndex;
    mapping (uint256 => uint256) public availSupply;

    bool public presaleEnded = false;
    bool public mintingEndedForever = false;
    bool public mintPaused = true;
    
    // price
    mapping (uint256 => uint256) public price_presale;
    mapping (uint256 => uint256) public price_mainsale;

    // presale access
    ERC1155Burnable public MintPass;

    // shareholder
    address public shareholder;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection, and by setting supply caps, mint indexes, and reserves
     */
    constructor()
        ERC721("LegionVentures", "LV")
    {
        MintPass = ERC1155Burnable(0x392147Bbf620E2222c3b3E39B530105aa3041493);
        shareholder = 0x5BdC0943B7EC9A0891fc94058112b76C5539aC50;

        availSupply[1] = 600;
        availSupply[2] = 300;
        availSupply[3] = 200;
        availSupply[4] = 100;

        price_presale[1] = 1.5 ether;
        price_presale[2] = 3 ether;
        price_presale[3] = 4.5 ether;
        price_presale[4] = 8 ether;
    }
    
    /**
     * ------------ METADATA ------------ 
     */

    /**
     * @dev Gets base metadata URI
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    /**
     * @dev Sets base metadata URI, callable by owner
     */
    function setBaseUri(string memory _uri) external onlyOwner {
        require(metadataLocked == false);
        baseURI = _uri;
    }
    
    /**
     * @dev Lock metadata URI forever, callable by owner
     */
    function lockMetadata() external onlyOwner {
        require(metadataLocked == false);
        metadataLocked = true;
    }
    
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        
        string memory base = _baseURI();
        return string(abi.encodePacked(base, tokenId.toString()));
    }
    
    /**
     * ------------ SALE AND PRESALE ------------ 
     */
     
    /**
     * @dev Ends public sale forever, callable by owner
     */
    function endSaleForever() external onlyOwner {
        mintingEndedForever = true;
    }
    
    /**
     * @dev Ends the presale, callable by owner
     */
    function endPresale() external onlyOwner {
        presaleEnded = true;
    }

    /**
     * @dev Pause/unpause sale or presale
     */
    function togglePauseMinting() external onlyOwner {
        mintPaused = !mintPaused;
    }

    /**
     * ------------ CONFIGURATION ------------ 
     */

    /**
     * @dev Set presale access token address
     */
    function setMintPass(address addr) external onlyOwner {
        MintPass = ERC1155Burnable(addr);
    }

    /**
     * @dev Set presale prices
     */
    function setConfig(uint256[] calldata _types, uint256[] calldata _presalePrices, uint256[] calldata _mainsalePrices, uint256[] calldata _supply) external onlyOwner {
        for (uint256 i = 0; i < _types.length; i++) {
            price_presale[_types[i]] = _presalePrices[i];
            price_mainsale[_types[i]] = _mainsalePrices[i];
            availSupply[_types[i]] = _supply[i];
        }
    }

    /**
     * ------------ MINTING ------------ 
     */
    
    /**
     * @dev Mints `count` tokens to `to` address; internal
     */
    function mintInternal(address to, uint256 count, uint256 mtype) internal {
        for (uint256 i = 0; i < count; i++) {
            _mint(to, mintIndex[mtype] + mtype*1000-1000);
            mintIndex[mtype]++;
        }
    }

    /**
     * @dev Owner minting
     */
    function mintOwner(uint256 mtype, address[] calldata addresses) public onlyOwner {
        require(mintingEndedForever == false, "Sale ended");
        require(mintIndex[mtype] + addresses.length <= availSupply[mtype], "Supply exceeded");

        for (uint256 i = 0; i < addresses.length; i++) {        
            mintInternal(addresses[i], 1, mtype);
        }
    }

    /**
     * @dev Owner minting - advanced
     */
    function mintOwnerAdvanced(uint256[] calldata mtypes, uint256[] calldata counts, address[] calldata addresses) public onlyOwner {
        require(mintingEndedForever == false, "Sale ended");

        for (uint256 i = 0; i < addresses.length; i++) {
            require(mintIndex[mtypes[i]] + counts[i] <= availSupply[mtypes[i]], "Supply exceeded");
            mintInternal(addresses[i], counts[i], mtypes[i]);
        }
    }
    
    /**
     * @dev Public minting during public sale or presale
     */
    function mint(uint256 count, uint256 mtype) public payable{
        require(count > 0, "Count can't be 0");
        require(!mintPaused, "Minting is currently paused");
        require(mintingEndedForever == false, "Sale ended");
        require(mintIndex[mtype] + count <= availSupply[mtype], "Supply exceeded");

        if (!presaleEnded) {
            // presale checks
            uint256 mintPassBalance = MintPass.balanceOf(msg.sender, mtype);
            require(count <= mintPassBalance, "Count too high");
            require(msg.value == count * price_presale[mtype], "Ether value incorrect");

            MintPass.burn(msg.sender, mtype, count);
        } else {
            require(count == 1, "Limit exceeded");
            uint256 price;
            if (price_mainsale[mtype] != 0) {
                price = price_mainsale[mtype];
            } else {
                price = price_presale[mtype];
            }
            require(msg.value == count * price, "Ether value incorrect");
        }
        
        mintInternal(msg.sender, count, mtype);
    }

    /**
     * @dev Withdraw ether from this contract, callable by owner
     */
    function withdraw() external {
        require(msg.sender == owner() || msg.sender == shareholder, "Unauthorized");

        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance*93/100);
        payable(shareholder).transfer(balance*7/100);
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 16: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

        _afterTokenTransfer(operator, from, to, ids, amounts, 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);

        _afterTokenTransfer(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 `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, 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);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        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: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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;
    }
}

File 4 of 16: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

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);
    }
}

File 5 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 6 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 16: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 8 of 16: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

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);
}

File 9 of 16: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: 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.
     *
     * NOTE: 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);
}

File 10 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 11 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 12 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MintPass","outputs":[{"internalType":"contract ERC1155Burnable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"availSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSaleForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"mtype","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtype","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"mtypes","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"mintOwnerAdvanced","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEndedForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price_mainsale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price_presale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_types","type":"uint256[]"},{"internalType":"uint256[]","name":"_presalePrices","type":"uint256[]"},{"internalType":"uint256[]","name":"_mainsalePrices","type":"uint256[]"},{"internalType":"uint256[]","name":"_supply","type":"uint256[]"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareholder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"togglePauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600660146101000a81548160ff021916908315150217905550604051806020016040528060008152506007908051906020019062000046929190620003d2565b506000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff021916908315150217905550348015620000a557600080fd5b506040518060400160405280600e81526020017f4c6567696f6e56656e74757265730000000000000000000000000000000000008152506040518060400160405280600281526020017f4c5600000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012a929190620003d2565b50806001908051906020019062000143929190620003d2565b505050620001666200015a6200030460201b60201c565b6200030c60201b60201c565b73392147bbf620e2222c3b3e39b530105aa3041493600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735bdc0943b7ec9a0891fc94058112b76c5539ac50600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061025860096000600181526020019081526020016000208190555061012c60096000600281526020019081526020016000208190555060c860096000600381526020019081526020016000208190555060646009600060048152602001908152602001600020819055506714d1120d7b160000600b600060018152602001908152602001600020819055506729a2241af62c0000600b60006002815260200190815260200160002081905550673e73362871420000600b60006003815260200190815260200160002081905550676f05b59d3b200000600b60006004815260200190815260200160002081905550620004e7565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003e090620004b1565b90600052602060002090601f01602090048101928262000404576000855562000450565b82601f106200041f57805160ff191683800117855562000450565b8280016001018555821562000450579182015b828111156200044f57825182559160200191906001019062000432565b5b5090506200045f919062000463565b5090565b5b808211156200047e57600081600090555060010162000464565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004ca57607f821691505b60208210811415620004e157620004e062000482565b5b50919050565b614af380620004f76000396000f3fe6080604052600436106102255760003560e01c806382c6ee9f11610123578063b2a9cfa6116100ab578063d7d321591161006f578063d7d32159146107ac578063e580b2b0146107e9578063e985e9c514610814578063ed361d0014610851578063f2fde38b1461087a57610225565b8063b2a9cfa6146106b7578063b88d4fde146106e0578063c87b56dd14610709578063d5fa620114610746578063d63420ec1461076f57610225565b8063a0bcfc7f116100f2578063a0bcfc7f146105e6578063a22cb4651461060f578063a43be57b14610638578063ac031c5c1461064f578063b0b50ed51461067a57610225565b806382c6ee9f146105625780638da5cb5b1461057957806395d89b41146105a4578063989bdbb6146105cf57610225565b80633ccfd60b116101b157806369d2ceb11161017557806369d2ceb11461048d5780636c0360eb146104b857806370a08231146104e3578063715018a6146105205780637e4831d31461053757610225565b80633ccfd60b146103bc5780633e53afc3146103d357806342842e0e146103ea5780634b9d8baf146104135780636352211e1461045057610225565b8063095ea7b3116101f8578063095ea7b3146102fa5780631698fe50146103235780631b2ef1ca1461034c578063210496af1461036857806323b872dd1461039357610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630939e863146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130c5565b6108a3565b60405161025e919061310d565b60405180910390f35b34801561027357600080fd5b5061027c610985565b60405161028991906131c1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613219565b610a17565b6040516102c69190613287565b60405180910390f35b3480156102db57600080fd5b506102e4610a9c565b6040516102f19190613287565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c91906132ce565b610ac2565b005b34801561032f57600080fd5b5061034a600480360381019061034591906133c9565b610bda565b005b6103666004803603810190610361919061347d565b610df9565b005b34801561037457600080fd5b5061037d611234565b60405161038a919061310d565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906134bd565b611247565b005b3480156103c857600080fd5b506103d16112a7565b005b3480156103df57600080fd5b506103e8611463565b005b3480156103f657600080fd5b50610411600480360381019061040c91906134bd565b61150b565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613219565b61152b565b604051610447919061351f565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613219565b611543565b6040516104849190613287565b60405180910390f35b34801561049957600080fd5b506104a26115f5565b6040516104af919061310d565b60405180910390f35b3480156104c457600080fd5b506104cd611608565b6040516104da91906131c1565b60405180910390f35b3480156104ef57600080fd5b5061050a6004803603810190610505919061353a565b611696565b604051610517919061351f565b60405180910390f35b34801561052c57600080fd5b5061053561174e565b005b34801561054357600080fd5b5061054c6117d6565b604051610559919061310d565b60405180910390f35b34801561056e57600080fd5b506105776117e9565b005b34801561058557600080fd5b5061058e611882565b60405161059b9190613287565b60405180910390f35b3480156105b057600080fd5b506105b96118ac565b6040516105c691906131c1565b60405180910390f35b3480156105db57600080fd5b506105e461193e565b005b3480156105f257600080fd5b5061060d60048036038101906106089190613697565b6119f7565b005b34801561061b57600080fd5b506106366004803603810190610631919061370c565b611aad565b005b34801561064457600080fd5b5061064d611ac3565b005b34801561065b57600080fd5b50610664611b5c565b60405161067191906137ab565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613219565b611b82565b6040516106ae919061351f565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061353a565b611b9a565b005b3480156106ec57600080fd5b5061070760048036038101906107029190613867565b611c5a565b005b34801561071557600080fd5b50610730600480360381019061072b9190613219565b611cbc565b60405161073d91906131c1565b60405180910390f35b34801561075257600080fd5b5061076d600480360381019061076891906138ea565b611d44565b005b34801561077b57600080fd5b5061079660048036038101906107919190613219565b611ee7565b6040516107a3919061351f565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613219565b611eff565b6040516107e0919061351f565b60405180910390f35b3480156107f557600080fd5b506107fe611f17565b60405161080b919061310d565b60405180910390f35b34801561082057600080fd5b5061083b6004803603810190610836919061394a565b611f2a565b604051610848919061310d565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061398a565b611fbe565b005b34801561088657600080fd5b506108a1600480360381019061089c919061353a565b612144565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097e575061097d8261223c565b5b9050919050565b60606000805461099490613aa2565b80601f01602080910402602001604051908101604052809291908181526020018280546109c090613aa2565b8015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b5050505050905090565b6000610a22826122a6565b610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890613b46565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610acd82611543565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590613bd8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5d612312565b73ffffffffffffffffffffffffffffffffffffffff161480610b8c5750610b8b81610b86612312565b611f2a565b5b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613c6a565b60405180910390fd5b610bd5838361231a565b505050565b610be2612312565b73ffffffffffffffffffffffffffffffffffffffff16610c00611882565b73ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613cd6565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca390613d42565b60405180910390fd5b60005b82829050811015610df05760096000888884818110610cd157610cd0613d62565b5b90506020020135815260200190815260200160002054858583818110610cfa57610cf9613d62565b5b90506020020135600860008a8a86818110610d1857610d17613d62565b5b90506020020135815260200190815260200160002054610d389190613dc0565b1115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090613e62565b60405180910390fd5b610ddd838383818110610d8f57610d8e613d62565b5b9050602002016020810190610da4919061353a565b868684818110610db757610db6613d62565b5b90506020020135898985818110610dd157610dd0613d62565b5b905060200201356123d3565b8080610de890613e82565b915050610caf565b50505050505050565b60008211610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613f17565b60405180910390fd5b600a60029054906101000a900460ff1615610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613f83565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613d42565b60405180910390fd5b6009600082815260200190815260200160002054826008600084815260200190815260200160002054610f159190613dc0565b1115610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613e62565b60405180910390fd5b600a60009054906101000a900460ff16611145576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33846040518363ffffffff1660e01b8152600401610fc8929190613fa3565b602060405180830381865afa158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110099190613fe1565b90508083111561104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061405a565b60405180910390fd5b600b6000838152602001908152602001600020548361106d919061407a565b34146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614120565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5298aca3384866040518463ffffffff1660e01b815260040161110d93929190614140565b600060405180830381600087803b15801561112757600080fd5b505af115801561113b573d6000803e3d6000fd5b5050505050611225565b60018214611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f906141c3565b60405180910390fd5b600080600c600084815260200190815260200160002054146111bf57600c60008381526020019081526020016000205490506111d6565b600b60008381526020019081526020016000205490505b80836111e2919061407a565b3414611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614120565b60405180910390fd5b505b6112303383836123d3565b5050565b600a60019054906101000a900460ff1681565b611258611252612312565b82612460565b611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614255565b60405180910390fd5b6112a283838361253e565b505050565b6112af611882565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113355750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906142c1565b60405180910390fd5b6000479050611381611882565b73ffffffffffffffffffffffffffffffffffffffff166108fc6064605d846113a9919061407a565b6113b39190614310565b9081150290604051600060405180830381858888f193505050501580156113de573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460078461142a919061407a565b6114349190614310565b9081150290604051600060405180830381858888f1935050505015801561145f573d6000803e3d6000fd5b5050565b61146b612312565b73ffffffffffffffffffffffffffffffffffffffff16611489611882565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d690613cd6565b60405180910390fd5b600a60029054906101000a900460ff1615600a60026101000a81548160ff021916908315150217905550565b61152683838360405180602001604052806000815250611c5a565b505050565b600c6020528060005260406000206000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906143b3565b60405180910390fd5b80915050919050565b600660149054906101000a900460ff1681565b6007805461161590613aa2565b80601f016020809104026020016040519081016040528092919081815260200182805461164190613aa2565b801561168e5780601f106116635761010080835404028352916020019161168e565b820191906000526020600020905b81548152906001019060200180831161167157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614445565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611756612312565b73ffffffffffffffffffffffffffffffffffffffff16611774611882565b73ffffffffffffffffffffffffffffffffffffffff16146117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190613cd6565b60405180910390fd5b6117d460006127a5565b565b600a60029054906101000a900460ff1681565b6117f1612312565b73ffffffffffffffffffffffffffffffffffffffff1661180f611882565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613cd6565b60405180910390fd5b6001600a60016101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118bb90613aa2565b80601f01602080910402602001604051908101604052809291908181526020018280546118e790613aa2565b80156119345780601f1061190957610100808354040283529160200191611934565b820191906000526020600020905b81548152906001019060200180831161191757829003601f168201915b5050505050905090565b611946612312565b73ffffffffffffffffffffffffffffffffffffffff16611964611882565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190613cd6565b60405180910390fd5b60001515600660149054906101000a900460ff161515146119da57600080fd5b6001600660146101000a81548160ff021916908315150217905550565b6119ff612312565b73ffffffffffffffffffffffffffffffffffffffff16611a1d611882565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90613cd6565b60405180910390fd5b60001515600660149054906101000a900460ff16151514611a9357600080fd5b8060079080519060200190611aa9929190612fb6565b5050565b611abf611ab8612312565b838361286b565b5050565b611acb612312565b73ffffffffffffffffffffffffffffffffffffffff16611ae9611882565b73ffffffffffffffffffffffffffffffffffffffff1614611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3690613cd6565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915090505481565b611ba2612312565b73ffffffffffffffffffffffffffffffffffffffff16611bc0611882565b73ffffffffffffffffffffffffffffffffffffffff1614611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90613cd6565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c6b611c65612312565b83612460565b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190614255565b60405180910390fd5b611cb6848484846129d8565b50505050565b6060611cc7826122a6565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906144d7565b60405180910390fd5b6000611d10612a34565b905080611d1c84612ac6565b604051602001611d2d929190614533565b604051602081830303815290604052915050919050565b611d4c612312565b73ffffffffffffffffffffffffffffffffffffffff16611d6a611882565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790613cd6565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90613d42565b60405180910390fd5b6009600084815260200190815260200160002054828290506008600086815260200190815260200160002054611e4c9190613dc0565b1115611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613e62565b60405180910390fd5b60005b82829050811015611ee157611ece838383818110611eb157611eb0613d62565b5b9050602002016020810190611ec6919061353a565b6001866123d3565b8080611ed990613e82565b915050611e90565b50505050565b60096020528060005260406000206000915090505481565b600b6020528060005260406000206000915090505481565b600a60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc6612312565b73ffffffffffffffffffffffffffffffffffffffff16611fe4611882565b73ffffffffffffffffffffffffffffffffffffffff161461203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613cd6565b60405180910390fd5b60005b888890508110156121395786868281811061205b5761205a613d62565b5b90506020020135600b60008b8b8581811061207957612078613d62565b5b905060200201358152602001908152602001600020819055508484828181106120a5576120a4613d62565b5b90506020020135600c60008b8b858181106120c3576120c2613d62565b5b905060200201358152602001908152602001600020819055508282828181106120ef576120ee613d62565b5b90506020020135600960008b8b8581811061210d5761210c613d62565b5b90506020020135815260200190815260200160002081905550808061213190613e82565b91505061203d565b505050505050505050565b61214c612312565b73ffffffffffffffffffffffffffffffffffffffff1661216a611882565b73ffffffffffffffffffffffffffffffffffffffff16146121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790613cd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906145c9565b60405180910390fd5b612239816127a5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661238d83611543565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b8281101561245a5761241e846103e880856123f1919061407a565b600860008781526020019081526020016000205461240f9190613dc0565b61241991906145e9565b612c27565b60086000838152602001908152602001600020600081548092919061244290613e82565b9190505550808061245290613e82565b9150506123d6565b50505050565b600061246b826122a6565b6124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a19061468f565b60405180910390fd5b60006124b583611543565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252457508373ffffffffffffffffffffffffffffffffffffffff1661250c84610a17565b73ffffffffffffffffffffffffffffffffffffffff16145b8061253557506125348185611f2a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661255e82611543565b73ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90614721565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b906147b3565b60405180910390fd5b61262f838383612e01565b61263a60008261231a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268a91906145e9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e19190613dc0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127a0838383612e06565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d19061481f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129cb919061310d565b60405180910390a3505050565b6129e384848461253e565b6129ef84848484612e0b565b612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a25906148b1565b60405180910390fd5b50505050565b606060078054612a4390613aa2565b80601f0160208091040260200160405190810160405280929190818152602001828054612a6f90613aa2565b8015612abc5780601f10612a9157610100808354040283529160200191612abc565b820191906000526020600020905b815481529060010190602001808311612a9f57829003601f168201915b5050505050905090565b60606000821415612b0e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c22565b600082905060005b60008214612b40578080612b2990613e82565b915050600a82612b399190614310565b9150612b16565b60008167ffffffffffffffff811115612b5c57612b5b61356c565b5b6040519080825280601f01601f191660200182016040528015612b8e5781602001600182028036833780820191505090505b5090505b60008514612c1b57600182612ba791906145e9565b9150600a85612bb691906148d1565b6030612bc29190613dc0565b60f81b818381518110612bd857612bd7613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c149190614310565b9450612b92565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e9061494e565b60405180910390fd5b612ca0816122a6565b15612ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd7906149ba565b60405180910390fd5b612cec60008383612e01565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3c9190613dc0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dfd60008383612e06565b5050565b505050565b505050565b6000612e2c8473ffffffffffffffffffffffffffffffffffffffff16612f93565b15612f86578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e55612312565b8786866040518563ffffffff1660e01b8152600401612e779493929190614a2f565b6020604051808303816000875af1925050508015612eb357506040513d601f19601f82011682018060405250810190612eb09190614a90565b60015b612f36573d8060008114612ee3576040519150601f19603f3d011682016040523d82523d6000602084013e612ee8565b606091505b50600081511415612f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f25906148b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f8b565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fc290613aa2565b90600052602060002090601f016020900481019282612fe4576000855561302b565b82601f10612ffd57805160ff191683800117855561302b565b8280016001018555821561302b579182015b8281111561302a57825182559160200191906001019061300f565b5b509050613038919061303c565b5090565b5b8082111561305557600081600090555060010161303d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130a28161306d565b81146130ad57600080fd5b50565b6000813590506130bf81613099565b92915050565b6000602082840312156130db576130da613063565b5b60006130e9848285016130b0565b91505092915050565b60008115159050919050565b613107816130f2565b82525050565b600060208201905061312260008301846130fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613162578082015181840152602081019050613147565b83811115613171576000848401525b50505050565b6000601f19601f8301169050919050565b600061319382613128565b61319d8185613133565b93506131ad818560208601613144565b6131b681613177565b840191505092915050565b600060208201905081810360008301526131db8184613188565b905092915050565b6000819050919050565b6131f6816131e3565b811461320157600080fd5b50565b600081359050613213816131ed565b92915050565b60006020828403121561322f5761322e613063565b5b600061323d84828501613204565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061327182613246565b9050919050565b61328181613266565b82525050565b600060208201905061329c6000830184613278565b92915050565b6132ab81613266565b81146132b657600080fd5b50565b6000813590506132c8816132a2565b92915050565b600080604083850312156132e5576132e4613063565b5b60006132f3858286016132b9565b925050602061330485828601613204565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133335761333261330e565b5b8235905067ffffffffffffffff8111156133505761334f613313565b5b60208301915083602082028301111561336c5761336b613318565b5b9250929050565b60008083601f8401126133895761338861330e565b5b8235905067ffffffffffffffff8111156133a6576133a5613313565b5b6020830191508360208202830111156133c2576133c1613318565b5b9250929050565b600080600080600080606087890312156133e6576133e5613063565b5b600087013567ffffffffffffffff81111561340457613403613068565b5b61341089828a0161331d565b9650965050602087013567ffffffffffffffff81111561343357613432613068565b5b61343f89828a0161331d565b9450945050604087013567ffffffffffffffff81111561346257613461613068565b5b61346e89828a01613373565b92509250509295509295509295565b6000806040838503121561349457613493613063565b5b60006134a285828601613204565b92505060206134b385828601613204565b9150509250929050565b6000806000606084860312156134d6576134d5613063565b5b60006134e4868287016132b9565b93505060206134f5868287016132b9565b925050604061350686828701613204565b9150509250925092565b613519816131e3565b82525050565b60006020820190506135346000830184613510565b92915050565b6000602082840312156135505761354f613063565b5b600061355e848285016132b9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135a482613177565b810181811067ffffffffffffffff821117156135c3576135c261356c565b5b80604052505050565b60006135d6613059565b90506135e2828261359b565b919050565b600067ffffffffffffffff8211156136025761360161356c565b5b61360b82613177565b9050602081019050919050565b82818337600083830152505050565b600061363a613635846135e7565b6135cc565b90508281526020810184848401111561365657613655613567565b5b613661848285613618565b509392505050565b600082601f83011261367e5761367d61330e565b5b813561368e848260208601613627565b91505092915050565b6000602082840312156136ad576136ac613063565b5b600082013567ffffffffffffffff8111156136cb576136ca613068565b5b6136d784828501613669565b91505092915050565b6136e9816130f2565b81146136f457600080fd5b50565b600081359050613706816136e0565b92915050565b6000806040838503121561372357613722613063565b5b6000613731858286016132b9565b9250506020613742858286016136f7565b9150509250929050565b6000819050919050565b600061377161376c61376784613246565b61374c565b613246565b9050919050565b600061378382613756565b9050919050565b600061379582613778565b9050919050565b6137a58161378a565b82525050565b60006020820190506137c0600083018461379c565b92915050565b600067ffffffffffffffff8211156137e1576137e061356c565b5b6137ea82613177565b9050602081019050919050565b600061380a613805846137c6565b6135cc565b90508281526020810184848401111561382657613825613567565b5b613831848285613618565b509392505050565b600082601f83011261384e5761384d61330e565b5b813561385e8482602086016137f7565b91505092915050565b6000806000806080858703121561388157613880613063565b5b600061388f878288016132b9565b94505060206138a0878288016132b9565b93505060406138b187828801613204565b925050606085013567ffffffffffffffff8111156138d2576138d1613068565b5b6138de87828801613839565b91505092959194509250565b60008060006040848603121561390357613902613063565b5b600061391186828701613204565b935050602084013567ffffffffffffffff81111561393257613931613068565b5b61393e86828701613373565b92509250509250925092565b6000806040838503121561396157613960613063565b5b600061396f858286016132b9565b9250506020613980858286016132b9565b9150509250929050565b6000806000806000806000806080898b0312156139aa576139a9613063565b5b600089013567ffffffffffffffff8111156139c8576139c7613068565b5b6139d48b828c0161331d565b9850985050602089013567ffffffffffffffff8111156139f7576139f6613068565b5b613a038b828c0161331d565b9650965050604089013567ffffffffffffffff811115613a2657613a25613068565b5b613a328b828c0161331d565b9450945050606089013567ffffffffffffffff811115613a5557613a54613068565b5b613a618b828c0161331d565b92509250509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aba57607f821691505b60208210811415613ace57613acd613a73565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b30602c83613133565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc2602183613133565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613c54603883613133565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc0602083613133565b9150613ccb82613c8a565b602082019050919050565b60006020820190508181036000830152613cef81613cb3565b9050919050565b7f53616c6520656e64656400000000000000000000000000000000000000000000600082015250565b6000613d2c600a83613133565b9150613d3782613cf6565b602082019050919050565b60006020820190508181036000830152613d5b81613d1f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dcb826131e3565b9150613dd6836131e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0b57613e0a613d91565b5b828201905092915050565b7f537570706c792065786365656465640000000000000000000000000000000000600082015250565b6000613e4c600f83613133565b9150613e5782613e16565b602082019050919050565b60006020820190508181036000830152613e7b81613e3f565b9050919050565b6000613e8d826131e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec057613ebf613d91565b5b600182019050919050565b7f436f756e742063616e2774206265203000000000000000000000000000000000600082015250565b6000613f01601083613133565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b6000613f6d601b83613133565b9150613f7882613f37565b602082019050919050565b60006020820190508181036000830152613f9c81613f60565b9050919050565b6000604082019050613fb86000830185613278565b613fc56020830184613510565b9392505050565b600081519050613fdb816131ed565b92915050565b600060208284031215613ff757613ff6613063565b5b600061400584828501613fcc565b91505092915050565b7f436f756e7420746f6f2068696768000000000000000000000000000000000000600082015250565b6000614044600e83613133565b915061404f8261400e565b602082019050919050565b6000602082019050818103600083015261407381614037565b9050919050565b6000614085826131e3565b9150614090836131e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140c9576140c8613d91565b5b828202905092915050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b600061410a601583613133565b9150614115826140d4565b602082019050919050565b60006020820190508181036000830152614139816140fd565b9050919050565b60006060820190506141556000830186613278565b6141626020830185613510565b61416f6040830184613510565b949350505050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b60006141ad600e83613133565b91506141b882614177565b602082019050919050565b600060208201905081810360008301526141dc816141a0565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061423f603183613133565b915061424a826141e3565b604082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006142ab600c83613133565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061431b826131e3565b9150614326836131e3565b925082614336576143356142e1565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061439d602983613133565b91506143a882614341565b604082019050919050565b600060208201905081810360008301526143cc81614390565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061442f602a83613133565b915061443a826143d3565b604082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006144c1603183613133565b91506144cc82614465565b604082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600081905092915050565b600061450d82613128565b61451781856144f7565b9350614527818560208601613144565b80840191505092915050565b600061453f8285614502565b915061454b8284614502565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145b3602683613133565b91506145be82614557565b604082019050919050565b600060208201905081810360008301526145e2816145a6565b9050919050565b60006145f4826131e3565b91506145ff836131e3565b92508282101561461257614611613d91565b5b828203905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614679602c83613133565b91506146848261461d565b604082019050919050565b600060208201905081810360008301526146a88161466c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061470b602583613133565b9150614716826146af565b604082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061479d602483613133565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614809601983613133565b9150614814826147d3565b602082019050919050565b60006020820190508181036000830152614838816147fc565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061489b603283613133565b91506148a68261483f565b604082019050919050565b600060208201905081810360008301526148ca8161488e565b9050919050565b60006148dc826131e3565b91506148e7836131e3565b9250826148f7576148f66142e1565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614938602083613133565b915061494382614902565b602082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149a4601c83613133565b91506149af8261496e565b602082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a01826149da565b614a0b81856149e5565b9350614a1b818560208601613144565b614a2481613177565b840191505092915050565b6000608082019050614a446000830187613278565b614a516020830186613278565b614a5e6040830185613510565b8181036060830152614a7081846149f6565b905095945050505050565b600081519050614a8a81613099565b92915050565b600060208284031215614aa657614aa5613063565b5b6000614ab484828501614a7b565b9150509291505056fea2646970667358221220775416076ee4b8239d5547212c3ccab50dd1d5a8fb045273cfd35ffa0d0f726f64736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102255760003560e01c806382c6ee9f11610123578063b2a9cfa6116100ab578063d7d321591161006f578063d7d32159146107ac578063e580b2b0146107e9578063e985e9c514610814578063ed361d0014610851578063f2fde38b1461087a57610225565b8063b2a9cfa6146106b7578063b88d4fde146106e0578063c87b56dd14610709578063d5fa620114610746578063d63420ec1461076f57610225565b8063a0bcfc7f116100f2578063a0bcfc7f146105e6578063a22cb4651461060f578063a43be57b14610638578063ac031c5c1461064f578063b0b50ed51461067a57610225565b806382c6ee9f146105625780638da5cb5b1461057957806395d89b41146105a4578063989bdbb6146105cf57610225565b80633ccfd60b116101b157806369d2ceb11161017557806369d2ceb11461048d5780636c0360eb146104b857806370a08231146104e3578063715018a6146105205780637e4831d31461053757610225565b80633ccfd60b146103bc5780633e53afc3146103d357806342842e0e146103ea5780634b9d8baf146104135780636352211e1461045057610225565b8063095ea7b3116101f8578063095ea7b3146102fa5780631698fe50146103235780631b2ef1ca1461034c578063210496af1461036857806323b872dd1461039357610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630939e863146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130c5565b6108a3565b60405161025e919061310d565b60405180910390f35b34801561027357600080fd5b5061027c610985565b60405161028991906131c1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613219565b610a17565b6040516102c69190613287565b60405180910390f35b3480156102db57600080fd5b506102e4610a9c565b6040516102f19190613287565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c91906132ce565b610ac2565b005b34801561032f57600080fd5b5061034a600480360381019061034591906133c9565b610bda565b005b6103666004803603810190610361919061347d565b610df9565b005b34801561037457600080fd5b5061037d611234565b60405161038a919061310d565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906134bd565b611247565b005b3480156103c857600080fd5b506103d16112a7565b005b3480156103df57600080fd5b506103e8611463565b005b3480156103f657600080fd5b50610411600480360381019061040c91906134bd565b61150b565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613219565b61152b565b604051610447919061351f565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613219565b611543565b6040516104849190613287565b60405180910390f35b34801561049957600080fd5b506104a26115f5565b6040516104af919061310d565b60405180910390f35b3480156104c457600080fd5b506104cd611608565b6040516104da91906131c1565b60405180910390f35b3480156104ef57600080fd5b5061050a6004803603810190610505919061353a565b611696565b604051610517919061351f565b60405180910390f35b34801561052c57600080fd5b5061053561174e565b005b34801561054357600080fd5b5061054c6117d6565b604051610559919061310d565b60405180910390f35b34801561056e57600080fd5b506105776117e9565b005b34801561058557600080fd5b5061058e611882565b60405161059b9190613287565b60405180910390f35b3480156105b057600080fd5b506105b96118ac565b6040516105c691906131c1565b60405180910390f35b3480156105db57600080fd5b506105e461193e565b005b3480156105f257600080fd5b5061060d60048036038101906106089190613697565b6119f7565b005b34801561061b57600080fd5b506106366004803603810190610631919061370c565b611aad565b005b34801561064457600080fd5b5061064d611ac3565b005b34801561065b57600080fd5b50610664611b5c565b60405161067191906137ab565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613219565b611b82565b6040516106ae919061351f565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061353a565b611b9a565b005b3480156106ec57600080fd5b5061070760048036038101906107029190613867565b611c5a565b005b34801561071557600080fd5b50610730600480360381019061072b9190613219565b611cbc565b60405161073d91906131c1565b60405180910390f35b34801561075257600080fd5b5061076d600480360381019061076891906138ea565b611d44565b005b34801561077b57600080fd5b5061079660048036038101906107919190613219565b611ee7565b6040516107a3919061351f565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613219565b611eff565b6040516107e0919061351f565b60405180910390f35b3480156107f557600080fd5b506107fe611f17565b60405161080b919061310d565b60405180910390f35b34801561082057600080fd5b5061083b6004803603810190610836919061394a565b611f2a565b604051610848919061310d565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061398a565b611fbe565b005b34801561088657600080fd5b506108a1600480360381019061089c919061353a565b612144565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061097e575061097d8261223c565b5b9050919050565b60606000805461099490613aa2565b80601f01602080910402602001604051908101604052809291908181526020018280546109c090613aa2565b8015610a0d5780601f106109e257610100808354040283529160200191610a0d565b820191906000526020600020905b8154815290600101906020018083116109f057829003601f168201915b5050505050905090565b6000610a22826122a6565b610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890613b46565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610acd82611543565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590613bd8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5d612312565b73ffffffffffffffffffffffffffffffffffffffff161480610b8c5750610b8b81610b86612312565b611f2a565b5b610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290613c6a565b60405180910390fd5b610bd5838361231a565b505050565b610be2612312565b73ffffffffffffffffffffffffffffffffffffffff16610c00611882565b73ffffffffffffffffffffffffffffffffffffffff1614610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613cd6565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca390613d42565b60405180910390fd5b60005b82829050811015610df05760096000888884818110610cd157610cd0613d62565b5b90506020020135815260200190815260200160002054858583818110610cfa57610cf9613d62565b5b90506020020135600860008a8a86818110610d1857610d17613d62565b5b90506020020135815260200190815260200160002054610d389190613dc0565b1115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090613e62565b60405180910390fd5b610ddd838383818110610d8f57610d8e613d62565b5b9050602002016020810190610da4919061353a565b868684818110610db757610db6613d62565b5b90506020020135898985818110610dd157610dd0613d62565b5b905060200201356123d3565b8080610de890613e82565b915050610caf565b50505050505050565b60008211610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613f17565b60405180910390fd5b600a60029054906101000a900460ff1615610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613f83565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613d42565b60405180910390fd5b6009600082815260200190815260200160002054826008600084815260200190815260200160002054610f159190613dc0565b1115610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613e62565b60405180910390fd5b600a60009054906101000a900460ff16611145576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33846040518363ffffffff1660e01b8152600401610fc8929190613fa3565b602060405180830381865afa158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110099190613fe1565b90508083111561104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110459061405a565b60405180910390fd5b600b6000838152602001908152602001600020548361106d919061407a565b34146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614120565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5298aca3384866040518463ffffffff1660e01b815260040161110d93929190614140565b600060405180830381600087803b15801561112757600080fd5b505af115801561113b573d6000803e3d6000fd5b5050505050611225565b60018214611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f906141c3565b60405180910390fd5b600080600c600084815260200190815260200160002054146111bf57600c60008381526020019081526020016000205490506111d6565b600b60008381526020019081526020016000205490505b80836111e2919061407a565b3414611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614120565b60405180910390fd5b505b6112303383836123d3565b5050565b600a60019054906101000a900460ff1681565b611258611252612312565b82612460565b611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614255565b60405180910390fd5b6112a283838361253e565b505050565b6112af611882565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113355750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906142c1565b60405180910390fd5b6000479050611381611882565b73ffffffffffffffffffffffffffffffffffffffff166108fc6064605d846113a9919061407a565b6113b39190614310565b9081150290604051600060405180830381858888f193505050501580156113de573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460078461142a919061407a565b6114349190614310565b9081150290604051600060405180830381858888f1935050505015801561145f573d6000803e3d6000fd5b5050565b61146b612312565b73ffffffffffffffffffffffffffffffffffffffff16611489611882565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d690613cd6565b60405180910390fd5b600a60029054906101000a900460ff1615600a60026101000a81548160ff021916908315150217905550565b61152683838360405180602001604052806000815250611c5a565b505050565b600c6020528060005260406000206000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906143b3565b60405180910390fd5b80915050919050565b600660149054906101000a900460ff1681565b6007805461161590613aa2565b80601f016020809104026020016040519081016040528092919081815260200182805461164190613aa2565b801561168e5780601f106116635761010080835404028352916020019161168e565b820191906000526020600020905b81548152906001019060200180831161167157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614445565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611756612312565b73ffffffffffffffffffffffffffffffffffffffff16611774611882565b73ffffffffffffffffffffffffffffffffffffffff16146117ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c190613cd6565b60405180910390fd5b6117d460006127a5565b565b600a60029054906101000a900460ff1681565b6117f1612312565b73ffffffffffffffffffffffffffffffffffffffff1661180f611882565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613cd6565b60405180910390fd5b6001600a60016101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118bb90613aa2565b80601f01602080910402602001604051908101604052809291908181526020018280546118e790613aa2565b80156119345780601f1061190957610100808354040283529160200191611934565b820191906000526020600020905b81548152906001019060200180831161191757829003601f168201915b5050505050905090565b611946612312565b73ffffffffffffffffffffffffffffffffffffffff16611964611882565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190613cd6565b60405180910390fd5b60001515600660149054906101000a900460ff161515146119da57600080fd5b6001600660146101000a81548160ff021916908315150217905550565b6119ff612312565b73ffffffffffffffffffffffffffffffffffffffff16611a1d611882565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90613cd6565b60405180910390fd5b60001515600660149054906101000a900460ff16151514611a9357600080fd5b8060079080519060200190611aa9929190612fb6565b5050565b611abf611ab8612312565b838361286b565b5050565b611acb612312565b73ffffffffffffffffffffffffffffffffffffffff16611ae9611882565b73ffffffffffffffffffffffffffffffffffffffff1614611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3690613cd6565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915090505481565b611ba2612312565b73ffffffffffffffffffffffffffffffffffffffff16611bc0611882565b73ffffffffffffffffffffffffffffffffffffffff1614611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90613cd6565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c6b611c65612312565b83612460565b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190614255565b60405180910390fd5b611cb6848484846129d8565b50505050565b6060611cc7826122a6565b611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906144d7565b60405180910390fd5b6000611d10612a34565b905080611d1c84612ac6565b604051602001611d2d929190614533565b604051602081830303815290604052915050919050565b611d4c612312565b73ffffffffffffffffffffffffffffffffffffffff16611d6a611882565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790613cd6565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90613d42565b60405180910390fd5b6009600084815260200190815260200160002054828290506008600086815260200190815260200160002054611e4c9190613dc0565b1115611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613e62565b60405180910390fd5b60005b82829050811015611ee157611ece838383818110611eb157611eb0613d62565b5b9050602002016020810190611ec6919061353a565b6001866123d3565b8080611ed990613e82565b915050611e90565b50505050565b60096020528060005260406000206000915090505481565b600b6020528060005260406000206000915090505481565b600a60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fc6612312565b73ffffffffffffffffffffffffffffffffffffffff16611fe4611882565b73ffffffffffffffffffffffffffffffffffffffff161461203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613cd6565b60405180910390fd5b60005b888890508110156121395786868281811061205b5761205a613d62565b5b90506020020135600b60008b8b8581811061207957612078613d62565b5b905060200201358152602001908152602001600020819055508484828181106120a5576120a4613d62565b5b90506020020135600c60008b8b858181106120c3576120c2613d62565b5b905060200201358152602001908152602001600020819055508282828181106120ef576120ee613d62565b5b90506020020135600960008b8b8581811061210d5761210c613d62565b5b90506020020135815260200190815260200160002081905550808061213190613e82565b91505061203d565b505050505050505050565b61214c612312565b73ffffffffffffffffffffffffffffffffffffffff1661216a611882565b73ffffffffffffffffffffffffffffffffffffffff16146121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790613cd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906145c9565b60405180910390fd5b612239816127a5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661238d83611543565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b8281101561245a5761241e846103e880856123f1919061407a565b600860008781526020019081526020016000205461240f9190613dc0565b61241991906145e9565b612c27565b60086000838152602001908152602001600020600081548092919061244290613e82565b9190505550808061245290613e82565b9150506123d6565b50505050565b600061246b826122a6565b6124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a19061468f565b60405180910390fd5b60006124b583611543565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252457508373ffffffffffffffffffffffffffffffffffffffff1661250c84610a17565b73ffffffffffffffffffffffffffffffffffffffff16145b8061253557506125348185611f2a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661255e82611543565b73ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90614721565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b906147b3565b60405180910390fd5b61262f838383612e01565b61263a60008261231a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268a91906145e9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e19190613dc0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127a0838383612e06565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d19061481f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129cb919061310d565b60405180910390a3505050565b6129e384848461253e565b6129ef84848484612e0b565b612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a25906148b1565b60405180910390fd5b50505050565b606060078054612a4390613aa2565b80601f0160208091040260200160405190810160405280929190818152602001828054612a6f90613aa2565b8015612abc5780601f10612a9157610100808354040283529160200191612abc565b820191906000526020600020905b815481529060010190602001808311612a9f57829003601f168201915b5050505050905090565b60606000821415612b0e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c22565b600082905060005b60008214612b40578080612b2990613e82565b915050600a82612b399190614310565b9150612b16565b60008167ffffffffffffffff811115612b5c57612b5b61356c565b5b6040519080825280601f01601f191660200182016040528015612b8e5781602001600182028036833780820191505090505b5090505b60008514612c1b57600182612ba791906145e9565b9150600a85612bb691906148d1565b6030612bc29190613dc0565b60f81b818381518110612bd857612bd7613d62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c149190614310565b9450612b92565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e9061494e565b60405180910390fd5b612ca0816122a6565b15612ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd7906149ba565b60405180910390fd5b612cec60008383612e01565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3c9190613dc0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dfd60008383612e06565b5050565b505050565b505050565b6000612e2c8473ffffffffffffffffffffffffffffffffffffffff16612f93565b15612f86578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e55612312565b8786866040518563ffffffff1660e01b8152600401612e779493929190614a2f565b6020604051808303816000875af1925050508015612eb357506040513d601f19601f82011682018060405250810190612eb09190614a90565b60015b612f36573d8060008114612ee3576040519150601f19603f3d011682016040523d82523d6000602084013e612ee8565b606091505b50600081511415612f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f25906148b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f8b565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fc290613aa2565b90600052602060002090601f016020900481019282612fe4576000855561302b565b82601f10612ffd57805160ff191683800117855561302b565b8280016001018555821561302b579182015b8281111561302a57825182559160200191906001019061300f565b5b509050613038919061303c565b5090565b5b8082111561305557600081600090555060010161303d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130a28161306d565b81146130ad57600080fd5b50565b6000813590506130bf81613099565b92915050565b6000602082840312156130db576130da613063565b5b60006130e9848285016130b0565b91505092915050565b60008115159050919050565b613107816130f2565b82525050565b600060208201905061312260008301846130fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613162578082015181840152602081019050613147565b83811115613171576000848401525b50505050565b6000601f19601f8301169050919050565b600061319382613128565b61319d8185613133565b93506131ad818560208601613144565b6131b681613177565b840191505092915050565b600060208201905081810360008301526131db8184613188565b905092915050565b6000819050919050565b6131f6816131e3565b811461320157600080fd5b50565b600081359050613213816131ed565b92915050565b60006020828403121561322f5761322e613063565b5b600061323d84828501613204565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061327182613246565b9050919050565b61328181613266565b82525050565b600060208201905061329c6000830184613278565b92915050565b6132ab81613266565b81146132b657600080fd5b50565b6000813590506132c8816132a2565b92915050565b600080604083850312156132e5576132e4613063565b5b60006132f3858286016132b9565b925050602061330485828601613204565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133335761333261330e565b5b8235905067ffffffffffffffff8111156133505761334f613313565b5b60208301915083602082028301111561336c5761336b613318565b5b9250929050565b60008083601f8401126133895761338861330e565b5b8235905067ffffffffffffffff8111156133a6576133a5613313565b5b6020830191508360208202830111156133c2576133c1613318565b5b9250929050565b600080600080600080606087890312156133e6576133e5613063565b5b600087013567ffffffffffffffff81111561340457613403613068565b5b61341089828a0161331d565b9650965050602087013567ffffffffffffffff81111561343357613432613068565b5b61343f89828a0161331d565b9450945050604087013567ffffffffffffffff81111561346257613461613068565b5b61346e89828a01613373565b92509250509295509295509295565b6000806040838503121561349457613493613063565b5b60006134a285828601613204565b92505060206134b385828601613204565b9150509250929050565b6000806000606084860312156134d6576134d5613063565b5b60006134e4868287016132b9565b93505060206134f5868287016132b9565b925050604061350686828701613204565b9150509250925092565b613519816131e3565b82525050565b60006020820190506135346000830184613510565b92915050565b6000602082840312156135505761354f613063565b5b600061355e848285016132b9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135a482613177565b810181811067ffffffffffffffff821117156135c3576135c261356c565b5b80604052505050565b60006135d6613059565b90506135e2828261359b565b919050565b600067ffffffffffffffff8211156136025761360161356c565b5b61360b82613177565b9050602081019050919050565b82818337600083830152505050565b600061363a613635846135e7565b6135cc565b90508281526020810184848401111561365657613655613567565b5b613661848285613618565b509392505050565b600082601f83011261367e5761367d61330e565b5b813561368e848260208601613627565b91505092915050565b6000602082840312156136ad576136ac613063565b5b600082013567ffffffffffffffff8111156136cb576136ca613068565b5b6136d784828501613669565b91505092915050565b6136e9816130f2565b81146136f457600080fd5b50565b600081359050613706816136e0565b92915050565b6000806040838503121561372357613722613063565b5b6000613731858286016132b9565b9250506020613742858286016136f7565b9150509250929050565b6000819050919050565b600061377161376c61376784613246565b61374c565b613246565b9050919050565b600061378382613756565b9050919050565b600061379582613778565b9050919050565b6137a58161378a565b82525050565b60006020820190506137c0600083018461379c565b92915050565b600067ffffffffffffffff8211156137e1576137e061356c565b5b6137ea82613177565b9050602081019050919050565b600061380a613805846137c6565b6135cc565b90508281526020810184848401111561382657613825613567565b5b613831848285613618565b509392505050565b600082601f83011261384e5761384d61330e565b5b813561385e8482602086016137f7565b91505092915050565b6000806000806080858703121561388157613880613063565b5b600061388f878288016132b9565b94505060206138a0878288016132b9565b93505060406138b187828801613204565b925050606085013567ffffffffffffffff8111156138d2576138d1613068565b5b6138de87828801613839565b91505092959194509250565b60008060006040848603121561390357613902613063565b5b600061391186828701613204565b935050602084013567ffffffffffffffff81111561393257613931613068565b5b61393e86828701613373565b92509250509250925092565b6000806040838503121561396157613960613063565b5b600061396f858286016132b9565b9250506020613980858286016132b9565b9150509250929050565b6000806000806000806000806080898b0312156139aa576139a9613063565b5b600089013567ffffffffffffffff8111156139c8576139c7613068565b5b6139d48b828c0161331d565b9850985050602089013567ffffffffffffffff8111156139f7576139f6613068565b5b613a038b828c0161331d565b9650965050604089013567ffffffffffffffff811115613a2657613a25613068565b5b613a328b828c0161331d565b9450945050606089013567ffffffffffffffff811115613a5557613a54613068565b5b613a618b828c0161331d565b92509250509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aba57607f821691505b60208210811415613ace57613acd613a73565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b30602c83613133565b9150613b3b82613ad4565b604082019050919050565b60006020820190508181036000830152613b5f81613b23565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc2602183613133565b9150613bcd82613b66565b604082019050919050565b60006020820190508181036000830152613bf181613bb5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613c54603883613133565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc0602083613133565b9150613ccb82613c8a565b602082019050919050565b60006020820190508181036000830152613cef81613cb3565b9050919050565b7f53616c6520656e64656400000000000000000000000000000000000000000000600082015250565b6000613d2c600a83613133565b9150613d3782613cf6565b602082019050919050565b60006020820190508181036000830152613d5b81613d1f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dcb826131e3565b9150613dd6836131e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0b57613e0a613d91565b5b828201905092915050565b7f537570706c792065786365656465640000000000000000000000000000000000600082015250565b6000613e4c600f83613133565b9150613e5782613e16565b602082019050919050565b60006020820190508181036000830152613e7b81613e3f565b9050919050565b6000613e8d826131e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec057613ebf613d91565b5b600182019050919050565b7f436f756e742063616e2774206265203000000000000000000000000000000000600082015250565b6000613f01601083613133565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b6000613f6d601b83613133565b9150613f7882613f37565b602082019050919050565b60006020820190508181036000830152613f9c81613f60565b9050919050565b6000604082019050613fb86000830185613278565b613fc56020830184613510565b9392505050565b600081519050613fdb816131ed565b92915050565b600060208284031215613ff757613ff6613063565b5b600061400584828501613fcc565b91505092915050565b7f436f756e7420746f6f2068696768000000000000000000000000000000000000600082015250565b6000614044600e83613133565b915061404f8261400e565b602082019050919050565b6000602082019050818103600083015261407381614037565b9050919050565b6000614085826131e3565b9150614090836131e3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140c9576140c8613d91565b5b828202905092915050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b600061410a601583613133565b9150614115826140d4565b602082019050919050565b60006020820190508181036000830152614139816140fd565b9050919050565b60006060820190506141556000830186613278565b6141626020830185613510565b61416f6040830184613510565b949350505050565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b60006141ad600e83613133565b91506141b882614177565b602082019050919050565b600060208201905081810360008301526141dc816141a0565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061423f603183613133565b915061424a826141e3565b604082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006142ab600c83613133565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061431b826131e3565b9150614326836131e3565b925082614336576143356142e1565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061439d602983613133565b91506143a882614341565b604082019050919050565b600060208201905081810360008301526143cc81614390565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061442f602a83613133565b915061443a826143d3565b604082019050919050565b6000602082019050818103600083015261445e81614422565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006144c1603183613133565b91506144cc82614465565b604082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600081905092915050565b600061450d82613128565b61451781856144f7565b9350614527818560208601613144565b80840191505092915050565b600061453f8285614502565b915061454b8284614502565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145b3602683613133565b91506145be82614557565b604082019050919050565b600060208201905081810360008301526145e2816145a6565b9050919050565b60006145f4826131e3565b91506145ff836131e3565b92508282101561461257614611613d91565b5b828203905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614679602c83613133565b91506146848261461d565b604082019050919050565b600060208201905081810360008301526146a88161466c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061470b602583613133565b9150614716826146af565b604082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061479d602483613133565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614809601983613133565b9150614814826147d3565b602082019050919050565b60006020820190508181036000830152614838816147fc565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061489b603283613133565b91506148a68261483f565b604082019050919050565b600060208201905081810360008301526148ca8161488e565b9050919050565b60006148dc826131e3565b91506148e7836131e3565b9250826148f7576148f66142e1565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614938602083613133565b915061494382614902565b602082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006149a4601c83613133565b91506149af8261496e565b602082019050919050565b600060208201905081810360008301526149d381614997565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a01826149da565b614a0b81856149e5565b9350614a1b818560208601613144565b614a2481613177565b840191505092915050565b6000608082019050614a446000830187613278565b614a516020830186613278565b614a5e6040830185613510565b8181036060830152614a7081846149f6565b905095945050505050565b600081519050614a8a81613099565b92915050565b600060208284031215614aa657614aa5613063565b5b6000614ab484828501614a7b565b9150509291505056fea2646970667358221220775416076ee4b8239d5547212c3ccab50dd1d5a8fb045273cfd35ffa0d0f726f64736f6c634300080b0033

Deployed Bytecode Sourcemap

146:6592:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1556:305:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2501:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4061:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;832:26:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3584:411:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4741:433:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5262:1099;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;532:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4811:339:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6453:282:13;;;;;;;;;;;;;:::i;:::-;;3058:92;;;;;;;;;;;;;:::i;:::-;;5221:185:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;690:50:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2195:239:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;283:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;324:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1925:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:14;;;;;;;;;;;;;:::i;:::-;;578:29:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2741:90;;;;;;;;;;;;;:::i;:::-;;1063:87:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2670:104:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2071:126:13;;;;;;;;;;;;;:::i;:::-;;1848:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4354:155:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2910:79:13;;;;;;;;;;;;;:::i;:::-;;772:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;385:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3291:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5477:328:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2272:305:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4300:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;437:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;634:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;493:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4580:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3454:408:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1556:305:5;1658:4;1710:25;1695:40;;;:11;:40;;;;:105;;;;1767:33;1752:48;;;:11;:48;;;;1695:105;:158;;;;1817:36;1841:11;1817:23;:36::i;:::-;1695:158;1675:178;;1556:305;;;:::o;2501:100::-;2555:13;2588:5;2581:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2501:100;:::o;4061:221::-;4137:7;4165:16;4173:7;4165;:16::i;:::-;4157:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4250:15;:24;4266:7;4250:24;;;;;;;;;;;;;;;;;;;;;4243:31;;4061:221;;;:::o;832:26:13:-;;;;;;;;;;;;;:::o;3584:411:5:-;3665:13;3681:23;3696:7;3681:14;:23::i;:::-;3665:39;;3729:5;3723:11;;:2;:11;;;;3715:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3823:5;3807:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3832:37;3849:5;3856:12;:10;:12::i;:::-;3832:16;:37::i;:::-;3807:62;3785:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3966:21;3975:2;3979:7;3966:8;:21::i;:::-;3654:341;3584:411;;:::o;4741:433:13:-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4911:5:13::1;4888:28;;:19;;;;;;;;;;;:28;;;4880:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:9;4944:223;4968:9;;:16;;4964:1;:20;4944:223;;;5050:11;:22;5062:6;;5069:1;5062:9;;;;;;;:::i;:::-;;;;;;;;5050:22;;;;;;;;;;;;5037:6;;5044:1;5037:9;;;;;;;:::i;:::-;;;;;;;;5014;:20;5024:6;;5031:1;5024:9;;;;;;;:::i;:::-;;;;;;;;5014:20;;;;;;;;;;;;:32;;;;:::i;:::-;:58;;5006:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;5107:48;5120:9;;5130:1;5120:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5134:6;;5141:1;5134:9;;;;;;;:::i;:::-;;;;;;;;5145:6;;5152:1;5145:9;;;;;;;:::i;:::-;;;;;;;;5107:12;:48::i;:::-;4986:3;;;;;:::i;:::-;;;;4944:223;;;;4741:433:::0;;;;;;:::o;5262:1099::-;5347:1;5339:5;:9;5331:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5389:10;;;;;;;;;;;5388:11;5380:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;5473:5;5450:28;;:19;;;;;;;;;;;:28;;;5442:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;5540:11;:18;5552:5;5540:18;;;;;;;;;;;;5531:5;5512:9;:16;5522:5;5512:16;;;;;;;;;;;;:24;;;;:::i;:::-;:46;;5504:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;5596:12;;;;;;;;;;;5591:704;;5656:23;5682:8;;;;;;;;;;;:18;;;5701:10;5713:5;5682:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5656:63;;5751:15;5742:5;:24;;5734:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;5829:13;:20;5843:5;5829:20;;;;;;;;;;;;5821:5;:28;;;;:::i;:::-;5808:9;:41;5800:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;5892:8;;;;;;;;;;;:13;;;5906:10;5918:5;5925;5892:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5610:333;5591:704;;;5981:1;5972:5;:10;5964:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;6016:13;6073:1;6048:14;:21;6063:5;6048:21;;;;;;;;;;;;:26;6044:165;;6103:14;:21;6118:5;6103:21;;;;;;;;;;;;6095:29;;6044:165;;;6173:13;:20;6187:5;6173:20;;;;;;;;;;;;6165:28;;6044:165;6252:5;6244;:13;;;;:::i;:::-;6231:9;:26;6223:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5949:346;5591:704;6315:38;6328:10;6340:5;6347;6315:12;:38::i;:::-;5262:1099;;:::o;532:39::-;;;;;;;;;;;;;:::o;4811:339:5:-;5006:41;5025:12;:10;:12::i;:::-;5039:7;5006:18;:41::i;:::-;4998:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5114:28;5124:4;5130:2;5134:7;5114:9;:28::i;:::-;4811:339;;;:::o;6453:282:13:-;6515:7;:5;:7::i;:::-;6501:21;;:10;:21;;;:50;;;;6540:11;;;;;;;;;;;6526:25;;:10;:25;;;6501:50;6493:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;6581:15;6599:21;6581:39;;6639:7;:5;:7::i;:::-;6631:25;;:41;6668:3;6665:2;6657:7;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6631:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6691:11;;;;;;;;;;;6683:29;;:44;6723:3;6721:1;6713:7;:9;;;;:::i;:::-;:13;;;;:::i;:::-;6683:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6482:253;6453:282::o;3058:92::-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3132:10:13::1;;;;;;;;;;;3131:11;3118:10;;:24;;;;;;;;;;;;;;;;;;3058:92::o:0;5221:185:5:-;5359:39;5376:4;5382:2;5386:7;5359:39;;;;;;;;;;;;:16;:39::i;:::-;5221:185;;;:::o;690:50:13:-;;;;;;;;;;;;;;;;;:::o;2195:239:5:-;2267:7;2287:13;2303:7;:16;2311:7;2303:16;;;;;;;;;;;;;;;;;;;;;2287:32;;2355:1;2338:19;;:5;:19;;;;2330:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2421:5;2414:12;;;2195:239;;;:::o;283:34:13:-;;;;;;;;;;;;;:::o;324:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1925:208:5:-;1997:7;2042:1;2025:19;;:5;:19;;;;2017:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2109:9;:16;2119:5;2109:16;;;;;;;;;;;;;;;;2102:23;;1925:208;;;:::o;1714:103:14:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;578:29:13:-;;;;;;;;;;;;;:::o;2741:90::-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2819:4:13::1;2797:19;;:26;;;;;;;;;;;;;;;;;;2741:90::o:0;1063:87:14:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2670:104:5:-;2726:13;2759:7;2752:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2670:104;:::o;2071:126:13:-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2151:5:13::1;2133:23;;:14;;;;;;;;;;;:23;;;2125:32;;;::::0;::::1;;2185:4;2168:14;;:21;;;;;;;;;;;;;;;;;;2071:126::o:0;1848:135::-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1944:5:13::1;1926:23;;:14;;;;;;;;;;;:23;;;1918:32;;;::::0;::::1;;1971:4;1961:7;:14;;;;;;;;;;;;:::i;:::-;;1848:135:::0;:::o;4354:155:5:-;4449:52;4468:12;:10;:12::i;:::-;4482:8;4492;4449:18;:52::i;:::-;4354:155;;:::o;2910:79:13:-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2977:4:13::1;2962:12;;:19;;;;;;;;;;;;;;;;;;2910:79::o:0;772:31::-;;;;;;;;;;;;;:::o;385:45::-;;;;;;;;;;;;;;;;;:::o;3291:105::-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3383:4:13::1;3356:8;;:32;;;;;;;;;;;;;;;;;;3291:105:::0;:::o;5477:328:5:-;5652:41;5671:12;:10;:12::i;:::-;5685:7;5652:18;:41::i;:::-;5644:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5758:39;5772:4;5778:2;5782:7;5791:5;5758:13;:39::i;:::-;5477:328;;;;:::o;2272:305:13:-;2345:13;2379:16;2387:7;2379;:16::i;:::-;2371:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2470:18;2491:10;:8;:10::i;:::-;2470:31;;2543:4;2549:18;:7;:16;:18::i;:::-;2526:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2512:57;;;2272:305;;;:::o;4300:377::-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4423:5:13::1;4400:28;;:19;;;;;;;;;;;:28;;;4392:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;4501:11;:18;4513:5;4501:18;;;;;;;;;;;;4481:9;;:16;;4462:9;:16;4472:5;4462:16;;;;;;;;;;;;:35;;;;:::i;:::-;:57;;4454:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4557:9;4552:118;4576:9;;:16;;4572:1;:20;4552:118;;;4622:36;4635:9;;4645:1;4635:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4649:1;4652:5;4622:12;:36::i;:::-;4594:3;;;;;:::i;:::-;;;;4552:118;;;;4300:377:::0;;;:::o;437:47::-;;;;;;;;;;;;;;;;;:::o;634:49::-;;;;;;;;;;;;;;;;;:::o;493:32::-;;;;;;;;;;;;;:::o;4580:164:5:-;4677:4;4701:18;:25;4720:5;4701:25;;;;;;;;;;;;;;;:35;4727:8;4701:35;;;;;;;;;;;;;;;;;;;;;;;;;4694:42;;4580:164;;;;:::o;3454:408:13:-;1294:12:14;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3634:9:13::1;3629:226;3653:6;;:13;;3649:1;:17;3629:226;;;3715:14;;3730:1;3715:17;;;;;;;:::i;:::-;;;;;;;;3688:13;:24;3702:6;;3709:1;3702:9;;;;;;;:::i;:::-;;;;;;;;3688:24;;;;;;;;;;;:44;;;;3775:15;;3791:1;3775:18;;;;;;;:::i;:::-;;;;;;;;3747:14;:25;3762:6;;3769:1;3762:9;;;;;;;:::i;:::-;;;;;;;;3747:25;;;;;;;;;;;:46;;;;3833:7;;3841:1;3833:10;;;;;;;:::i;:::-;;;;;;;;3808:11;:22;3820:6;;3827:1;3820:9;;;;;;;:::i;:::-;;;;;;;;3808:22;;;;;;;;;;;:35;;;;3668:3;;;;;:::i;:::-;;;;3629:226;;;;3454:408:::0;;;;;;;;:::o;1972:201:14:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;;;2053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;854:157:4:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;7315:127:5:-;7380:4;7432:1;7404:30;;:7;:16;7412:7;7404:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7397:37;;7315:127;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;11461:174:5:-;11563:2;11536:15;:24;11552:7;11536:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11619:7;11615:2;11581:46;;11590:23;11605:7;11590:14;:23::i;:::-;11581:46;;;;;;;;;;;;11461:174;;:::o;4015:232:13:-;4104:9;4099:141;4123:5;4119:1;:9;4099:141;;;4150:45;4156:2;4190:4;4185;4179:5;:10;;;;:::i;:::-;4160:9;:16;4170:5;4160:16;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;;;:::i;:::-;4150:5;:45::i;:::-;4210:9;:16;4220:5;4210:16;;;;;;;;;;;;:18;;;;;;;;;:::i;:::-;;;;;;4130:3;;;;;:::i;:::-;;;;4099:141;;;;4015:232;;;:::o;7609:348:5:-;7702:4;7727:16;7735:7;7727;:16::i;:::-;7719:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7803:13;7819:23;7834:7;7819:14;:23::i;:::-;7803:39;;7872:5;7861:16;;:7;:16;;;:51;;;;7905:7;7881:31;;:20;7893:7;7881:11;:20::i;:::-;:31;;;7861:51;:87;;;;7916:32;7933:5;7940:7;7916:16;:32::i;:::-;7861:87;7853:96;;;7609:348;;;;:::o;10718:625::-;10877:4;10850:31;;:23;10865:7;10850:14;:23::i;:::-;:31;;;10842:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10956:1;10942:16;;:2;:16;;;;10934:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11012:39;11033:4;11039:2;11043:7;11012:20;:39::i;:::-;11116:29;11133:1;11137:7;11116:8;:29::i;:::-;11177:1;11158:9;:15;11168:4;11158:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11206:1;11189:9;:13;11199:2;11189:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11237:2;11218:7;:16;11226:7;11218:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11276:7;11272:2;11257:27;;11266:4;11257:27;;;;;;;;;;;;11297:38;11317:4;11323:2;11327:7;11297:19;:38::i;:::-;10718:625;;;:::o;2333:191:14:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;11777:315:5:-;11932:8;11923:17;;:5;:17;;;;11915:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;12019:8;11981:18;:25;12000:5;11981:25;;;;;;;;;;;;;;;:35;12007:8;11981:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12065:8;12043:41;;12058:5;12043:41;;;12075:8;12043:41;;;;;;:::i;:::-;;;;;;;;11777:315;;;:::o;6687:::-;6844:28;6854:4;6860:2;6864:7;6844:9;:28::i;:::-;6891:48;6914:4;6920:2;6924:7;6933:5;6891:22;:48::i;:::-;6883:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6687:315;;;;:::o;1663:100:13:-;1715:13;1748:7;1741:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1663:100;:::o;342:723:15:-;398:13;628:1;619:5;:10;615:53;;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;9293:439:5:-;9387:1;9373:16;;:2;:16;;;;9365:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9446:16;9454:7;9446;:16::i;:::-;9445:17;9437:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9508:45;9537:1;9541:2;9545:7;9508:20;:45::i;:::-;9583:1;9566:9;:13;9576:2;9566:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9614:2;9595:7;:16;9603:7;9595:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9659:7;9655:2;9634:33;;9651:1;9634:33;;;;;;;;;;;;9680:44;9708:1;9712:2;9716:7;9680:19;:44::i;:::-;9293:439;;:::o;14028:126::-;;;;:::o;14539:125::-;;;;:::o;12657:799::-;12812:4;12833:15;:2;:13;;;:15::i;:::-;12829:620;;;12885:2;12869:36;;;12906:12;:10;:12::i;:::-;12920:4;12926:7;12935:5;12869:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12865:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13128:1;13111:6;:13;:18;13107:272;;;13154:60;;;;;;;;;;:::i;:::-;;;;;;;;13107:272;13329:6;13323:13;13314:6;13310:2;13306:15;13299:38;12865:529;13002:41;;;12992:51;;;:6;:51;;;;12985:58;;;;;12829:620;13433:4;13426:11;;12657:799;;;;;;;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5324:568;5397:8;5407:6;5457:3;5450:4;5442:6;5438:17;5434:27;5424:122;;5465:79;;:::i;:::-;5424:122;5578:6;5565:20;5555:30;;5608:18;5600:6;5597:30;5594:117;;;5630:79;;:::i;:::-;5594:117;5744:4;5736:6;5732:17;5720:29;;5798:3;5790:4;5782:6;5778:17;5768:8;5764:32;5761:41;5758:128;;;5805:79;;:::i;:::-;5758:128;5324:568;;;;;:::o;5915:::-;5988:8;5998:6;6048:3;6041:4;6033:6;6029:17;6025:27;6015:122;;6056:79;;:::i;:::-;6015:122;6169:6;6156:20;6146:30;;6199:18;6191:6;6188:30;6185:117;;;6221:79;;:::i;:::-;6185:117;6335:4;6327:6;6323:17;6311:29;;6389:3;6381:4;6373:6;6369:17;6359:8;6355:32;6352:41;6349:128;;;6396:79;;:::i;:::-;6349:128;5915:568;;;;;:::o;6489:1309::-;6647:6;6655;6663;6671;6679;6687;6736:2;6724:9;6715:7;6711:23;6707:32;6704:119;;;6742:79;;:::i;:::-;6704:119;6890:1;6879:9;6875:17;6862:31;6920:18;6912:6;6909:30;6906:117;;;6942:79;;:::i;:::-;6906:117;7055:80;7127:7;7118:6;7107:9;7103:22;7055:80;:::i;:::-;7037:98;;;;6833:312;7212:2;7201:9;7197:18;7184:32;7243:18;7235:6;7232:30;7229:117;;;7265:79;;:::i;:::-;7229:117;7378:80;7450:7;7441:6;7430:9;7426:22;7378:80;:::i;:::-;7360:98;;;;7155:313;7535:2;7524:9;7520:18;7507:32;7566:18;7558:6;7555:30;7552:117;;;7588:79;;:::i;:::-;7552:117;7701:80;7773:7;7764:6;7753:9;7749:22;7701:80;:::i;:::-;7683:98;;;;7478:313;6489:1309;;;;;;;;:::o;7804:474::-;7872:6;7880;7929:2;7917:9;7908:7;7904:23;7900:32;7897:119;;;7935:79;;:::i;:::-;7897:119;8055:1;8080:53;8125:7;8116:6;8105:9;8101:22;8080:53;:::i;:::-;8070:63;;8026:117;8182:2;8208:53;8253:7;8244:6;8233:9;8229:22;8208:53;:::i;:::-;8198:63;;8153:118;7804:474;;;;;:::o;8284:619::-;8361:6;8369;8377;8426:2;8414:9;8405:7;8401:23;8397:32;8394:119;;;8432:79;;:::i;:::-;8394:119;8552:1;8577:53;8622:7;8613:6;8602:9;8598:22;8577:53;:::i;:::-;8567:63;;8523:117;8679:2;8705:53;8750:7;8741:6;8730:9;8726:22;8705:53;:::i;:::-;8695:63;;8650:118;8807:2;8833:53;8878:7;8869:6;8858:9;8854:22;8833:53;:::i;:::-;8823:63;;8778:118;8284:619;;;;;:::o;8909:118::-;8996:24;9014:5;8996:24;:::i;:::-;8991:3;8984:37;8909:118;;:::o;9033:222::-;9126:4;9164:2;9153:9;9149:18;9141:26;;9177:71;9245:1;9234:9;9230:17;9221:6;9177:71;:::i;:::-;9033:222;;;;:::o;9261:329::-;9320:6;9369:2;9357:9;9348:7;9344:23;9340:32;9337:119;;;9375:79;;:::i;:::-;9337:119;9495:1;9520:53;9565:7;9556:6;9545:9;9541:22;9520:53;:::i;:::-;9510:63;;9466:117;9261:329;;;;:::o;9596:117::-;9705:1;9702;9695:12;9719:180;9767:77;9764:1;9757:88;9864:4;9861:1;9854:15;9888:4;9885:1;9878:15;9905:281;9988:27;10010:4;9988:27;:::i;:::-;9980:6;9976:40;10118:6;10106:10;10103:22;10082:18;10070:10;10067:34;10064:62;10061:88;;;10129:18;;:::i;:::-;10061:88;10169:10;10165:2;10158:22;9948:238;9905:281;;:::o;10192:129::-;10226:6;10253:20;;:::i;:::-;10243:30;;10282:33;10310:4;10302:6;10282:33;:::i;:::-;10192:129;;;:::o;10327:308::-;10389:4;10479:18;10471:6;10468:30;10465:56;;;10501:18;;:::i;:::-;10465:56;10539:29;10561:6;10539:29;:::i;:::-;10531:37;;10623:4;10617;10613:15;10605:23;;10327:308;;;:::o;10641:154::-;10725:6;10720:3;10715;10702:30;10787:1;10778:6;10773:3;10769:16;10762:27;10641:154;;;:::o;10801:412::-;10879:5;10904:66;10920:49;10962:6;10920:49;:::i;:::-;10904:66;:::i;:::-;10895:75;;10993:6;10986:5;10979:21;11031:4;11024:5;11020:16;11069:3;11060:6;11055:3;11051:16;11048:25;11045:112;;;11076:79;;:::i;:::-;11045:112;11166:41;11200:6;11195:3;11190;11166:41;:::i;:::-;10885:328;10801:412;;;;;:::o;11233:340::-;11289:5;11338:3;11331:4;11323:6;11319:17;11315:27;11305:122;;11346:79;;:::i;:::-;11305:122;11463:6;11450:20;11488:79;11563:3;11555:6;11548:4;11540:6;11536:17;11488:79;:::i;:::-;11479:88;;11295:278;11233:340;;;;:::o;11579:509::-;11648:6;11697:2;11685:9;11676:7;11672:23;11668:32;11665:119;;;11703:79;;:::i;:::-;11665:119;11851:1;11840:9;11836:17;11823:31;11881:18;11873:6;11870:30;11867:117;;;11903:79;;:::i;:::-;11867:117;12008:63;12063:7;12054:6;12043:9;12039:22;12008:63;:::i;:::-;11998:73;;11794:287;11579:509;;;;:::o;12094:116::-;12164:21;12179:5;12164:21;:::i;:::-;12157:5;12154:32;12144:60;;12200:1;12197;12190:12;12144:60;12094:116;:::o;12216:133::-;12259:5;12297:6;12284:20;12275:29;;12313:30;12337:5;12313:30;:::i;:::-;12216:133;;;;:::o;12355:468::-;12420:6;12428;12477:2;12465:9;12456:7;12452:23;12448:32;12445:119;;;12483:79;;:::i;:::-;12445:119;12603:1;12628:53;12673:7;12664:6;12653:9;12649:22;12628:53;:::i;:::-;12618:63;;12574:117;12730:2;12756:50;12798:7;12789:6;12778:9;12774:22;12756:50;:::i;:::-;12746:60;;12701:115;12355:468;;;;;:::o;12829:60::-;12857:3;12878:5;12871:12;;12829:60;;;:::o;12895:142::-;12945:9;12978:53;12996:34;13005:24;13023:5;13005:24;:::i;:::-;12996:34;:::i;:::-;12978:53;:::i;:::-;12965:66;;12895:142;;;:::o;13043:126::-;13093:9;13126:37;13157:5;13126:37;:::i;:::-;13113:50;;13043:126;;;:::o;13175:150::-;13249:9;13282:37;13313:5;13282:37;:::i;:::-;13269:50;;13175:150;;;:::o;13331:179::-;13442:61;13497:5;13442:61;:::i;:::-;13437:3;13430:74;13331:179;;:::o;13516:270::-;13633:4;13671:2;13660:9;13656:18;13648:26;;13684:95;13776:1;13765:9;13761:17;13752:6;13684:95;:::i;:::-;13516:270;;;;:::o;13792:307::-;13853:4;13943:18;13935:6;13932:30;13929:56;;;13965:18;;:::i;:::-;13929:56;14003:29;14025:6;14003:29;:::i;:::-;13995:37;;14087:4;14081;14077:15;14069:23;;13792:307;;;:::o;14105:410::-;14182:5;14207:65;14223:48;14264:6;14223:48;:::i;:::-;14207:65;:::i;:::-;14198:74;;14295:6;14288:5;14281:21;14333:4;14326:5;14322:16;14371:3;14362:6;14357:3;14353:16;14350:25;14347:112;;;14378:79;;:::i;:::-;14347:112;14468:41;14502:6;14497:3;14492;14468:41;:::i;:::-;14188:327;14105:410;;;;;:::o;14534:338::-;14589:5;14638:3;14631:4;14623:6;14619:17;14615:27;14605:122;;14646:79;;:::i;:::-;14605:122;14763:6;14750:20;14788:78;14862:3;14854:6;14847:4;14839:6;14835:17;14788:78;:::i;:::-;14779:87;;14595:277;14534:338;;;;:::o;14878:943::-;14973:6;14981;14989;14997;15046:3;15034:9;15025:7;15021:23;15017:33;15014:120;;;15053:79;;:::i;:::-;15014:120;15173:1;15198:53;15243:7;15234:6;15223:9;15219:22;15198:53;:::i;:::-;15188:63;;15144:117;15300:2;15326:53;15371:7;15362:6;15351:9;15347:22;15326:53;:::i;:::-;15316:63;;15271:118;15428:2;15454:53;15499:7;15490:6;15479:9;15475:22;15454:53;:::i;:::-;15444:63;;15399:118;15584:2;15573:9;15569:18;15556:32;15615:18;15607:6;15604:30;15601:117;;;15637:79;;:::i;:::-;15601:117;15742:62;15796:7;15787:6;15776:9;15772:22;15742:62;:::i;:::-;15732:72;;15527:287;14878:943;;;;;;;:::o;15827:704::-;15922:6;15930;15938;15987:2;15975:9;15966:7;15962:23;15958:32;15955:119;;;15993:79;;:::i;:::-;15955:119;16113:1;16138:53;16183:7;16174:6;16163:9;16159:22;16138:53;:::i;:::-;16128:63;;16084:117;16268:2;16257:9;16253:18;16240:32;16299:18;16291:6;16288:30;16285:117;;;16321:79;;:::i;:::-;16285:117;16434:80;16506:7;16497:6;16486:9;16482:22;16434:80;:::i;:::-;16416:98;;;;16211:313;15827:704;;;;;:::o;16537:474::-;16605:6;16613;16662:2;16650:9;16641:7;16637:23;16633:32;16630:119;;;16668:79;;:::i;:::-;16630:119;16788:1;16813:53;16858:7;16849:6;16838:9;16834:22;16813:53;:::i;:::-;16803:63;;16759:117;16915:2;16941:53;16986:7;16977:6;16966:9;16962:22;16941:53;:::i;:::-;16931:63;;16886:118;16537:474;;;;;:::o;17017:1685::-;17211:6;17219;17227;17235;17243;17251;17259;17267;17316:3;17304:9;17295:7;17291:23;17287:33;17284:120;;;17323:79;;:::i;:::-;17284:120;17471:1;17460:9;17456:17;17443:31;17501:18;17493:6;17490:30;17487:117;;;17523:79;;:::i;:::-;17487:117;17636:80;17708:7;17699:6;17688:9;17684:22;17636:80;:::i;:::-;17618:98;;;;17414:312;17793:2;17782:9;17778:18;17765:32;17824:18;17816:6;17813:30;17810:117;;;17846:79;;:::i;:::-;17810:117;17959:80;18031:7;18022:6;18011:9;18007:22;17959:80;:::i;:::-;17941:98;;;;17736:313;18116:2;18105:9;18101:18;18088:32;18147:18;18139:6;18136:30;18133:117;;;18169:79;;:::i;:::-;18133:117;18282:80;18354:7;18345:6;18334:9;18330:22;18282:80;:::i;:::-;18264:98;;;;18059:313;18439:2;18428:9;18424:18;18411:32;18470:18;18462:6;18459:30;18456:117;;;18492:79;;:::i;:::-;18456:117;18605:80;18677:7;18668:6;18657:9;18653:22;18605:80;:::i;:::-;18587:98;;;;18382:313;17017:1685;;;;;;;;;;;:::o;18708:180::-;18756:77;18753:1;18746:88;18853:4;18850:1;18843:15;18877:4;18874:1;18867:15;18894:320;18938:6;18975:1;18969:4;18965:12;18955:22;;19022:1;19016:4;19012:12;19043:18;19033:81;;19099:4;19091:6;19087:17;19077:27;;19033:81;19161:2;19153:6;19150:14;19130:18;19127:38;19124:84;;;19180:18;;:::i;:::-;19124:84;18945:269;18894:320;;;:::o;19220:231::-;19360:34;19356:1;19348:6;19344:14;19337:58;19429:14;19424:2;19416:6;19412:15;19405:39;19220:231;:::o;19457:366::-;19599:3;19620:67;19684:2;19679:3;19620:67;:::i;:::-;19613:74;;19696:93;19785:3;19696:93;:::i;:::-;19814:2;19809:3;19805:12;19798:19;;19457:366;;;:::o;19829:419::-;19995:4;20033:2;20022:9;20018:18;20010:26;;20082:9;20076:4;20072:20;20068:1;20057:9;20053:17;20046:47;20110:131;20236:4;20110:131;:::i;:::-;20102:139;;19829:419;;;:::o;20254:220::-;20394:34;20390:1;20382:6;20378:14;20371:58;20463:3;20458:2;20450:6;20446:15;20439:28;20254:220;:::o;20480:366::-;20622:3;20643:67;20707:2;20702:3;20643:67;:::i;:::-;20636:74;;20719:93;20808:3;20719:93;:::i;:::-;20837:2;20832:3;20828:12;20821:19;;20480:366;;;:::o;20852:419::-;21018:4;21056:2;21045:9;21041:18;21033:26;;21105:9;21099:4;21095:20;21091:1;21080:9;21076:17;21069:47;21133:131;21259:4;21133:131;:::i;:::-;21125:139;;20852:419;;;:::o;21277:243::-;21417:34;21413:1;21405:6;21401:14;21394:58;21486:26;21481:2;21473:6;21469:15;21462:51;21277:243;:::o;21526:366::-;21668:3;21689:67;21753:2;21748:3;21689:67;:::i;:::-;21682:74;;21765:93;21854:3;21765:93;:::i;:::-;21883:2;21878:3;21874:12;21867:19;;21526:366;;;:::o;21898:419::-;22064:4;22102:2;22091:9;22087:18;22079:26;;22151:9;22145:4;22141:20;22137:1;22126:9;22122:17;22115:47;22179:131;22305:4;22179:131;:::i;:::-;22171:139;;21898:419;;;:::o;22323:182::-;22463:34;22459:1;22451:6;22447:14;22440:58;22323:182;:::o;22511:366::-;22653:3;22674:67;22738:2;22733:3;22674:67;:::i;:::-;22667:74;;22750:93;22839:3;22750:93;:::i;:::-;22868:2;22863:3;22859:12;22852:19;;22511:366;;;:::o;22883:419::-;23049:4;23087:2;23076:9;23072:18;23064:26;;23136:9;23130:4;23126:20;23122:1;23111:9;23107:17;23100:47;23164:131;23290:4;23164:131;:::i;:::-;23156:139;;22883:419;;;:::o;23308:160::-;23448:12;23444:1;23436:6;23432:14;23425:36;23308:160;:::o;23474:366::-;23616:3;23637:67;23701:2;23696:3;23637:67;:::i;:::-;23630:74;;23713:93;23802:3;23713:93;:::i;:::-;23831:2;23826:3;23822:12;23815:19;;23474:366;;;:::o;23846:419::-;24012:4;24050:2;24039:9;24035:18;24027:26;;24099:9;24093:4;24089:20;24085:1;24074:9;24070:17;24063:47;24127:131;24253:4;24127:131;:::i;:::-;24119:139;;23846:419;;;:::o;24271:180::-;24319:77;24316:1;24309:88;24416:4;24413:1;24406:15;24440:4;24437:1;24430:15;24457:180;24505:77;24502:1;24495:88;24602:4;24599:1;24592:15;24626:4;24623:1;24616:15;24643:305;24683:3;24702:20;24720:1;24702:20;:::i;:::-;24697:25;;24736:20;24754:1;24736:20;:::i;:::-;24731:25;;24890:1;24822:66;24818:74;24815:1;24812:81;24809:107;;;24896:18;;:::i;:::-;24809:107;24940:1;24937;24933:9;24926:16;;24643:305;;;;:::o;24954:165::-;25094:17;25090:1;25082:6;25078:14;25071:41;24954:165;:::o;25125:366::-;25267:3;25288:67;25352:2;25347:3;25288:67;:::i;:::-;25281:74;;25364:93;25453:3;25364:93;:::i;:::-;25482:2;25477:3;25473:12;25466:19;;25125:366;;;:::o;25497:419::-;25663:4;25701:2;25690:9;25686:18;25678:26;;25750:9;25744:4;25740:20;25736:1;25725:9;25721:17;25714:47;25778:131;25904:4;25778:131;:::i;:::-;25770:139;;25497:419;;;:::o;25922:233::-;25961:3;25984:24;26002:5;25984:24;:::i;:::-;25975:33;;26030:66;26023:5;26020:77;26017:103;;;26100:18;;:::i;:::-;26017:103;26147:1;26140:5;26136:13;26129:20;;25922:233;;;:::o;26161:166::-;26301:18;26297:1;26289:6;26285:14;26278:42;26161:166;:::o;26333:366::-;26475:3;26496:67;26560:2;26555:3;26496:67;:::i;:::-;26489:74;;26572:93;26661:3;26572:93;:::i;:::-;26690:2;26685:3;26681:12;26674:19;;26333:366;;;:::o;26705:419::-;26871:4;26909:2;26898:9;26894:18;26886:26;;26958:9;26952:4;26948:20;26944:1;26933:9;26929:17;26922:47;26986:131;27112:4;26986:131;:::i;:::-;26978:139;;26705:419;;;:::o;27130:177::-;27270:29;27266:1;27258:6;27254:14;27247:53;27130:177;:::o;27313:366::-;27455:3;27476:67;27540:2;27535:3;27476:67;:::i;:::-;27469:74;;27552:93;27641:3;27552:93;:::i;:::-;27670:2;27665:3;27661:12;27654:19;;27313:366;;;:::o;27685:419::-;27851:4;27889:2;27878:9;27874:18;27866:26;;27938:9;27932:4;27928:20;27924:1;27913:9;27909:17;27902:47;27966:131;28092:4;27966:131;:::i;:::-;27958:139;;27685:419;;;:::o;28110:332::-;28231:4;28269:2;28258:9;28254:18;28246:26;;28282:71;28350:1;28339:9;28335:17;28326:6;28282:71;:::i;:::-;28363:72;28431:2;28420:9;28416:18;28407:6;28363:72;:::i;:::-;28110:332;;;;;:::o;28448:143::-;28505:5;28536:6;28530:13;28521:22;;28552:33;28579:5;28552:33;:::i;:::-;28448:143;;;;:::o;28597:351::-;28667:6;28716:2;28704:9;28695:7;28691:23;28687:32;28684:119;;;28722:79;;:::i;:::-;28684:119;28842:1;28867:64;28923:7;28914:6;28903:9;28899:22;28867:64;:::i;:::-;28857:74;;28813:128;28597:351;;;;:::o;28954:164::-;29094:16;29090:1;29082:6;29078:14;29071:40;28954:164;:::o;29124:366::-;29266:3;29287:67;29351:2;29346:3;29287:67;:::i;:::-;29280:74;;29363:93;29452:3;29363:93;:::i;:::-;29481:2;29476:3;29472:12;29465:19;;29124:366;;;:::o;29496:419::-;29662:4;29700:2;29689:9;29685:18;29677:26;;29749:9;29743:4;29739:20;29735:1;29724:9;29720:17;29713:47;29777:131;29903:4;29777:131;:::i;:::-;29769:139;;29496:419;;;:::o;29921:348::-;29961:7;29984:20;30002:1;29984:20;:::i;:::-;29979:25;;30018:20;30036:1;30018:20;:::i;:::-;30013:25;;30206:1;30138:66;30134:74;30131:1;30128:81;30123:1;30116:9;30109:17;30105:105;30102:131;;;30213:18;;:::i;:::-;30102:131;30261:1;30258;30254:9;30243:20;;29921:348;;;;:::o;30275:171::-;30415:23;30411:1;30403:6;30399:14;30392:47;30275:171;:::o;30452:366::-;30594:3;30615:67;30679:2;30674:3;30615:67;:::i;:::-;30608:74;;30691:93;30780:3;30691:93;:::i;:::-;30809:2;30804:3;30800:12;30793:19;;30452:366;;;:::o;30824:419::-;30990:4;31028:2;31017:9;31013:18;31005:26;;31077:9;31071:4;31067:20;31063:1;31052:9;31048:17;31041:47;31105:131;31231:4;31105:131;:::i;:::-;31097:139;;30824:419;;;:::o;31249:442::-;31398:4;31436:2;31425:9;31421:18;31413:26;;31449:71;31517:1;31506:9;31502:17;31493:6;31449:71;:::i;:::-;31530:72;31598:2;31587:9;31583:18;31574:6;31530:72;:::i;:::-;31612;31680:2;31669:9;31665:18;31656:6;31612:72;:::i;:::-;31249:442;;;;;;:::o;31697:164::-;31837:16;31833:1;31825:6;31821:14;31814:40;31697:164;:::o;31867:366::-;32009:3;32030:67;32094:2;32089:3;32030:67;:::i;:::-;32023:74;;32106:93;32195:3;32106:93;:::i;:::-;32224:2;32219:3;32215:12;32208:19;;31867:366;;;:::o;32239:419::-;32405:4;32443:2;32432:9;32428:18;32420:26;;32492:9;32486:4;32482:20;32478:1;32467:9;32463:17;32456:47;32520:131;32646:4;32520:131;:::i;:::-;32512:139;;32239:419;;;:::o;32664:236::-;32804:34;32800:1;32792:6;32788:14;32781:58;32873:19;32868:2;32860:6;32856:15;32849:44;32664:236;:::o;32906:366::-;33048:3;33069:67;33133:2;33128:3;33069:67;:::i;:::-;33062:74;;33145:93;33234:3;33145:93;:::i;:::-;33263:2;33258:3;33254:12;33247:19;;32906:366;;;:::o;33278:419::-;33444:4;33482:2;33471:9;33467:18;33459:26;;33531:9;33525:4;33521:20;33517:1;33506:9;33502:17;33495:47;33559:131;33685:4;33559:131;:::i;:::-;33551:139;;33278:419;;;:::o;33703:162::-;33843:14;33839:1;33831:6;33827:14;33820:38;33703:162;:::o;33871:366::-;34013:3;34034:67;34098:2;34093:3;34034:67;:::i;:::-;34027:74;;34110:93;34199:3;34110:93;:::i;:::-;34228:2;34223:3;34219:12;34212:19;;33871:366;;;:::o;34243:419::-;34409:4;34447:2;34436:9;34432:18;34424:26;;34496:9;34490:4;34486:20;34482:1;34471:9;34467:17;34460:47;34524:131;34650:4;34524:131;:::i;:::-;34516:139;;34243:419;;;:::o;34668:180::-;34716:77;34713:1;34706:88;34813:4;34810:1;34803:15;34837:4;34834:1;34827:15;34854:185;34894:1;34911:20;34929:1;34911:20;:::i;:::-;34906:25;;34945:20;34963:1;34945:20;:::i;:::-;34940:25;;34984:1;34974:35;;34989:18;;:::i;:::-;34974:35;35031:1;35028;35024:9;35019:14;;34854:185;;;;:::o;35045:228::-;35185:34;35181:1;35173:6;35169:14;35162:58;35254:11;35249:2;35241:6;35237:15;35230:36;35045:228;:::o;35279:366::-;35421:3;35442:67;35506:2;35501:3;35442:67;:::i;:::-;35435:74;;35518:93;35607:3;35518:93;:::i;:::-;35636:2;35631:3;35627:12;35620:19;;35279:366;;;:::o;35651:419::-;35817:4;35855:2;35844:9;35840:18;35832:26;;35904:9;35898:4;35894:20;35890:1;35879:9;35875:17;35868:47;35932:131;36058:4;35932:131;:::i;:::-;35924:139;;35651:419;;;:::o;36076:229::-;36216:34;36212:1;36204:6;36200:14;36193:58;36285:12;36280:2;36272:6;36268:15;36261:37;36076:229;:::o;36311:366::-;36453:3;36474:67;36538:2;36533:3;36474:67;:::i;:::-;36467:74;;36550:93;36639:3;36550:93;:::i;:::-;36668:2;36663:3;36659:12;36652:19;;36311:366;;;:::o;36683:419::-;36849:4;36887:2;36876:9;36872:18;36864:26;;36936:9;36930:4;36926:20;36922:1;36911:9;36907:17;36900:47;36964:131;37090:4;36964:131;:::i;:::-;36956:139;;36683:419;;;:::o;37108:236::-;37248:34;37244:1;37236:6;37232:14;37225:58;37317:19;37312:2;37304:6;37300:15;37293:44;37108:236;:::o;37350:366::-;37492:3;37513:67;37577:2;37572:3;37513:67;:::i;:::-;37506:74;;37589:93;37678:3;37589:93;:::i;:::-;37707:2;37702:3;37698:12;37691:19;;37350:366;;;:::o;37722:419::-;37888:4;37926:2;37915:9;37911:18;37903:26;;37975:9;37969:4;37965:20;37961:1;37950:9;37946:17;37939:47;38003:131;38129:4;38003:131;:::i;:::-;37995:139;;37722:419;;;:::o;38147:148::-;38249:11;38286:3;38271:18;;38147:148;;;;:::o;38301:377::-;38407:3;38435:39;38468:5;38435:39;:::i;:::-;38490:89;38572:6;38567:3;38490:89;:::i;:::-;38483:96;;38588:52;38633:6;38628:3;38621:4;38614:5;38610:16;38588:52;:::i;:::-;38665:6;38660:3;38656:16;38649:23;;38411:267;38301:377;;;;:::o;38684:435::-;38864:3;38886:95;38977:3;38968:6;38886:95;:::i;:::-;38879:102;;38998:95;39089:3;39080:6;38998:95;:::i;:::-;38991:102;;39110:3;39103:10;;38684:435;;;;;:::o;39125:225::-;39265:34;39261:1;39253:6;39249:14;39242:58;39334:8;39329:2;39321:6;39317:15;39310:33;39125:225;:::o;39356:366::-;39498:3;39519:67;39583:2;39578:3;39519:67;:::i;:::-;39512:74;;39595:93;39684:3;39595:93;:::i;:::-;39713:2;39708:3;39704:12;39697:19;;39356:366;;;:::o;39728:419::-;39894:4;39932:2;39921:9;39917:18;39909:26;;39981:9;39975:4;39971:20;39967:1;39956:9;39952:17;39945:47;40009:131;40135:4;40009:131;:::i;:::-;40001:139;;39728:419;;;:::o;40153:191::-;40193:4;40213:20;40231:1;40213:20;:::i;:::-;40208:25;;40247:20;40265:1;40247:20;:::i;:::-;40242:25;;40286:1;40283;40280:8;40277:34;;;40291:18;;:::i;:::-;40277:34;40336:1;40333;40329:9;40321:17;;40153:191;;;;:::o;40350:231::-;40490:34;40486:1;40478:6;40474:14;40467:58;40559:14;40554:2;40546:6;40542:15;40535:39;40350:231;:::o;40587:366::-;40729:3;40750:67;40814:2;40809:3;40750:67;:::i;:::-;40743:74;;40826:93;40915:3;40826:93;:::i;:::-;40944:2;40939:3;40935:12;40928:19;;40587:366;;;:::o;40959:419::-;41125:4;41163:2;41152:9;41148:18;41140:26;;41212:9;41206:4;41202:20;41198:1;41187:9;41183:17;41176:47;41240:131;41366:4;41240:131;:::i;:::-;41232:139;;40959:419;;;:::o;41384:224::-;41524:34;41520:1;41512:6;41508:14;41501:58;41593:7;41588:2;41580:6;41576:15;41569:32;41384:224;:::o;41614:366::-;41756:3;41777:67;41841:2;41836:3;41777:67;:::i;:::-;41770:74;;41853:93;41942:3;41853:93;:::i;:::-;41971:2;41966:3;41962:12;41955:19;;41614:366;;;:::o;41986:419::-;42152:4;42190:2;42179:9;42175:18;42167:26;;42239:9;42233:4;42229:20;42225:1;42214:9;42210:17;42203:47;42267:131;42393:4;42267:131;:::i;:::-;42259:139;;41986:419;;;:::o;42411:223::-;42551:34;42547:1;42539:6;42535:14;42528:58;42620:6;42615:2;42607:6;42603:15;42596:31;42411:223;:::o;42640:366::-;42782:3;42803:67;42867:2;42862:3;42803:67;:::i;:::-;42796:74;;42879:93;42968:3;42879:93;:::i;:::-;42997:2;42992:3;42988:12;42981:19;;42640:366;;;:::o;43012:419::-;43178:4;43216:2;43205:9;43201:18;43193:26;;43265:9;43259:4;43255:20;43251:1;43240:9;43236:17;43229:47;43293:131;43419:4;43293:131;:::i;:::-;43285:139;;43012:419;;;:::o;43437:175::-;43577:27;43573:1;43565:6;43561:14;43554:51;43437:175;:::o;43618:366::-;43760:3;43781:67;43845:2;43840:3;43781:67;:::i;:::-;43774:74;;43857:93;43946:3;43857:93;:::i;:::-;43975:2;43970:3;43966:12;43959:19;;43618:366;;;:::o;43990:419::-;44156:4;44194:2;44183:9;44179:18;44171:26;;44243:9;44237:4;44233:20;44229:1;44218:9;44214:17;44207:47;44271:131;44397:4;44271:131;:::i;:::-;44263:139;;43990:419;;;:::o;44415:237::-;44555:34;44551:1;44543:6;44539:14;44532:58;44624:20;44619:2;44611:6;44607:15;44600:45;44415:237;:::o;44658:366::-;44800:3;44821:67;44885:2;44880:3;44821:67;:::i;:::-;44814:74;;44897:93;44986:3;44897:93;:::i;:::-;45015:2;45010:3;45006:12;44999:19;;44658:366;;;:::o;45030:419::-;45196:4;45234:2;45223:9;45219:18;45211:26;;45283:9;45277:4;45273:20;45269:1;45258:9;45254:17;45247:47;45311:131;45437:4;45311:131;:::i;:::-;45303:139;;45030:419;;;:::o;45455:176::-;45487:1;45504:20;45522:1;45504:20;:::i;:::-;45499:25;;45538:20;45556:1;45538:20;:::i;:::-;45533:25;;45577:1;45567:35;;45582:18;;:::i;:::-;45567:35;45623:1;45620;45616:9;45611:14;;45455:176;;;;:::o;45637:182::-;45777:34;45773:1;45765:6;45761:14;45754:58;45637:182;:::o;45825:366::-;45967:3;45988:67;46052:2;46047:3;45988:67;:::i;:::-;45981:74;;46064:93;46153:3;46064:93;:::i;:::-;46182:2;46177:3;46173:12;46166:19;;45825:366;;;:::o;46197:419::-;46363:4;46401:2;46390:9;46386:18;46378:26;;46450:9;46444:4;46440:20;46436:1;46425:9;46421:17;46414:47;46478:131;46604:4;46478:131;:::i;:::-;46470:139;;46197:419;;;:::o;46622:178::-;46762:30;46758:1;46750:6;46746:14;46739:54;46622:178;:::o;46806:366::-;46948:3;46969:67;47033:2;47028:3;46969:67;:::i;:::-;46962:74;;47045:93;47134:3;47045:93;:::i;:::-;47163:2;47158:3;47154:12;47147:19;;46806:366;;;:::o;47178:419::-;47344:4;47382:2;47371:9;47367:18;47359:26;;47431:9;47425:4;47421:20;47417:1;47406:9;47402:17;47395:47;47459:131;47585:4;47459:131;:::i;:::-;47451:139;;47178:419;;;:::o;47603:98::-;47654:6;47688:5;47682:12;47672:22;;47603:98;;;:::o;47707:168::-;47790:11;47824:6;47819:3;47812:19;47864:4;47859:3;47855:14;47840:29;;47707:168;;;;:::o;47881:360::-;47967:3;47995:38;48027:5;47995:38;:::i;:::-;48049:70;48112:6;48107:3;48049:70;:::i;:::-;48042:77;;48128:52;48173:6;48168:3;48161:4;48154:5;48150:16;48128:52;:::i;:::-;48205:29;48227:6;48205:29;:::i;:::-;48200:3;48196:39;48189:46;;47971:270;47881:360;;;;:::o;48247:640::-;48442:4;48480:3;48469:9;48465:19;48457:27;;48494:71;48562:1;48551:9;48547:17;48538:6;48494:71;:::i;:::-;48575:72;48643:2;48632:9;48628:18;48619:6;48575:72;:::i;:::-;48657;48725:2;48714:9;48710:18;48701:6;48657:72;:::i;:::-;48776:9;48770:4;48766:20;48761:2;48750:9;48746:18;48739:48;48804:76;48875:4;48866:6;48804:76;:::i;:::-;48796:84;;48247:640;;;;;;;:::o;48893:141::-;48949:5;48980:6;48974:13;48965:22;;48996:32;49022:5;48996:32;:::i;:::-;48893:141;;;;:::o;49040:349::-;49109:6;49158:2;49146:9;49137:7;49133:23;49129:32;49126:119;;;49164:79;;:::i;:::-;49126:119;49284:1;49309:63;49364:7;49355:6;49344:9;49340:22;49309:63;:::i;:::-;49299:73;;49255:127;49040:349;;;;:::o

Swarm Source

ipfs://775416076ee4b8239d5547212c3ccab50dd1d5a8fb045273cfd35ffa0d0f726f
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.