ETH Price: $3,315.61 (-0.29%)
Gas: 11 Gwei

Token

Remarkable Moments (RemarkableMoments)
 

Overview

Max Total Supply

167 RemarkableMoments

Holders

103

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 RemarkableMoments
0x59e4EbD1ae283cdfE4c72dDF7C0a92D219C08e64
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RemarkableMoments

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 14 of 15: RemarkableMoments.sol
// SPDX-License-Identifier: GPL-3.0

// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHF        HOFHOFHOFHOF
// HOFHOFHOFHOF      HOF          HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF                   HOFHOFHOFHOF
// HOFHOFHOFHOF                   HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF

// -----------    House Of First   -----------
// ---------   Remarkable Moments   ----------

pragma solidity ^0.8.10;
import "./ERC721Enum.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";
import {MerkleProof} from "./MerkleProof.sol";

contract OwnableDelegateProxy {}

/**
 * used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract RemarkableMoments is ERC721Enum, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using MerkleProof for bytes32[];
    string public baseURI;
    
    //sale settings
    uint256 public SALE_START_TIMESTAMP = 1659142800; // time when sale starts - NOT FINAL VALUE - TBC
    uint256 public SALE_END_TIMESTAMP = SALE_START_TIMESTAMP + (86400 * 10); // time when sale ends - NOT FINAL VALUE - TBC
    uint256 public price = 0 ether; // NOT FINAL VALUE - TBC
    uint256 public maxSupply = 600; // max supply - NOT FINAL VALUE - TBC
    uint256 public reserved = 0; // 300 NFTs reserved for vault - NOT FINAL VALUE - TBC
    uint256 public maxPerTx = 100; // max per transaction - NOT FINAL VALUE - TBC
    uint256 public ambassadorAllowance = 2; // max per ambassador
    uint256 public allowancePerWallet = 600; // max mintable per wallet - NOT FINAL VALUE - TBC
    mapping(address => uint256) public purchases; // mapping of mints per address
    mapping(address => uint256) public ambassadorPurchases; // mapping of ambassador mints per address
    bool public signatureMode = false; // enable allowlist minting via signature
    bool public salePaused = false;
    bool public enableAmbassadorSale = false;
    bool public enableAllowlistSale = false;
    bool public enablePublicSale = false;

    address public ownerAddr;
    address public minter;

    // allowlist
    address public constant ALLOWLIST_SIGNER = 0x8430e0B7be3315735C303b82E4471D59AC152Aa5;
    
    string _name = "Remarkable Moments";
    string _symbol = "RemarkableMoments";
    string _initBaseURI = "https://houseoffirst.com:1335/remarkablemoments/opensea/";

    bytes32 public merkleRoot;

    address public proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; // OpenSea Mainnet Proxy Registry address
    
    constructor() ERC721P(_name, _symbol) {
        setBaseURI(_initBaseURI);
        ownerAddr = msg.sender;
        minter = msg.sender;
    }

    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }

    function getPurchases(address addr) external view returns (uint256) {
        return purchases[addr];
    }

    function getAmbassadorPurchases(address addr) external view returns (uint256) {
        return ambassadorPurchases[addr];
    }

    function getTotalPurchases(address addr) external view returns (uint256) {
        return purchases[addr] + ambassadorPurchases[addr];
    }
    
    function mintingHasStarted() public view returns (bool) {
        return block.timestamp > SALE_START_TIMESTAMP;
    }

    function mintingHasEnded() public view returns (bool) {
        return block.timestamp > SALE_END_TIMESTAMP;
    }

    function getMaxSupply() public view returns (uint256) {
        return maxSupply;
    }

    function getAvailableMaxSupply() public view returns (uint256) {
        return maxSupply - reserved;
    }

    function mintingIsActive() public view returns (bool) {
        bool timeOk = mintingHasStarted() && !mintingHasEnded();
        bool notSoldOut = _owners.length <= getAvailableMaxSupply();
        return timeOk && notSoldOut;
    }

    function getAllowancePerWallet() public view returns (uint256) {
        return allowancePerWallet;
    }
    
    function getNFTPrice() public view returns (uint256) {
        return price;
    }
    
    /* allowlist */
    function isAllowlisted(address user, bytes memory signature) public pure returns (bool) {
        bytes32 messageHash = keccak256(abi.encodePacked(user));
        bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
        return recoverSigner(ethSignedMessageHash, signature) == ALLOWLIST_SIGNER;
    }
    
    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }
    
    function splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
    }

    function _leaf(string memory allowance, string memory payload) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(payload, allowance));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    function getAllowance(string memory allowance, bytes32[] calldata proof) public view returns (string memory) {
        string memory payload = string(abi.encodePacked(msg.sender));
        require(_verify(_leaf(allowance, payload), proof), "Invalid Merkle Tree proof supplied.");
        return allowance;
    }

    //sets the minter address
    function setMinter(address _newMinter) public onlyOwner {
        minter = _newMinter;
    }

    /**
     * public mint nfts (no signature required)
     */
    function mintNFT(address recipient, uint256 numberOfNfts) public payable nonReentrant {
        require(!salePaused, "Minting paused");
        require(msg.sender == ownerAddr || msg.sender == minter, "only minter or owner account can call this");
        uint256 s = _owners.length;
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        purchases[recipient] += numberOfNfts;
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _mint(recipient, s + i);
        }
        delete s;
    }

    /**
     * admin minting for reserved nfts (callable by Owner only)
     */
    function giftNFT(uint256[] calldata quantity, address[] calldata recipient) external onlyOwner {
        require(quantity.length == recipient.length, "Invalid quantities and recipients (length mismatch)");
        uint256 totalQuantity = 0;
        uint256 s = _owners.length;
        for (uint256 i = 0; i < quantity.length; ++i) {
            totalQuantity += quantity[i];
        }
        require(s + totalQuantity <= maxSupply, "Exceeds Max Supply");
        require(totalQuantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= totalQuantity;
        delete totalQuantity;
        for (uint256 i = 0; i < recipient.length; ++i) {
            for (uint256 j = 0; j < quantity[i]; ++j) {
                _mint(recipient[i], s++);
            }
        }
        delete s;
    }

    /**
     * admin minting for reserved nfts - sets purchases[recipient] (callable by Owner only)
     */
    function giftNFTPurchases(uint256[] calldata quantity, address[] calldata recipient) external onlyOwner {
        require(quantity.length == recipient.length, "Invalid quantities and recipients (length mismatch)");
        uint256 totalQuantity = 0;
        uint256 s = _owners.length;
        for (uint256 i = 0; i < quantity.length; ++i) {
            totalQuantity += quantity[i];
        }
        require(s + totalQuantity <= maxSupply, "Exceeds Max Supply");
        require(totalQuantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= totalQuantity;
        delete totalQuantity;
        for (uint256 i = 0; i < recipient.length; ++i) {
            purchases[recipient[i]] += quantity[i];
            for (uint256 j = 0; j < quantity[i]; ++j) {
                _mint(recipient[i], s++);
            }
        }
        delete s;
    }

    /**
     * admin ambassador minting for reserved nfts (callable by Owner only)
     */
    function airdropToAmbassador(uint256 quantity, address recipient) external onlyOwner {
        require(ambassadorPurchases[recipient] + quantity <= ambassadorAllowance, "Exceeds ambassador allowance");
        uint256 s = _owners.length;
        require(s + quantity <= maxSupply, "Exceeds Max Supply");
        require(quantity <= reserved, "Exceeds Max Reserved");
        // update remaining reserved count
        reserved -= quantity;
        ambassadorPurchases[recipient] += quantity;
        for (uint256 i = 0; i < quantity; ++i) {
            _mint(recipient, s++);
        }
        delete s;
    }
    
    function _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }

    function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            transferFrom(_from, _to, _tokenIds[i]);
        }
    }

    function multiTransfer(uint256[] calldata tokenIds, address[] calldata recipient) external onlyOwner {
        require(tokenIds.length == recipient.length, "Invalid tokenIds and recipients (length mismatch)");
        for (uint256 i = 0; i < recipient.length; ++i) {
            for (uint256 j = 0; j < tokenIds[i]; ++j) {
                transferFrom(msg.sender, recipient[i], tokenIds[i]);
            }
        }
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
    }

    function setMerkleRoot(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }

    function setPurchases(address _addr, uint256 _purchases) public onlyOwner {
        purchases[_addr] = _purchases;
    }

    function setAmbassadorPurchases(address _addr, uint256 _purchases) public onlyOwner {
        ambassadorPurchases[_addr] = _purchases;
    }

    function setPrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }

    function setReserved(uint256 _reserved) public onlyOwner {
        reserved = _reserved;
    }

    function setMaxPerTx(uint256 _maxPerTx) public onlyOwner {
        maxPerTx = _maxPerTx;
    }

    function setAmbassadorAllowance(uint256 _newAllowance) public onlyOwner {
        ambassadorAllowance = _newAllowance;
    }

    function setAllowancePerWallet(uint256 _allowancePerWallet) public onlyOwner {
        allowancePerWallet = _allowancePerWallet;
    }

    function setMaxSupply(uint256 _newMaxSupply) public onlyOwner {
        maxSupply = _newMaxSupply;
    }

    /**
     * adjusts number of reserved nfts to psuedo limit supply (callable by Owner only)
     * example: if maxSupply = 10000 & supplyCap = 4000 then set reserved = 6000 (maxSupply - supplyCap)
     */
    function setSupplyCap(uint256 _supplyCap) public onlyOwner {
        require(_supplyCap <= maxSupply, "Supply cap exceeds max supply");
        reserved = maxSupply - _supplyCap;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setSalePaused(bool _salePaused) public onlyOwner {
        salePaused = _salePaused;
    }

    function setEnablePublicSale(bool _enablePublicSale) public onlyOwner {
        enablePublicSale = _enablePublicSale;
    }

    function setEnableAllowlistSale(bool _enableAllowlistSale) public onlyOwner {
        enableAllowlistSale = _enableAllowlistSale;
    }

    function setEnableAmbassadorSale(bool _enableAmbassadorSale) public onlyOwner {
        enableAmbassadorSale = _enableAmbassadorSale;
    }

    function setSignatureMode(bool _mode) public onlyOwner {
        signatureMode = _mode;
    }

    function setSaleStartTimestamp(uint256 _timestamp) public onlyOwner {
        SALE_START_TIMESTAMP = _timestamp;
    }

    function setSaleEndTimestamp(uint256 _timestamp) public onlyOwner {
        SALE_END_TIMESTAMP = _timestamp;
    }

    function setSaleStartEndTimestamp(uint256 _startTimestamp, uint256 _endTimestamp) public onlyOwner {
        setSaleStartTimestamp(_startTimestamp);
        setSaleEndTimestamp(_endTimestamp);
    }

    function setPhaseConfig(uint256 _startTimestamp, uint256 _endTimestamp, uint256 _maxPerTx, uint256 _allowancePerWallet, uint256 _supplyCap) public onlyOwner {
        setSaleStartEndTimestamp(_startTimestamp, _endTimestamp);
        setMaxPerTx(_maxPerTx);
        setAllowancePerWallet(_allowancePerWallet);
        setSupplyCap(_supplyCap);
    }

    function setFullPhaseConfig(uint256 _price, uint256 _allowancePerWallet, uint256 _maxPerTx, uint256 _supplyCap, uint256 _startTimestamp, uint256 _endTimestamp, bool _isPublic, bytes32 _merkleRoot) public onlyOwner {
        setPrice(_price);
        setAllowancePerWallet(_allowancePerWallet);
        setMaxPerTx(_maxPerTx);
        setSupplyCap(_supplyCap);
        setSaleStartEndTimestamp(_startTimestamp, _endTimestamp);
        setEnablePublicSale(_isPublic);
        setEnableAllowlistSale(!_isPublic);
        setMerkleRoot(_merkleRoot);
    }

    function getFullPhaseConfig() public view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, bytes32) {
        return (price, allowancePerWallet, maxPerTx, getAvailableMaxSupply(), SALE_START_TIMESTAMP, SALE_END_TIMESTAMP, enablePublicSale, merkleRoot);
    }

    // for transparency regarding ETH raised
    uint256 totalWithdrawn = 0;

    function getTotalWithdrawn() public view returns (uint256) {
        return totalWithdrawn;
    }

    function getTotalBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function getTotalRaised() public view returns (uint256) {
        return getTotalWithdrawn() + getTotalBalance();
    }

    /**
     * withdraw ETH from the contract (callable by Owner only)
     */
    function withdraw() public payable onlyOwner {
        uint256 val = address(this).balance;
        (bool success, ) = payable(msg.sender).call{
            value: val
        }("");
        require(success);
        totalWithdrawn += val;
        delete val;
    }
    /**
     * whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) override public view returns (bool) {
        // whitelist opensea proxy contract for easy trading
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 4 of 15: ERC721Enum.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;
import "./ERC721P.sol";
import "./IERC721Enumerable.sol";

abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721P)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256 tokenId)
    {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 count;
        for (uint256 i; i < _owners.length; ++i) {
            if (owner == _owners[i]) {
                if (count == index) return i;
                else ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

File 5 of 15: ERC721P.sol
// SPDX-License-Identifier: GPL-3.0

// Thank you to ToyBoogers & Pagzi Tech for the optimised ERC721
pragma solidity ^0.8.10;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    
    function getOwners() external view returns (address[] memory) {
        return _owners;
    }

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

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        uint256 count = 0;
        uint256 length = _owners.length;
        for (uint256 i = 0; i < length; ++i) {
            if (owner == _owners[i]) {
                ++count;
            }
        }
        delete length;
        return count;
    }

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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

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

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

    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);
        _owners.push(to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721P.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 7 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 8 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 9 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 10 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 12 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 13 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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":"ALLOWLIST_SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_END_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"airdropToAmbassador","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowancePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ambassadorAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ambassadorPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","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":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAllowlistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAmbassadorSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"allowance","type":"string"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"getAllowance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowancePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAmbassadorPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFullPhaseConfig","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTotalPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"giftNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"giftNFTPurchases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingHasEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddr","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"}],"name":"setAllowancePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAllowance","type":"uint256"}],"name":"setAmbassadorAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_purchases","type":"uint256"}],"name":"setAmbassadorPurchases","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableAllowlistSale","type":"bool"}],"name":"setEnableAllowlistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableAmbassadorSale","type":"bool"}],"name":"setEnableAmbassadorSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enablePublicSale","type":"bool"}],"name":"setEnablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"bool","name":"_isPublic","type":"bool"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setFullPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMinter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"_allowancePerWallet","type":"uint256"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setPhaseConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_purchases","type":"uint256"}],"name":"setPurchases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserved","type":"uint256"}],"name":"setReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_salePaused","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"setSaleStartEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setSaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mode","type":"bool"}],"name":"setSignatureMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"name":"setSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signatureMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526362e4829060088190556200001d90620d2f00620004f2565b6009556000600a819055610258600b819055600c919091556064600d556002600e55600f556012805464ffffffffff19168155604080518082019091528181527152656d61726b61626c65204d6f6d656e747360701b60209091019081526200008a91601491906200044c565b506040805180820190915260118082527052656d61726b61626c654d6f6d656e747360781b6020909201918252620000c5916015916200044c565b5060405180606001604052806038815260200162005462603891398051620000f6916016916020909101906200044c565b50601880546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c117905560006019553480156200012f57600080fd5b50601480546200013f9062000519565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000519565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b505050505060158054620001d29062000519565b80601f0160208091040260200160405190810160405280929190818152602001828054620002009062000519565b8015620002515780601f10620002255761010080835404028352916020019162000251565b820191906000526020600020905b8154815290600101906020018083116200023357829003601f168201915b505084516200026b9350600092506020860191506200044c565b508051620002819060019060208401906200044c565b5050506200029e620002986200037e60201b60201c565b62000382565b600160065560168054620003439190620002b89062000519565b80601f0160208091040260200160405190810160405280929190818152602001828054620002e69062000519565b8015620003375780601f106200030b5761010080835404028352916020019162000337565b820191906000526020600020905b8154815290600101906020018083116200031957829003601f168201915b5050620003d492505050565b60128054600160281b600160c81b0319163365010000000000810291909117909155601380546001600160a01b031916909117905562000556565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620004335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620004489060079060208401906200044c565b5050565b8280546200045a9062000519565b90600052602060002090601f0160209004810192826200047e5760008555620004c9565b82601f106200049957805160ff1916838001178555620004c9565b82800160010185558215620004c9579182015b82811115620004c9578251825591602001919060010190620004ac565b50620004d7929150620004db565b5090565b5b80821115620004d75760008155600101620004dc565b600082198211156200051457634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200052e57607f821691505b602082108114156200055057634e487b7160e01b600052602260045260246000fd5b50919050565b614efc80620005666000396000f3fe6080604052600436106105c05760003560e01c80637cb64759116102f6578063b6a3f59a1161018f578063d5abeb01116100e1578063f968adbe11610095578063fca3b5aa1161006f578063fca3b5aa14611060578063fe60d12c14611080578063ff8abd1f1461109657600080fd5b8063f968adbe14611015578063fb107a4f1461102b578063fc8cc4591461104057600080fd5b8063f2fde38b116100c6578063f2fde38b14610fbb578063f3993d1114610fdb578063f686788314610ffb57600080fd5b8063d5abeb0114610f85578063e985e9c514610f9b57600080fd5b8063c29af27411610143578063caca28ad1161011d578063caca28ad14610f21578063cd7c032614610f38578063d45a023714610f6557600080fd5b8063c29af27414610ec1578063c6f6f21614610ee1578063c87b56dd14610f0157600080fd5b8063badf8ec411610174578063badf8ec414610e6c578063c0d42d9614610e81578063c215600d14610ea157600080fd5b8063b6a3f59a14610e2c578063b88d4fde14610e4c57600080fd5b8063946807fd116102485780639f550293116101fc578063a22cb465116101d6578063a22cb46514610dbf578063a391f14d14610ddf578063ad7c039e14610e0c57600080fd5b80639f55029314610d72578063a035b1fe14610d87578063a0e67e2b14610d9d57600080fd5b80639c1472781161022d5780639c14727814610cd95780639c675eaa14610d1c5780639ca1ac8f14610d5257600080fd5b8063946807fd14610cae57806395d89b4114610cc457600080fd5b806389404a79116102aa5780638f5bbf1d116102845780638f5bbf1d14610c4e57806391b7f5ed14610c6e578063928d63a414610c8e57600080fd5b806389404a7914610bee5780638d92becd14610c035780638da5cb5b14610c2357600080fd5b806383fde87d116102db57806383fde87d14610b74578063842a77d314610b945780638462151c14610bc157600080fd5b80637cb6475914610b2c5780637e79c72314610b4c57600080fd5b80634210830d116104685780635ae1d8c8116103ba5780636c0360eb1161036e57806370cd5a801161034857806370cd5a8014610abf578063715018a614610b025780637666de7614610b1757600080fd5b80636c0360eb14610a6a5780636f8b44b014610a7f57806370a0823114610a9f57600080fd5b80635eb170061161039f5780635eb17006146109d85780636352211e14610a2a57806366fddfa914610a4a57600080fd5b80635ae1d8c8146109995780635d08c1ae146109b957600080fd5b80634c0f38c21161041c57806354964d27116103f657806354964d271461094257806355f804b31461095957806357591dfc1461097957600080fd5b80634c0f38c2146108ed5780634f6ccce71461090257806350cee2271461092257600080fd5b80634728b9f41161044d5780634728b9f414610897578063472efe38146108ac5780634be3ca0e146108cc57600080fd5b80634210830d1461086157806342842e0e1461087757600080fd5b806322299799116105215780632f745c59116104d55780633c168eab116104af5780633c168eab146108265780633ccfd60b146108395780633db82fb51461084157600080fd5b80632f745c59146107d05780632f9eca87146107f0578063371e6f991461081057600080fd5b806323b872dd1161050657806323b872dd1461077a5780632d6e71b61461079a5780632eb4a7ab146107ba57600080fd5b806322299799146107425780632316b4da1461075857600080fd5b80630bcecf291161057857806318160ddd1161055d57806318160ddd146106ed5780631ddf3a3714610702578063219c48821461072257600080fd5b80630bcecf29146106b057806312b58349146106d057600080fd5b806307546172116105a9578063075461721461061c578063081812fc1461066e578063095ea7b31461068e57600080fd5b806301ffc9a7146105c557806306fdde03146105fa575b600080fd5b3480156105d157600080fd5b506105e56105e0366004614535565b6110b6565b60405190151581526020015b60405180910390f35b34801561060657600080fd5b5061060f611112565b6040516105f191906145c8565b34801561062857600080fd5b506013546106499073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016105f1565b34801561067a57600080fd5b506106496106893660046145db565b6111a4565b34801561069a57600080fd5b506106ae6106a9366004614616565b61124f565b005b3480156106bc57600080fd5b506012546105e59062010000900460ff1681565b3480156106dc57600080fd5b50475b6040519081526020016105f1565b3480156106f957600080fd5b506002546106df565b34801561070e57600080fd5b506106ae61071d366004614616565b6113a8565b34801561072e57600080fd5b506106ae61073d366004614616565b611438565b34801561074e57600080fd5b506106df600f5481565b34801561076457600080fd5b506012546105e590640100000000900460ff1681565b34801561078657600080fd5b506106ae610795366004614642565b6114c8565b3480156107a657600080fd5b506106ae6107b53660046145db565b61154f565b3480156107c657600080fd5b506106df60175481565b3480156107dc57600080fd5b506106df6107eb366004614616565b6115bb565b3480156107fc57600080fd5b506106ae61080b3660046146cf565b6116d7565b34801561081c57600080fd5b506106df600e5481565b6106ae610834366004614616565b611852565b6106ae611a99565b34801561084d57600080fd5b506106ae61085c3660046145db565b611b72565b34801561086d57600080fd5b506106df60095481565b34801561088357600080fd5b506106ae610892366004614642565b611bde565b3480156108a357600080fd5b506105e5611bf9565b3480156108b857600080fd5b506106ae6108c7366004614750565b611c39565b3480156108d857600080fd5b506012546105e5906301000000900460ff1681565b3480156108f957600080fd5b50600b546106df565b34801561090e57600080fd5b506106df61091d3660046145db565b611cd1565b34801561092e57600080fd5b506105e561093d366004614877565b611d2e565b34801561094e57600080fd5b5060085442116105e5565b34801561096557600080fd5b506106ae6109743660046148c7565b611e00565b34801561098557600080fd5b506106ae610994366004614750565b611e7e565b3480156109a557600080fd5b506106ae6109b43660046148fc565b611f1d565b3480156109c557600080fd5b506012546105e590610100900460ff1681565b3480156109e457600080fd5b506109ed611fd8565b604080519889526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e0820152610100016105f1565b348015610a3657600080fd5b50610649610a453660046145db565b612024565b348015610a5657600080fd5b5061060f610a65366004614962565b6120d1565b348015610a7657600080fd5b5061060f6121e3565b348015610a8b57600080fd5b506106ae610a9a3660046145db565b612271565b348015610aab57600080fd5b506106df610aba3660046149cb565b6122dd565b348015610acb57600080fd5b506106df610ada3660046149cb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526010602052604090205490565b348015610b0e57600080fd5b506106ae6123dc565b348015610b2357600080fd5b506106df61244f565b348015610b3857600080fd5b506106ae610b473660046145db565b612466565b348015610b5857600080fd5b50610649738430e0b7be3315735c303b82e4471d59ac152aa581565b348015610b8057600080fd5b506106ae610b8f3660046149e8565b6124d2565b348015610ba057600080fd5b506106df610baf3660046149cb565b60106020526000908152604090205481565b348015610bcd57600080fd5b50610be1610bdc3660046149cb565b61255e565b6040516105f19190614a23565b348015610bfa57600080fd5b506019546106df565b348015610c0f57600080fd5b506106ae610c1e366004614750565b612658565b348015610c2f57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610649565b348015610c5a57600080fd5b506106ae610c69366004614a67565b6126f6565b348015610c7a57600080fd5b506106ae610c893660046145db565b612917565b348015610c9a57600080fd5b506106ae610ca9366004614750565b612983565b348015610cba57600080fd5b506106df60085481565b348015610cd057600080fd5b5061060f612a23565b348015610ce557600080fd5b506106df610cf43660046149cb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b348015610d2857600080fd5b506012546106499065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610d5e57600080fd5b506106ae610d6d3660046146cf565b612a32565b348015610d7e57600080fd5b506106df612d43565b348015610d9357600080fd5b506106df600a5481565b348015610da957600080fd5b50610db2612d53565b6040516105f19190614a97565b348015610dcb57600080fd5b506106ae610dda366004614ae5565b612dc1565b348015610deb57600080fd5b506106df610dfa3660046149cb565b60116020526000908152604090205481565b348015610e1857600080fd5b506106ae610e273660046145db565b612ebe565b348015610e3857600080fd5b506106ae610e473660046145db565b612f2a565b348015610e5857600080fd5b506106ae610e67366004614b1a565b612ff7565b348015610e7857600080fd5b50600f546106df565b348015610e8d57600080fd5b506106ae610e9c366004614b86565b61307f565b348015610ead57600080fd5b506106df610ebc3660046149cb565b6130f8565b348015610ecd57600080fd5b506106ae610edc3660046146cf565b613133565b348015610eed57600080fd5b506106ae610efc3660046145db565b613382565b348015610f0d57600080fd5b5061060f610f1c3660046145db565b6133ee565b348015610f2d57600080fd5b5060095442116105e5565b348015610f4457600080fd5b506018546106499073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f7157600080fd5b506106ae610f803660046145db565b6134c7565b348015610f9157600080fd5b506106df600b5481565b348015610fa757600080fd5b506105e5610fb6366004614ba8565b613533565b348015610fc757600080fd5b506106ae610fd63660046149cb565b613634565b348015610fe757600080fd5b506106ae610ff6366004614bd6565b613730565b34801561100757600080fd5b506012546105e59060ff1681565b34801561102157600080fd5b506106df600d5481565b34801561103757600080fd5b50600a546106df565b34801561104c57600080fd5b506106ae61105b366004614750565b613772565b34801561106c57600080fd5b506106ae61107b3660046149cb565b613813565b34801561108c57600080fd5b506106df600c5481565b3480156110a257600080fd5b506106ae6110b13660046145db565b6138c1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061110c575061110c8261392d565b92915050565b60606000805461112190614ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90614ca3565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b60006111af82613a10565b6112265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061125a82612024565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112fe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161121d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061132757506113278133613533565b6113995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161121d565b6113a38383613a74565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260106020526040902055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461149f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260116020526040902055565b6114d23382613b14565b6115445760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161121d565b6113a3838383613c1b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600c55565b60006115c6836122dd565b82106116145760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b6000805b60025481101561168e576002818154811061163557611635614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561167e578382141561167257915061110c9050565b61167b82614d55565b91505b61168781614d55565b9050611618565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b60055473ffffffffffffffffffffffffffffffffffffffff16331461173e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b8281146117b35760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420746f6b656e49647320616e6420726563697069656e74732060448201527f286c656e677468206d69736d6174636829000000000000000000000000000000606482015260840161121d565b60005b8181101561184b5760005b8585838181106117d3576117d3614cf7565b9050602002013581101561183a5761182a338585858181106117f7576117f7614cf7565b905060200201602081019061180c91906149cb565b88888681811061181e5761181e614cf7565b905060200201356114c8565b61183381614d55565b90506117c1565b5061184481614d55565b90506117b6565b5050505050565b600260065414156118a55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161121d565b6002600655601254610100900460ff16156119025760405162461bcd60e51b815260206004820152600e60248201527f4d696e74696e6720706175736564000000000000000000000000000000000000604482015260640161121d565b60125465010000000000900473ffffffffffffffffffffffffffffffffffffffff16331480611948575060135473ffffffffffffffffffffffffffffffffffffffff1633145b6119ba5760405162461bcd60e51b815260206004820152602a60248201527f6f6e6c79206d696e746572206f72206f776e6572206163636f756e742063616e60448201527f2063616c6c207468697300000000000000000000000000000000000000000000606482015260840161121d565b600254600c54600b546119cd9190614d8e565b6119d78383614da5565b1115611a255760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604081208054849290611a5a908490614da5565b90915550600090505b82811015611a8e57611a7e84611a798385614da5565b613dea565b611a8781614d55565b9050611a63565b505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6040514790600090339083908381818185875af1925050503d8060008114611b44576040519150601f19603f3d011682016040523d82523d6000602084013e611b49565b606091505b5050905080611b5757600080fd5b8160196000828254611b699190614da5565b90915550505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611bd95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600855565b6113a383838360405180602001604052806000815250612ff7565b600080611c07600854421190565b8015611c1557506009544211155b90506000611c2161244f565b60025411159050818015611c325750805b9250505090565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ca05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000611cdc60025490565b8210611d2a5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000604482015260640161121d565b5090565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190738430e0b7be3315735c303b82e4471d59ac152aa5611de08286613e8b565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611e675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b8051611e7a906007906020840190614477565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ee55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6012805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b611f8d88612917565b611f96876134c7565b611f9f86613382565b611fa885612f2a565b611fb2848461307f565b611fbb82613772565b611fc58215612983565b611fce81612466565b5050505050505050565b600080600080600080600080600a54600f54600d54611ff561244f565b600854600954601254601754969f959e50939c50919a5098509650640100000000900460ff1694509092509050565b6000806002838154811061203a5761203a614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061110c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161121d565b6060600033604051602001612111919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b604051602081830303815290604052905061216861212f8683613f28565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f5b92505050565b6121da5760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840161121d565b50929392505050565b600780546121f090614ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461221c90614ca3565b80156122695780601f1061223e57610100808354040283529160200191612269565b820191906000526020600020905b81548152906001019060200180831161224c57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600b55565b600073ffffffffffffffffffffffffffffffffffffffff82166123685760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161121d565b600254600090815b818110156123d3576002818154811061238b5761238b614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156123c3576123c083614d55565b92505b6123cc81614d55565b9050612370565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b61244d6000613f6a565b565b6000600c54600b546124619190614d8e565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601755565b60055473ffffffffffffffffffffffffffffffffffffffff1633146125395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b612543858561307f565b61254c83613382565b612555826134c7565b61184b81612f2a565b6060612569826122dd565b6000106125b85760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b60006125c3836122dd565b905060008167ffffffffffffffff8111156125e0576125e061476b565b604051908082528060200260200182016040528015612609578160200160208202803683370190505b50905060005b828110156126505761262185826115bb565b82828151811061263357612633614cf7565b60209081029190910101528061264881614d55565b91505061260f565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b60128054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461275d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600e5473ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054612791908490614da5565b11156127df5760405162461bcd60e51b815260206004820152601c60248201527f4578636565647320616d6261737361646f7220616c6c6f77616e636500000000604482015260640161121d565b600254600b546127ef8483614da5565b111561283d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c5483111561288f5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b82600c60008282546128a19190614d8e565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040812080548592906128db908490614da5565b90915550600090505b838110156129115761290183836128fa81614d55565b9450613dea565b61290a81614d55565b90506128e4565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461297e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600a55565b60055473ffffffffffffffffffffffffffffffffffffffff1633146129ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601280549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b60606001805461112190614ca3565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b828114612b0e5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d617463682900000000000000000000000000606482015260840161121d565b600254600090815b85811015612b5457868682818110612b3057612b30614cf7565b9050602002013583612b429190614da5565b9250612b4d81614d55565b9050612b16565b50600b54612b628383614da5565b1115612bb05760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c54821115612c025760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b81600c6000828254612c149190614d8e565b90915550600092508290505b83811015612d3a57868682818110612c3a57612c3a614cf7565b9050602002013560106000878785818110612c5757612c57614cf7565b9050602002016020810190612c6c91906149cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb59190614da5565b90915550600090505b878783818110612cd057612cd0614cf7565b90506020020135811015612d2957612d19868684818110612cf357612cf3614cf7565b9050602002016020810190612d0891906149cb565b84612d1281614d55565b9550613dea565b612d2281614d55565b9050612cbe565b50612d3381614d55565b9050612c20565b50505050505050565b6000476019546124619190614da5565b6060600280548060200260200160405190810160405280929190818152602001828054801561119a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d8d575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff8216331415612e275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161121d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600955565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600b54811115612fe35760405162461bcd60e51b815260206004820152601d60248201527f537570706c79206361702065786365656473206d617820737570706c79000000604482015260640161121d565b80600b54612ff19190614d8e565b600c5550565b6130013383613b14565b6130735760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161121d565b61291184848484613fe1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146130e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6130ef82611b72565b611e7a81612ebe565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260116020908152604080832054601090925282205461110c9190614da5565b60055473ffffffffffffffffffffffffffffffffffffffff16331461319a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b82811461320f5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d617463682900000000000000000000000000606482015260840161121d565b600254600090815b858110156132555786868281811061323157613231614cf7565b90506020020135836132439190614da5565b925061324e81614d55565b9050613217565b50600b546132638383614da5565b11156132b15760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c548211156133035760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b81600c60008282546133159190614d8e565b90915550600092508290505b83811015612d3a5760005b87878381811061333e5761333e614cf7565b9050602002013581101561337157613361868684818110612cf357612cf3614cf7565b61336a81614d55565b905061332c565b5061337b81614d55565b9050613321565b60055473ffffffffffffffffffffffffffffffffffffffff1633146133e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600d55565b60606133f982613a10565b61346b5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161121d565b600061347561406a565b9050600081511161349557604051806020016040528060008152506134c0565b8061349f84614079565b6040516020016134b0929190614dbd565b6040516020818303038152906040525b9392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461352e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600f55565b6018546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf9190614dec565b73ffffffffffffffffffffffffffffffffffffffff1614156135f557600191505061110c565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461369b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff81166137245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161121d565b61372d81613f6a565b50565b60005b815181101561291157613760848484848151811061375357613753614cf7565b60200260200101516114c8565b8061376a81614d55565b915050613733565b60055473ffffffffffffffffffffffffffffffffffffffff1633146137d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b60128054911515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461387a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146139285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806139c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061110c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461110c565b6002546000908210801561110c5750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110613a4a57613a4a614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190613ace82612024565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613b1f82613a10565b613b915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161121d565b6000613b9c83612024565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613c0b57508373ffffffffffffffffffffffffffffffffffffffff16613bf3846111a4565b73ffffffffffffffffffffffffffffffffffffffff16145b8061362c575061362c8185613533565b8273ffffffffffffffffffffffffffffffffffffffff16613c3b82612024565b73ffffffffffffffffffffffffffffffffffffffff1614613cc45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161121d565b73ffffffffffffffffffffffffffffffffffffffff8216613d4c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161121d565b613d57600082613a74565b8160028281548110613d6b57613d6b614cf7565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080600080613e9a856141ab565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015613ef5573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60008183604051602001613f3d929190614dbd565b60405160208183030381529060405280519060200120905092915050565b60006134c0826017548561421f565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613fec848484613c1b565b613ff884848484614235565b6129115760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161121d565b60606007805461112190614ca3565b6060816140b957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156140e357806140cd81614d55565b91506140dc9050600a83614e38565b91506140bd565b60008167ffffffffffffffff8111156140fe576140fe61476b565b6040519080825280601f01601f191660200182016040528015614128576020820181803683370190505b5090505b841561362c5761413d600183614d8e565b915061414a600a86614e4c565b614155906030614da5565b60f81b81838151811061416a5761416a614cf7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141a4600a86614e38565b945061412c565b600080600083516041146142015760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161121d565b50505060208101516040820151606090920151909260009190911a90565b60008261422c858461440b565b14949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15614400576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906142ac903390899088908890600401614e60565b6020604051808303816000875af1925050508015614305575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261430291810190614ea9565b60015b6143b5573d808015614333576040519150601f19603f3d011682016040523d82523d6000602084013e614338565b606091505b5080516143ad5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161121d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061362c565b506001949350505050565b600081815b845181101561265057600085828151811061442d5761442d614cf7565b602002602001015190508083116144535760008381526020829052604090209250614464565b600081815260208490526040902092505b508061446f81614d55565b915050614410565b82805461448390614ca3565b90600052602060002090601f0160209004810192826144a557600085556144eb565b82601f106144be57805160ff19168380011785556144eb565b828001600101855582156144eb579182015b828111156144eb5782518255916020019190600101906144d0565b50611d2a9291505b80821115611d2a57600081556001016144f3565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461372d57600080fd5b60006020828403121561454757600080fd5b81356134c081614507565b60005b8381101561456d578181015183820152602001614555565b838111156129115750506000910152565b60008151808452614596816020860160208601614552565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006134c0602083018461457e565b6000602082840312156145ed57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461372d57600080fd5b6000806040838503121561462957600080fd5b8235614634816145f4565b946020939093013593505050565b60008060006060848603121561465757600080fd5b8335614662816145f4565b92506020840135614672816145f4565b929592945050506040919091013590565b60008083601f84011261469557600080fd5b50813567ffffffffffffffff8111156146ad57600080fd5b6020830191508360208260051b85010111156146c857600080fd5b9250929050565b600080600080604085870312156146e557600080fd5b843567ffffffffffffffff808211156146fd57600080fd5b61470988838901614683565b9096509450602087013591508082111561472257600080fd5b5061472f87828801614683565b95989497509550505050565b8035801515811461474b57600080fd5b919050565b60006020828403121561476257600080fd5b6134c08261473b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147e1576147e161476b565b604052919050565b600082601f8301126147fa57600080fd5b813567ffffffffffffffff8111156148145761481461476b565b61484560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161479a565b81815284602083860101111561485a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561488a57600080fd5b8235614895816145f4565b9150602083013567ffffffffffffffff8111156148b157600080fd5b6148bd858286016147e9565b9150509250929050565b6000602082840312156148d957600080fd5b813567ffffffffffffffff8111156148f057600080fd5b61362c848285016147e9565b600080600080600080600080610100898b03121561491957600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925061494c60c08a0161473b565b915060e089013590509295985092959890939650565b60008060006040848603121561497757600080fd5b833567ffffffffffffffff8082111561498f57600080fd5b61499b878388016147e9565b945060208601359150808211156149b157600080fd5b506149be86828701614683565b9497909650939450505050565b6000602082840312156149dd57600080fd5b81356134c0816145f4565b600080600080600060a08688031215614a0057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6020808252825182820181905260009190848201906040850190845b81811015614a5b57835183529284019291840191600101614a3f565b50909695505050505050565b60008060408385031215614a7a57600080fd5b823591506020830135614a8c816145f4565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614a5b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614ab3565b60008060408385031215614af857600080fd5b8235614b03816145f4565b9150614b116020840161473b565b90509250929050565b60008060008060808587031215614b3057600080fd5b8435614b3b816145f4565b93506020850135614b4b816145f4565b925060408501359150606085013567ffffffffffffffff811115614b6e57600080fd5b614b7a878288016147e9565b91505092959194509250565b60008060408385031215614b9957600080fd5b50508035926020909101359150565b60008060408385031215614bbb57600080fd5b8235614bc6816145f4565b91506020830135614a8c816145f4565b600080600060608486031215614beb57600080fd5b8335614bf6816145f4565b9250602084810135614c07816145f4565b9250604085013567ffffffffffffffff80821115614c2457600080fd5b818701915087601f830112614c3857600080fd5b813581811115614c4a57614c4a61476b565b8060051b9150614c5b84830161479a565b818152918301840191848101908a841115614c7557600080fd5b938501935b83851015614c9357843582529385019390850190614c7a565b8096505050505050509250925092565b600181811c90821680614cb757607f821691505b60208210811415614cf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8757614d87614d26565b5060010190565b600082821015614da057614da0614d26565b500390565b60008219821115614db857614db8614d26565b500190565b60008351614dcf818460208801614552565b835190830190614de3818360208801614552565b01949350505050565b600060208284031215614dfe57600080fd5b81516134c0816145f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614e4757614e47614e09565b500490565b600082614e5b57614e5b614e09565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614e9f608083018461457e565b9695505050505050565b600060208284031215614ebb57600080fd5b81516134c08161450756fea2646970667358221220040aa189c2f82b0721fee0c1c7e66e0019746936b7163b3f0d155155db511b9364736f6c634300080a003368747470733a2f2f686f7573656f6666697273742e636f6d3a313333352f72656d61726b61626c656d6f6d656e74732f6f70656e7365612f

Deployed Bytecode

0x6080604052600436106105c05760003560e01c80637cb64759116102f6578063b6a3f59a1161018f578063d5abeb01116100e1578063f968adbe11610095578063fca3b5aa1161006f578063fca3b5aa14611060578063fe60d12c14611080578063ff8abd1f1461109657600080fd5b8063f968adbe14611015578063fb107a4f1461102b578063fc8cc4591461104057600080fd5b8063f2fde38b116100c6578063f2fde38b14610fbb578063f3993d1114610fdb578063f686788314610ffb57600080fd5b8063d5abeb0114610f85578063e985e9c514610f9b57600080fd5b8063c29af27411610143578063caca28ad1161011d578063caca28ad14610f21578063cd7c032614610f38578063d45a023714610f6557600080fd5b8063c29af27414610ec1578063c6f6f21614610ee1578063c87b56dd14610f0157600080fd5b8063badf8ec411610174578063badf8ec414610e6c578063c0d42d9614610e81578063c215600d14610ea157600080fd5b8063b6a3f59a14610e2c578063b88d4fde14610e4c57600080fd5b8063946807fd116102485780639f550293116101fc578063a22cb465116101d6578063a22cb46514610dbf578063a391f14d14610ddf578063ad7c039e14610e0c57600080fd5b80639f55029314610d72578063a035b1fe14610d87578063a0e67e2b14610d9d57600080fd5b80639c1472781161022d5780639c14727814610cd95780639c675eaa14610d1c5780639ca1ac8f14610d5257600080fd5b8063946807fd14610cae57806395d89b4114610cc457600080fd5b806389404a79116102aa5780638f5bbf1d116102845780638f5bbf1d14610c4e57806391b7f5ed14610c6e578063928d63a414610c8e57600080fd5b806389404a7914610bee5780638d92becd14610c035780638da5cb5b14610c2357600080fd5b806383fde87d116102db57806383fde87d14610b74578063842a77d314610b945780638462151c14610bc157600080fd5b80637cb6475914610b2c5780637e79c72314610b4c57600080fd5b80634210830d116104685780635ae1d8c8116103ba5780636c0360eb1161036e57806370cd5a801161034857806370cd5a8014610abf578063715018a614610b025780637666de7614610b1757600080fd5b80636c0360eb14610a6a5780636f8b44b014610a7f57806370a0823114610a9f57600080fd5b80635eb170061161039f5780635eb17006146109d85780636352211e14610a2a57806366fddfa914610a4a57600080fd5b80635ae1d8c8146109995780635d08c1ae146109b957600080fd5b80634c0f38c21161041c57806354964d27116103f657806354964d271461094257806355f804b31461095957806357591dfc1461097957600080fd5b80634c0f38c2146108ed5780634f6ccce71461090257806350cee2271461092257600080fd5b80634728b9f41161044d5780634728b9f414610897578063472efe38146108ac5780634be3ca0e146108cc57600080fd5b80634210830d1461086157806342842e0e1461087757600080fd5b806322299799116105215780632f745c59116104d55780633c168eab116104af5780633c168eab146108265780633ccfd60b146108395780633db82fb51461084157600080fd5b80632f745c59146107d05780632f9eca87146107f0578063371e6f991461081057600080fd5b806323b872dd1161050657806323b872dd1461077a5780632d6e71b61461079a5780632eb4a7ab146107ba57600080fd5b806322299799146107425780632316b4da1461075857600080fd5b80630bcecf291161057857806318160ddd1161055d57806318160ddd146106ed5780631ddf3a3714610702578063219c48821461072257600080fd5b80630bcecf29146106b057806312b58349146106d057600080fd5b806307546172116105a9578063075461721461061c578063081812fc1461066e578063095ea7b31461068e57600080fd5b806301ffc9a7146105c557806306fdde03146105fa575b600080fd5b3480156105d157600080fd5b506105e56105e0366004614535565b6110b6565b60405190151581526020015b60405180910390f35b34801561060657600080fd5b5061060f611112565b6040516105f191906145c8565b34801561062857600080fd5b506013546106499073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016105f1565b34801561067a57600080fd5b506106496106893660046145db565b6111a4565b34801561069a57600080fd5b506106ae6106a9366004614616565b61124f565b005b3480156106bc57600080fd5b506012546105e59062010000900460ff1681565b3480156106dc57600080fd5b50475b6040519081526020016105f1565b3480156106f957600080fd5b506002546106df565b34801561070e57600080fd5b506106ae61071d366004614616565b6113a8565b34801561072e57600080fd5b506106ae61073d366004614616565b611438565b34801561074e57600080fd5b506106df600f5481565b34801561076457600080fd5b506012546105e590640100000000900460ff1681565b34801561078657600080fd5b506106ae610795366004614642565b6114c8565b3480156107a657600080fd5b506106ae6107b53660046145db565b61154f565b3480156107c657600080fd5b506106df60175481565b3480156107dc57600080fd5b506106df6107eb366004614616565b6115bb565b3480156107fc57600080fd5b506106ae61080b3660046146cf565b6116d7565b34801561081c57600080fd5b506106df600e5481565b6106ae610834366004614616565b611852565b6106ae611a99565b34801561084d57600080fd5b506106ae61085c3660046145db565b611b72565b34801561086d57600080fd5b506106df60095481565b34801561088357600080fd5b506106ae610892366004614642565b611bde565b3480156108a357600080fd5b506105e5611bf9565b3480156108b857600080fd5b506106ae6108c7366004614750565b611c39565b3480156108d857600080fd5b506012546105e5906301000000900460ff1681565b3480156108f957600080fd5b50600b546106df565b34801561090e57600080fd5b506106df61091d3660046145db565b611cd1565b34801561092e57600080fd5b506105e561093d366004614877565b611d2e565b34801561094e57600080fd5b5060085442116105e5565b34801561096557600080fd5b506106ae6109743660046148c7565b611e00565b34801561098557600080fd5b506106ae610994366004614750565b611e7e565b3480156109a557600080fd5b506106ae6109b43660046148fc565b611f1d565b3480156109c557600080fd5b506012546105e590610100900460ff1681565b3480156109e457600080fd5b506109ed611fd8565b604080519889526020890197909752958701949094526060860192909252608085015260a0840152151560c083015260e0820152610100016105f1565b348015610a3657600080fd5b50610649610a453660046145db565b612024565b348015610a5657600080fd5b5061060f610a65366004614962565b6120d1565b348015610a7657600080fd5b5061060f6121e3565b348015610a8b57600080fd5b506106ae610a9a3660046145db565b612271565b348015610aab57600080fd5b506106df610aba3660046149cb565b6122dd565b348015610acb57600080fd5b506106df610ada3660046149cb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526010602052604090205490565b348015610b0e57600080fd5b506106ae6123dc565b348015610b2357600080fd5b506106df61244f565b348015610b3857600080fd5b506106ae610b473660046145db565b612466565b348015610b5857600080fd5b50610649738430e0b7be3315735c303b82e4471d59ac152aa581565b348015610b8057600080fd5b506106ae610b8f3660046149e8565b6124d2565b348015610ba057600080fd5b506106df610baf3660046149cb565b60106020526000908152604090205481565b348015610bcd57600080fd5b50610be1610bdc3660046149cb565b61255e565b6040516105f19190614a23565b348015610bfa57600080fd5b506019546106df565b348015610c0f57600080fd5b506106ae610c1e366004614750565b612658565b348015610c2f57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610649565b348015610c5a57600080fd5b506106ae610c69366004614a67565b6126f6565b348015610c7a57600080fd5b506106ae610c893660046145db565b612917565b348015610c9a57600080fd5b506106ae610ca9366004614750565b612983565b348015610cba57600080fd5b506106df60085481565b348015610cd057600080fd5b5061060f612a23565b348015610ce557600080fd5b506106df610cf43660046149cb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526011602052604090205490565b348015610d2857600080fd5b506012546106499065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b348015610d5e57600080fd5b506106ae610d6d3660046146cf565b612a32565b348015610d7e57600080fd5b506106df612d43565b348015610d9357600080fd5b506106df600a5481565b348015610da957600080fd5b50610db2612d53565b6040516105f19190614a97565b348015610dcb57600080fd5b506106ae610dda366004614ae5565b612dc1565b348015610deb57600080fd5b506106df610dfa3660046149cb565b60116020526000908152604090205481565b348015610e1857600080fd5b506106ae610e273660046145db565b612ebe565b348015610e3857600080fd5b506106ae610e473660046145db565b612f2a565b348015610e5857600080fd5b506106ae610e67366004614b1a565b612ff7565b348015610e7857600080fd5b50600f546106df565b348015610e8d57600080fd5b506106ae610e9c366004614b86565b61307f565b348015610ead57600080fd5b506106df610ebc3660046149cb565b6130f8565b348015610ecd57600080fd5b506106ae610edc3660046146cf565b613133565b348015610eed57600080fd5b506106ae610efc3660046145db565b613382565b348015610f0d57600080fd5b5061060f610f1c3660046145db565b6133ee565b348015610f2d57600080fd5b5060095442116105e5565b348015610f4457600080fd5b506018546106499073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f7157600080fd5b506106ae610f803660046145db565b6134c7565b348015610f9157600080fd5b506106df600b5481565b348015610fa757600080fd5b506105e5610fb6366004614ba8565b613533565b348015610fc757600080fd5b506106ae610fd63660046149cb565b613634565b348015610fe757600080fd5b506106ae610ff6366004614bd6565b613730565b34801561100757600080fd5b506012546105e59060ff1681565b34801561102157600080fd5b506106df600d5481565b34801561103757600080fd5b50600a546106df565b34801561104c57600080fd5b506106ae61105b366004614750565b613772565b34801561106c57600080fd5b506106ae61107b3660046149cb565b613813565b34801561108c57600080fd5b506106df600c5481565b3480156110a257600080fd5b506106ae6110b13660046145db565b6138c1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061110c575061110c8261392d565b92915050565b60606000805461112190614ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90614ca3565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b60006111af82613a10565b6112265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061125a82612024565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112fe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161121d565b3373ffffffffffffffffffffffffffffffffffffffff8216148061132757506113278133613533565b6113995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161121d565b6113a38383613a74565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260106020526040902055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461149f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260116020526040902055565b6114d23382613b14565b6115445760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161121d565b6113a3838383613c1b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600c55565b60006115c6836122dd565b82106116145760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b6000805b60025481101561168e576002818154811061163557611635614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561167e578382141561167257915061110c9050565b61167b82614d55565b91505b61168781614d55565b9050611618565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b60055473ffffffffffffffffffffffffffffffffffffffff16331461173e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b8281146117b35760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420746f6b656e49647320616e6420726563697069656e74732060448201527f286c656e677468206d69736d6174636829000000000000000000000000000000606482015260840161121d565b60005b8181101561184b5760005b8585838181106117d3576117d3614cf7565b9050602002013581101561183a5761182a338585858181106117f7576117f7614cf7565b905060200201602081019061180c91906149cb565b88888681811061181e5761181e614cf7565b905060200201356114c8565b61183381614d55565b90506117c1565b5061184481614d55565b90506117b6565b5050505050565b600260065414156118a55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161121d565b6002600655601254610100900460ff16156119025760405162461bcd60e51b815260206004820152600e60248201527f4d696e74696e6720706175736564000000000000000000000000000000000000604482015260640161121d565b60125465010000000000900473ffffffffffffffffffffffffffffffffffffffff16331480611948575060135473ffffffffffffffffffffffffffffffffffffffff1633145b6119ba5760405162461bcd60e51b815260206004820152602a60248201527f6f6e6c79206d696e746572206f72206f776e6572206163636f756e742063616e60448201527f2063616c6c207468697300000000000000000000000000000000000000000000606482015260840161121d565b600254600c54600b546119cd9190614d8e565b6119d78383614da5565b1115611a255760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526010602052604081208054849290611a5a908490614da5565b90915550600090505b82811015611a8e57611a7e84611a798385614da5565b613dea565b611a8781614d55565b9050611a63565b505060016006555050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6040514790600090339083908381818185875af1925050503d8060008114611b44576040519150601f19603f3d011682016040523d82523d6000602084013e611b49565b606091505b5050905080611b5757600080fd5b8160196000828254611b699190614da5565b90915550505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611bd95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600855565b6113a383838360405180602001604052806000815250612ff7565b600080611c07600854421190565b8015611c1557506009544211155b90506000611c2161244f565b60025411159050818015611c325750805b9250505090565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ca05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000611cdc60025490565b8210611d2a5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000604482015260640161121d565b5090565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190738430e0b7be3315735c303b82e4471d59ac152aa5611de08286613e8b565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611e675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b8051611e7a906007906020840190614477565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ee55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6012805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b611f8d88612917565b611f96876134c7565b611f9f86613382565b611fa885612f2a565b611fb2848461307f565b611fbb82613772565b611fc58215612983565b611fce81612466565b5050505050505050565b600080600080600080600080600a54600f54600d54611ff561244f565b600854600954601254601754969f959e50939c50919a5098509650640100000000900460ff1694509092509050565b6000806002838154811061203a5761203a614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061110c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161121d565b6060600033604051602001612111919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b604051602081830303815290604052905061216861212f8683613f28565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f5b92505050565b6121da5760405162461bcd60e51b815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e0000000000000000000000000000000000000000000000000000000000606482015260840161121d565b50929392505050565b600780546121f090614ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461221c90614ca3565b80156122695780601f1061223e57610100808354040283529160200191612269565b820191906000526020600020905b81548152906001019060200180831161224c57829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600b55565b600073ffffffffffffffffffffffffffffffffffffffff82166123685760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161121d565b600254600090815b818110156123d3576002818154811061238b5761238b614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156123c3576123c083614d55565b92505b6123cc81614d55565b9050612370565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b61244d6000613f6a565b565b6000600c54600b546124619190614d8e565b905090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601755565b60055473ffffffffffffffffffffffffffffffffffffffff1633146125395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b612543858561307f565b61254c83613382565b612555826134c7565b61184b81612f2a565b6060612569826122dd565b6000106125b85760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f6200000000000000000000604482015260640161121d565b60006125c3836122dd565b905060008167ffffffffffffffff8111156125e0576125e061476b565b604051908082528060200260200182016040528015612609578160200160208202803683370190505b50905060005b828110156126505761262185826115bb565b82828151811061263357612633614cf7565b60209081029190910101528061264881614d55565b91505061260f565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146126bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b60128054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461275d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600e5473ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040902054612791908490614da5565b11156127df5760405162461bcd60e51b815260206004820152601c60248201527f4578636565647320616d6261737361646f7220616c6c6f77616e636500000000604482015260640161121d565b600254600b546127ef8483614da5565b111561283d5760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c5483111561288f5760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b82600c60008282546128a19190614d8e565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260116020526040812080548592906128db908490614da5565b90915550600090505b838110156129115761290183836128fa81614d55565b9450613dea565b61290a81614d55565b90506128e4565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461297e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600a55565b60055473ffffffffffffffffffffffffffffffffffffffff1633146129ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601280549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b60606001805461112190614ca3565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b828114612b0e5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d617463682900000000000000000000000000606482015260840161121d565b600254600090815b85811015612b5457868682818110612b3057612b30614cf7565b9050602002013583612b429190614da5565b9250612b4d81614d55565b9050612b16565b50600b54612b628383614da5565b1115612bb05760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c54821115612c025760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b81600c6000828254612c149190614d8e565b90915550600092508290505b83811015612d3a57868682818110612c3a57612c3a614cf7565b9050602002013560106000878785818110612c5757612c57614cf7565b9050602002016020810190612c6c91906149cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb59190614da5565b90915550600090505b878783818110612cd057612cd0614cf7565b90506020020135811015612d2957612d19868684818110612cf357612cf3614cf7565b9050602002016020810190612d0891906149cb565b84612d1281614d55565b9550613dea565b612d2281614d55565b9050612cbe565b50612d3381614d55565b9050612c20565b50505050505050565b6000476019546124619190614da5565b6060600280548060200260200160405190810160405280929190818152602001828054801561119a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d8d575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff8216331415612e275760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161121d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600955565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600b54811115612fe35760405162461bcd60e51b815260206004820152601d60248201527f537570706c79206361702065786365656473206d617820737570706c79000000604482015260640161121d565b80600b54612ff19190614d8e565b600c5550565b6130013383613b14565b6130735760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161121d565b61291184848484613fe1565b60055473ffffffffffffffffffffffffffffffffffffffff1633146130e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b6130ef82611b72565b611e7a81612ebe565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260116020908152604080832054601090925282205461110c9190614da5565b60055473ffffffffffffffffffffffffffffffffffffffff16331461319a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b82811461320f5760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d617463682900000000000000000000000000606482015260840161121d565b600254600090815b858110156132555786868281811061323157613231614cf7565b90506020020135836132439190614da5565b925061324e81614d55565b9050613217565b50600b546132638383614da5565b11156132b15760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c790000000000000000000000000000604482015260640161121d565b600c548211156133035760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d6178205265736572766564000000000000000000000000604482015260640161121d565b81600c60008282546133159190614d8e565b90915550600092508290505b83811015612d3a5760005b87878381811061333e5761333e614cf7565b9050602002013581101561337157613361868684818110612cf357612cf3614cf7565b61336a81614d55565b905061332c565b5061337b81614d55565b9050613321565b60055473ffffffffffffffffffffffffffffffffffffffff1633146133e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600d55565b60606133f982613a10565b61346b5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161121d565b600061347561406a565b9050600081511161349557604051806020016040528060008152506134c0565b8061349f84614079565b6040516020016134b0929190614dbd565b6040516020818303038152906040525b9392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461352e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600f55565b6018546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156135ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cf9190614dec565b73ffffffffffffffffffffffffffffffffffffffff1614156135f557600191505061110c565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461369b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b73ffffffffffffffffffffffffffffffffffffffff81166137245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161121d565b61372d81613f6a565b50565b60005b815181101561291157613760848484848151811061375357613753614cf7565b60200260200101516114c8565b8061376a81614d55565b915050613733565b60055473ffffffffffffffffffffffffffffffffffffffff1633146137d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b60128054911515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461387a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff1633146139285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161121d565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806139c057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061110c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461110c565b6002546000908210801561110c5750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110613a4a57613a4a614cf7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190613ace82612024565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613b1f82613a10565b613b915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161121d565b6000613b9c83612024565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613c0b57508373ffffffffffffffffffffffffffffffffffffffff16613bf3846111a4565b73ffffffffffffffffffffffffffffffffffffffff16145b8061362c575061362c8185613533565b8273ffffffffffffffffffffffffffffffffffffffff16613c3b82612024565b73ffffffffffffffffffffffffffffffffffffffff1614613cc45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161121d565b73ffffffffffffffffffffffffffffffffffffffff8216613d4c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161121d565b613d57600082613a74565b8160028281548110613d6b57613d6b614cf7565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080600080613e9a856141ab565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015613ef5573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60008183604051602001613f3d929190614dbd565b60405160208183030381529060405280519060200120905092915050565b60006134c0826017548561421f565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613fec848484613c1b565b613ff884848484614235565b6129115760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161121d565b60606007805461112190614ca3565b6060816140b957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156140e357806140cd81614d55565b91506140dc9050600a83614e38565b91506140bd565b60008167ffffffffffffffff8111156140fe576140fe61476b565b6040519080825280601f01601f191660200182016040528015614128576020820181803683370190505b5090505b841561362c5761413d600183614d8e565b915061414a600a86614e4c565b614155906030614da5565b60f81b81838151811061416a5761416a614cf7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141a4600a86614e38565b945061412c565b600080600083516041146142015760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161121d565b50505060208101516040820151606090920151909260009190911a90565b60008261422c858461440b565b14949350505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15614400576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906142ac903390899088908890600401614e60565b6020604051808303816000875af1925050508015614305575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261430291810190614ea9565b60015b6143b5573d808015614333576040519150601f19603f3d011682016040523d82523d6000602084013e614338565b606091505b5080516143ad5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161121d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061362c565b506001949350505050565b600081815b845181101561265057600085828151811061442d5761442d614cf7565b602002602001015190508083116144535760008381526020829052604090209250614464565b600081815260208490526040902092505b508061446f81614d55565b915050614410565b82805461448390614ca3565b90600052602060002090601f0160209004810192826144a557600085556144eb565b82601f106144be57805160ff19168380011785556144eb565b828001600101855582156144eb579182015b828111156144eb5782518255916020019190600101906144d0565b50611d2a9291505b80821115611d2a57600081556001016144f3565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461372d57600080fd5b60006020828403121561454757600080fd5b81356134c081614507565b60005b8381101561456d578181015183820152602001614555565b838111156129115750506000910152565b60008151808452614596816020860160208601614552565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006134c0602083018461457e565b6000602082840312156145ed57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461372d57600080fd5b6000806040838503121561462957600080fd5b8235614634816145f4565b946020939093013593505050565b60008060006060848603121561465757600080fd5b8335614662816145f4565b92506020840135614672816145f4565b929592945050506040919091013590565b60008083601f84011261469557600080fd5b50813567ffffffffffffffff8111156146ad57600080fd5b6020830191508360208260051b85010111156146c857600080fd5b9250929050565b600080600080604085870312156146e557600080fd5b843567ffffffffffffffff808211156146fd57600080fd5b61470988838901614683565b9096509450602087013591508082111561472257600080fd5b5061472f87828801614683565b95989497509550505050565b8035801515811461474b57600080fd5b919050565b60006020828403121561476257600080fd5b6134c08261473b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147e1576147e161476b565b604052919050565b600082601f8301126147fa57600080fd5b813567ffffffffffffffff8111156148145761481461476b565b61484560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161479a565b81815284602083860101111561485a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561488a57600080fd5b8235614895816145f4565b9150602083013567ffffffffffffffff8111156148b157600080fd5b6148bd858286016147e9565b9150509250929050565b6000602082840312156148d957600080fd5b813567ffffffffffffffff8111156148f057600080fd5b61362c848285016147e9565b600080600080600080600080610100898b03121561491957600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925061494c60c08a0161473b565b915060e089013590509295985092959890939650565b60008060006040848603121561497757600080fd5b833567ffffffffffffffff8082111561498f57600080fd5b61499b878388016147e9565b945060208601359150808211156149b157600080fd5b506149be86828701614683565b9497909650939450505050565b6000602082840312156149dd57600080fd5b81356134c0816145f4565b600080600080600060a08688031215614a0057600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6020808252825182820181905260009190848201906040850190845b81811015614a5b57835183529284019291840191600101614a3f565b50909695505050505050565b60008060408385031215614a7a57600080fd5b823591506020830135614a8c816145f4565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614a5b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614ab3565b60008060408385031215614af857600080fd5b8235614b03816145f4565b9150614b116020840161473b565b90509250929050565b60008060008060808587031215614b3057600080fd5b8435614b3b816145f4565b93506020850135614b4b816145f4565b925060408501359150606085013567ffffffffffffffff811115614b6e57600080fd5b614b7a878288016147e9565b91505092959194509250565b60008060408385031215614b9957600080fd5b50508035926020909101359150565b60008060408385031215614bbb57600080fd5b8235614bc6816145f4565b91506020830135614a8c816145f4565b600080600060608486031215614beb57600080fd5b8335614bf6816145f4565b9250602084810135614c07816145f4565b9250604085013567ffffffffffffffff80821115614c2457600080fd5b818701915087601f830112614c3857600080fd5b813581811115614c4a57614c4a61476b565b8060051b9150614c5b84830161479a565b818152918301840191848101908a841115614c7557600080fd5b938501935b83851015614c9357843582529385019390850190614c7a565b8096505050505050509250925092565b600181811c90821680614cb757607f821691505b60208210811415614cf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8757614d87614d26565b5060010190565b600082821015614da057614da0614d26565b500390565b60008219821115614db857614db8614d26565b500190565b60008351614dcf818460208801614552565b835190830190614de3818360208801614552565b01949350505050565b600060208284031215614dfe57600080fd5b81516134c0816145f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614e4757614e47614e09565b500490565b600082614e5b57614e5b614e09565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614e9f608083018461457e565b9695505050505050565b600060208284031215614ebb57600080fd5b81516134c08161450756fea2646970667358221220040aa189c2f82b0721fee0c1c7e66e0019746936b7163b3f0d155155db511b9364736f6c634300080a0033

Deployed Bytecode Sourcemap

1173:14936:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191:301:3;;;;;;;;;;-1:-1:-1;191:301:3;;;;;:::i;:::-;;:::i;:::-;;;611:14:15;;604:22;586:41;;574:2;559:18;191:301:3;;;;;;;;2089:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2549:21:13:-;;;;;;;;;;-1:-1:-1;2549:21:13;;;;;;;;;;;1624:42:15;1612:55;;;1594:74;;1582:2;1567:18;2549:21:13;1448:226:15;2729:308:4;;;;;;;;;;-1:-1:-1;2729:308:4;;;;;:::i;:::-;;:::i;2309:412::-;;;;;;;;;;-1:-1:-1;2309:412:4;;;;;:::i;:::-;;:::i;:::-;;2380:40:13;;;;;;;;;;-1:-1:-1;2380:40:13;;;;;;;;;;;15008:104;;;;;;;;;;-1:-1:-1;15083:21:13;15008:104;;;2489:25:15;;;2477:2;2462:18;15008:104:13;2343:177:15;1470:110:3;;;;;;;;;;-1:-1:-1;1558:7:3;:14;1470:110;;11006:122:13;;;;;;;;;;-1:-1:-1;11006:122:13;;;;;:::i;:::-;;:::i;11136:142::-;;;;;;;;;;-1:-1:-1;11136:142:13;;;;;:::i;:::-;;:::i;1977:39::-;;;;;;;;;;;;;;;;2473:36;;;;;;;;;;-1:-1:-1;2473:36:13;;;;;;;;;;;3602:376:4;;;;;;;;;;-1:-1:-1;3602:376:4;;;;;:::i;:::-;;:::i;11384:96:13:-;;;;;;;;;;-1:-1:-1;11384:96:13;;;;;:::i;:::-;;:::i;2869:25::-;;;;;;;;;;;;;;;;500:504:3;;;;;;;;;;-1:-1:-1;500:504:3;;;;;:::i;:::-;;:::i;10125:428:13:-;;;;;;;;;;-1:-1:-1;10125:428:13;;;;;:::i;:::-;;:::i;1910:38::-;;;;;;;;;;;;;;;;6476:548;;;;;;:::i;:::-;;:::i;15331:273::-;;;:::i;13142:120::-;;;;;;;;;;-1:-1:-1;13142:120:13;;;;;:::i;:::-;;:::i;1476:71::-;;;;;;;;;;;;;;;;3986:185:4;;;;;;;;;;-1:-1:-1;3986:185:4;;;;;:::i;:::-;;:::i;4171:236:13:-;;;;;;;;;;;;;:::i;13039:95::-;;;;;;;;;;-1:-1:-1;13039:95:13;;;;;:::i;:::-;;:::i;2427:39::-;;;;;;;;;;-1:-1:-1;2427:39:13;;;;;;;;;;;3957:89;;;;;;;;;;-1:-1:-1;4029:9:13;;3957:89;;1588:244:3;;;;;;;;;;-1:-1:-1;1588:244:3;;;;;:::i;:::-;;:::i;4651:364:13:-;;;;;;;;;;-1:-1:-1;4651:364:13;;;;;:::i;:::-;;:::i;3705:120::-;;;;;;;;;;-1:-1:-1;3797:20:13;;3779:15;:38;3705:120;;12391:104;;;;;;;;;;-1:-1:-1;12391:104:13;;;;;:::i;:::-;;:::i;12890:141::-;;;;;;;;;;-1:-1:-1;12890:141:13;;;;;:::i;:::-;;:::i;13964:560::-;;;;;;;;;;-1:-1:-1;13964:560:13;;;;;:::i;:::-;;:::i;2343:30::-;;;;;;;;;;-1:-1:-1;2343:30:13;;;;;;;;;;;14532:280;;;;;;;;;;;;;:::i;:::-;;;;7579:25:15;;;7635:2;7620:18;;7613:34;;;;7663:18;;;7656:34;;;;7721:2;7706:18;;7699:34;;;;7764:3;7749:19;;7742:35;7808:3;7793:19;;7786:35;7865:14;7858:22;7852:3;7837:19;;7830:51;7912:3;7897:19;;7890:35;7566:3;7551:19;14532:280:13;7242:689:15;1755:326:4;;;;;;;;;;-1:-1:-1;1755:326:4;;;;;:::i;:::-;;:::i;5953:315:13:-;;;;;;;;;;-1:-1:-1;5953:315:13;;;;;:::i;:::-;;:::i;1317:21::-;;;;;;;;;;;;;:::i;11870:106::-;;;;;;;;;;-1:-1:-1;11870:106:13;;;;;:::i;:::-;;:::i;1229:518:4:-;;;;;;;;;;-1:-1:-1;1229:518:4;;;;;:::i;:::-;;:::i;3297:109:13:-;;;;;;;;;;-1:-1:-1;3297:109:13;;;;;:::i;:::-;3383:15;;3356:7;3383:15;;;:9;:15;;;;;;;3297:109;1661:101:11;;;;;;;;;;;;;:::i;4054:109:13:-;;;;;;;;;;;;;:::i;10908:90::-;;;;;;;;;;-1:-1:-1;10908:90:13;;;;;:::i;:::-;;:::i;2597:85::-;;;;;;;;;;;;2640:42;2597:85;;13603:353;;;;;;;;;;-1:-1:-1;13603:353:13;;;;;:::i;:::-;;:::i;2074:44::-;;;;;;;;;;-1:-1:-1;2074:44:13;;;;;:::i;:::-;;;;;;;;;;;;;;1012:450:3;;;;;;;;;;-1:-1:-1;1012:450:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14901:99:13:-;;;;;;;;;;-1:-1:-1;14978:14:13;;14901:99;;12503:101;;;;;;;;;;-1:-1:-1;12503:101:13;;;;;:::i;:::-;;:::i;1029:85:11:-;;;;;;;;;;-1:-1:-1;1101:6:11;;;;1029:85;;9102:621:13;;;;;;;;;;-1:-1:-1;9102:621:13;;;;;:::i;:::-;;:::i;11286:90::-;;;;;;;;;;-1:-1:-1;11286:90:13;;;;;:::i;:::-;;:::i;12745:137::-;;;;;;;;;;-1:-1:-1;12745:137:13;;;;;:::i;:::-;;:::i;1372:48::-;;;;;;;;;;;;;;;;2197:104:4;;;;;;;;;;;;;:::i;3414:129:13:-;;;;;;;;;;-1:-1:-1;3414:129:13;;;;;:::i;:::-;3510:25;;3483:7;3510:25;;;:19;:25;;;;;;;3414:129;2518:24;;;;;;;;;;-1:-1:-1;2518:24:13;;;;;;;;;;;8086:914;;;;;;;;;;-1:-1:-1;8086:914:13;;;;;:::i;:::-;;:::i;15120:121::-;;;;;;;;;;;;;:::i;1601:30::-;;;;;;;;;;;;;;;;763:95:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3045:327::-;;;;;;;;;;-1:-1:-1;3045:327:4;;;;;:::i;:::-;;:::i;2157:54:13:-;;;;;;;;;;-1:-1:-1;2157:54:13;;;;;:::i;:::-;;;;;;;;;;;;;;13270:116;;;;;;;;;;-1:-1:-1;13270:116:13;;;;;:::i;:::-;;:::i;12196:187::-;;;;;;;;;;-1:-1:-1;12196:187:13;;;;;:::i;:::-;;:::i;4179:365:4:-;;;;;;;;;;-1:-1:-1;4179:365:4;;;;;:::i;:::-;;:::i;4415:107:13:-;;;;;;;;;;-1:-1:-1;4496:18:13;;4415:107;;13394:201;;;;;;;;;;-1:-1:-1;13394:201:13;;;;;:::i;:::-;;:::i;3551:142::-;;;;;;;;;;-1:-1:-1;3551:142:13;;;;;:::i;:::-;;:::i;7115:852::-;;;;;;;;;;-1:-1:-1;7115:852:13;;;;;:::i;:::-;;:::i;11488:96::-;;;;;;;;;;-1:-1:-1;11488:96:13;;;;;:::i;:::-;;:::i;10561:339::-;;;;;;;;;;-1:-1:-1;10561:339:13;;;;;:::i;:::-;;:::i;3833:116::-;;;;;;;;;;-1:-1:-1;3923:18:13;;3905:15;:36;3833:116;;2903:80;;;;;;;;;;-1:-1:-1;2903:80:13;;;;;;;;11726:136;;;;;;;;;;-1:-1:-1;11726:136:13;;;;;:::i;:::-;;:::i;1663:30::-;;;;;;;;;;;;;;;;15705:401;;;;;;;;;;-1:-1:-1;15705:401:13;;;;;:::i;:::-;;:::i;1911:198:11:-;;;;;;;;;;-1:-1:-1;1911:198:11;;;;;:::i;:::-;;:::i;9897:220:13:-;;;;;;;;;;-1:-1:-1;9897:220:13;;;;;:::i;:::-;;:::i;2261:33::-;;;;;;;;;;-1:-1:-1;2261:33:13;;;;;;;;1827:29;;;;;;;;;;;;;;;;4534:84;;;;;;;;;;-1:-1:-1;4605:5:13;;4534:84;;12612:125;;;;;;;;;;-1:-1:-1;12612:125:13;;;;;:::i;:::-;;:::i;6307:94::-;;;;;;;;;;-1:-1:-1;6307:94:13;;;;;:::i;:::-;;:::i;1738:27::-;;;;;;;;;;;;;;;;11592:126;;;;;;;;;;-1:-1:-1;11592:126:13;;;;;:::i;:::-;;:::i;191:301:3:-;339:4;381:50;;;396:35;381:50;;:103;;;448:36;472:11;448:23;:36::i;:::-;361:123;191:301;-1:-1:-1;;191:301:3:o;2089:100:4:-;2143:13;2176:5;2169:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:100;:::o;2729:308::-;2850:7;2897:16;2905:7;2897;:16::i;:::-;2875:110;;;;-1:-1:-1;;;2875:110:4;;14644:2:15;2875:110:4;;;14626:21:15;14683:2;14663:18;;;14656:30;14722:34;14702:18;;;14695:62;14793:14;14773:18;;;14766:42;14825:19;;2875:110:4;;;;;;;;;-1:-1:-1;3005:24:4;;;;:15;:24;;;;;;;;;2729:308::o;2309:412::-;2390:13;2406:24;2422:7;2406:15;:24::i;:::-;2390:40;;2455:5;2449:11;;:2;:11;;;;2441:57;;;;-1:-1:-1;;;2441:57:4;;15057:2:15;2441:57:4;;;15039:21:15;15096:2;15076:18;;;15069:30;15135:34;15115:18;;;15108:62;15206:3;15186:18;;;15179:31;15227:19;;2441:57:4;14855:397:15;2441:57:4;719:10:1;2533:21:4;;;;;:62;;-1:-1:-1;2558:37:4;2575:5;719:10:1;15705:401:13;:::i;2558:37:4:-;2511:168;;;;-1:-1:-1;;;2511:168:4;;15459:2:15;2511:168:4;;;15441:21:15;15498:2;15478:18;;;15471:30;15537:34;15517:18;;;15510:62;15608:26;15588:18;;;15581:54;15652:19;;2511:168:4;15257:420:15;2511:168:4;2692:21;2701:2;2705:7;2692:8;:21::i;:::-;2379:342;2309:412;;:::o;11006:122:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11091:16:13::1;::::0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;:29;11006:122::o;11136:142::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11231:26:13::1;::::0;;::::1;;::::0;;;:19:::1;:26;::::0;;;;:39;11136:142::o;3602:376:4:-;3811:41;719:10:1;3844:7:4;3811:18;:41::i;:::-;3789:140;;;;-1:-1:-1;;;3789:140:4;;16245:2:15;3789:140:4;;;16227:21:15;16284:2;16264:18;;;16257:30;16323:34;16303:18;;;16296:62;16394:19;16374:18;;;16367:47;16431:19;;3789:140:4;16043:413:15;3789:140:4;3942:28;3952:4;3958:2;3962:7;3942:9;:28::i;11384:96:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11452:8:13::1;:20:::0;11384:96::o;500:504:3:-;625:15;674:24;692:5;674:17;:24::i;:::-;666:5;:32;658:67;;;;-1:-1:-1;;;658:67:3;;16663:2:15;658:67:3;;;16645:21:15;16702:2;16682:18;;;16675:30;16741:24;16721:18;;;16714:52;16783:18;;658:67:3;16461:346:15;658:67:3;736:13;765:9;760:186;780:7;:14;776:18;;760:186;;;829:7;837:1;829:10;;;;;;;;:::i;:::-;;;;;;;;;;;;820:19;;;829:10;;820:19;816:119;;;873:5;864;:14;860:59;;;887:1;-1:-1:-1;880:8:3;;-1:-1:-1;880:8:3;860:59;912:7;;;:::i;:::-;;;860:59;796:3;;;:::i;:::-;;;760:186;;;-1:-1:-1;956:40:3;;-1:-1:-1;;;956:40:3;;16663:2:15;956:40:3;;;16645:21:15;16702:2;16682:18;;;16675:30;16741:24;16721:18;;;16714:52;16783:18;;956:40:3;16461:346:15;10125:428:13;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;10245:35:13;;::::1;10237:97;;;::::0;-1:-1:-1;;;10237:97:13;;17592:2:15;10237:97:13::1;::::0;::::1;17574:21:15::0;17631:2;17611:18;;;17604:30;17670:34;17650:18;;;17643:62;17741:19;17721:18;;;17714:47;17778:19;;10237:97:13::1;17390:413:15::0;10237:97:13::1;10350:9;10345:201;10365:20:::0;;::::1;10345:201;;;10412:9;10407:128;10431:8;;10440:1;10431:11;;;;;;;:::i;:::-;;;;;;;10427:1;:15;10407:128;;;10468:51;10481:10;10493:9;;10503:1;10493:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;10507:8;;10516:1;10507:11;;;;;;;:::i;:::-;;;;;;;10468:12;:51::i;:::-;10444:3;::::0;::::1;:::i;:::-;;;10407:128;;;-1:-1:-1::0;10387:3:13::1;::::0;::::1;:::i;:::-;;;10345:201;;;;10125:428:::0;;;;:::o;6476:548::-;1744:1:12;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:12;;18010:2:15;2317:63:12;;;17992:21:15;18049:2;18029:18;;;18022:30;18088:33;18068:18;;;18061:61;18139:18;;2317:63:12;17808:355:15;2317:63:12;1744:1;2455:7;:18;6582:10:13::1;::::0;::::1;::::0;::::1;;;6581:11;6573:38;;;::::0;-1:-1:-1;;;6573:38:13;;18370:2:15;6573:38:13::1;::::0;::::1;18352:21:15::0;18409:2;18389:18;;;18382:30;18448:16;18428:18;;;18421:44;18482:18;;6573:38:13::1;18168:338:15::0;6573:38:13::1;6644:9;::::0;;;::::1;;;6630:10;:23;::::0;:47:::1;;-1:-1:-1::0;6671:6:13::1;::::0;::::1;;6657:10;:20;6630:47;6622:102;;;::::0;-1:-1:-1;;;6622:102:13;;18713:2:15;6622:102:13::1;::::0;::::1;18695:21:15::0;18752:2;18732:18;;;18725:30;18791:34;18771:18;;;18764:62;18862:12;18842:18;;;18835:40;18892:19;;6622:102:13::1;18511:406:15::0;6622:102:13::1;6747:7;:14:::0;6815:8:::1;::::0;6803:9:::1;::::0;:20:::1;::::0;6815:8;6803:20:::1;:::i;:::-;6781:16;6785:12:::0;6781:1;:16:::1;:::i;:::-;6780:44;;6772:75;;;::::0;-1:-1:-1;;;6772:75:13;;19387:2:15;6772:75:13::1;::::0;::::1;19369:21:15::0;19426:2;19406:18;;;19399:30;19465:20;19445:18;;;19438:48;19503:18;;6772:75:13::1;19185:342:15::0;6772:75:13::1;6858:20;::::0;::::1;;::::0;;;:9:::1;:20;::::0;;;;:36;;6882:12;;6858:20;:36:::1;::::0;6882:12;;6858:36:::1;:::i;:::-;::::0;;;-1:-1:-1;6910:9:13::1;::::0;-1:-1:-1;6905:93:13::1;6929:12;6925:1;:16;6905:93;;;6963:23;6969:9:::0;6980:5:::1;6984:1:::0;6980;:5:::1;:::i;:::-;6963;:23::i;:::-;6943:3;::::0;::::1;:::i;:::-;;;6905:93;;;-1:-1:-1::0;;1701:1:12;2628:7;:22;-1:-1:-1;;6476:548:13:o;15331:273::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;15452:64:13::1;::::0;15401:21:::1;::::0;15387:11:::1;::::0;15460:10:::1;::::0;15401:21;;15387:11;15452:64;15387:11;15452:64;15401:21;15460:10;15452:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15433:83;;;15535:7;15527:16;;;::::0;::::1;;15572:3;15554:14;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;15331:273:13:o;13142:120::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;13221:20:13::1;:33:::0;13142:120::o;3986:185:4:-;4124:39;4141:4;4147:2;4151:7;4124:39;;;;;;;;;;;;:16;:39::i;4171:236:13:-;4219:4;4236:11;4250:19;3797:20;;3779:15;:38;;3705:120;4250:19;:41;;;;-1:-1:-1;3923:18:13;;3905:15;:36;4273:18;4250:41;4236:55;;4302:15;4338:23;:21;:23::i;:::-;4320:7;:14;:41;;;-1:-1:-1;4379:6:13;:20;;;;;4389:10;4379:20;4372:27;;;;4171:236;:::o;13039:95::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;13105:13:13::1;:21:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;13039:95::o;1588:244:3:-;1708:7;1749:24;1558:7;:14;;1470:110;1749:24;1741:5;:32;1733:68;;;;-1:-1:-1;;;1733:68:3;;19944:2:15;1733:68:3;;;19926:21:15;19983:2;19963:18;;;19956:30;20022:25;20002:18;;;19995:53;20065:18;;1733:68:3;19742:347:15;1733:68:3;-1:-1:-1;1819:5:3;1588:244::o;4651:364:13:-;4782:22;;;20256:66:15;20243:2;20239:15;;;20235:88;4782:22:13;;;;20223:101:15;;;;4782:22:13;;;;;;;;;20340:12:15;;;4782:22:13;;4772:33;;;;;;20605:66:15;4857:65:13;;;20593:79:15;20688:12;;;;20681:28;;;4857:65:13;;;;;;;;;;20725:12:15;;;;4857:65:13;;;4847:76;;;;;-1:-1:-1;;4772:33:13;2640:42;4941:46;4847:76;4977:9;4941:13;:46::i;:::-;:66;;;;4651:364;-1:-1:-1;;;;;4651:364:13:o;12391:104::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12466:21:13;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;12391:104:::0;:::o;12890:141::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12979:20:13::1;:44:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;12890:141::o;13964:560::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;14189:16:13::1;14198:6;14189:8;:16::i;:::-;14216:42;14238:19;14216:21;:42::i;:::-;14269:22;14281:9;14269:11;:22::i;:::-;14302:24;14315:10;14302:12;:24::i;:::-;14337:56;14362:15;14379:13;14337:24;:56::i;:::-;14404:30;14424:9;14404:19;:30::i;:::-;14445:34;14469:9;14468:10;14445:22;:34::i;:::-;14490:26;14504:11;14490:13;:26::i;:::-;13964:560:::0;;;;;;;;:::o;14532:280::-;14583:7;14592;14601;14610;14619;14628;14637:4;14643:7;14671:5;;14678:18;;14698:8;;14708:23;:21;:23::i;:::-;14733:20;;14755:18;;14775:16;;14793:10;;14663:141;;;;-1:-1:-1;14663:141:13;;-1:-1:-1;14663:141:13;;-1:-1:-1;14733:20:13;-1:-1:-1;14755:18:13;-1:-1:-1;14775:16:13;;;;;;-1:-1:-1;14793:10:13;;-1:-1:-1;14663:141:13;-1:-1:-1;14532:280:13:o;1755:326:4:-;1872:7;1897:13;1913:7;1921;1913:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;1962:19:4;1940:110;;;;-1:-1:-1;;;1940:110:4;;20950:2:15;1940:110:4;;;20932:21:15;20989:2;20969:18;;;20962:30;21028:34;21008:18;;;21001:62;21099:11;21079:18;;;21072:39;21128:19;;1940:110:4;20748:405:15;5953:315:13;6047:13;6073:21;6121:10;6104:28;;;;;;;20243:2:15;20239:15;;;;20256:66;20235:88;20223:101;;20349:2;20340:12;;20094:264;6104:28:13;;;;;;;;;;;;;6073:60;;6152:41;6160:25;6166:9;6177:7;6160:5;:25::i;:::-;6187:5;;6152:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6152:7:13;;-1:-1:-1;;;6152:41:13:i;:::-;6144:89;;;;-1:-1:-1;;;6144:89:13;;21360:2:15;6144:89:13;;;21342:21:15;21399:2;21379:18;;;21372:30;21438:34;21418:18;;;21411:62;21509:5;21489:18;;;21482:33;21532:19;;6144:89:13;21158:399:15;6144:89:13;-1:-1:-1;6251:9:13;;5953:315;-1:-1:-1;;;5953:315:13:o;1317:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11870:106::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11943:9:13::1;:25:::0;11870:106::o;1229:518:4:-;1346:7;1393:19;;;1371:111;;;;-1:-1:-1;;;1371:111:4;;21764:2:15;1371:111:4;;;21746:21:15;21803:2;21783:18;;;21776:30;21842:34;21822:18;;;21815:62;21913:12;21893:18;;;21886:40;21943:19;;1371:111:4;21562:406:15;1371:111:4;1538:7;:14;1493:13;;;1563:130;1587:6;1583:1;:10;1563:130;;;1628:7;1636:1;1628:10;;;;;;;;:::i;:::-;;;;;;;;;;;;1619:19;;;1628:10;;1619:19;1615:67;;;1659:7;;;:::i;:::-;;;1615:67;1595:3;;;:::i;:::-;;;1563:130;;;-1:-1:-1;1734:5:4;;1229:518;-1:-1:-1;;;1229:518:4:o;1661:101:11:-;1101:6;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4054:109:13:-;4108:7;4147:8;;4135:9;;:20;;;;:::i;:::-;4128:27;;4054:109;:::o;10908:90::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;10973:10:13::1;:17:::0;10908:90::o;13603:353::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;13771:56:13::1;13796:15;13813:13;13771:24;:56::i;:::-;13838:22;13850:9;13838:11;:22::i;:::-;13871:42;13893:19;13871:21;:42::i;:::-;13924:24;13937:10;13924:12;:24::i;1012:450:3:-:0;1098:16;1144:24;1162:5;1144:17;:24::i;:::-;1140:1;:28;1132:63;;;;-1:-1:-1;;;1132:63:3;;16663:2:15;1132:63:3;;;16645:21:15;16702:2;16682:18;;;16675:30;16741:24;16721:18;;;16714:52;16783:18;;1132:63:3;16461:346:15;1132:63:3;1206:18;1227:16;1237:5;1227:9;:16::i;:::-;1206:37;;1254:25;1296:10;1282:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1282:25:3;;1254:53;;1323:9;1318:111;1342:10;1338:1;:14;1318:111;;;1388:29;1408:5;1415:1;1388:19;:29::i;:::-;1374:8;1383:1;1374:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;1354:3;;;;:::i;:::-;;;;1318:111;;;-1:-1:-1;1446:8:3;1012:450;-1:-1:-1;;;1012:450:3:o;12503:101:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12572:10:13::1;:24:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;12503:101::o;9102:621::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;9251:19:13::1;::::0;9206:30:::1;::::0;::::1;;::::0;;;:19:::1;:30;::::0;;;;;:41:::1;::::0;9239:8;;9206:41:::1;:::i;:::-;:64;;9198:105;;;::::0;-1:-1:-1;;;9198:105:13;;22175:2:15;9198:105:13::1;::::0;::::1;22157:21:15::0;22214:2;22194:18;;;22187:30;22253;22233:18;;;22226:58;22301:18;;9198:105:13::1;21973:352:15::0;9198:105:13::1;9326:7;:14:::0;9375:9:::1;::::0;9359:12:::1;9363:8:::0;9326:14;9359:12:::1;:::i;:::-;:25;;9351:56;;;::::0;-1:-1:-1;;;9351:56:13;;19387:2:15;9351:56:13::1;::::0;::::1;19369:21:15::0;19426:2;19406:18;;;19399:30;19465:20;19445:18;;;19438:48;19503:18;;9351:56:13::1;19185:342:15::0;9351:56:13::1;9438:8;;9426;:20;;9418:53;;;::::0;-1:-1:-1;;;9418:53:13;;22532:2:15;9418:53:13::1;::::0;::::1;22514:21:15::0;22571:2;22551:18;;;22544:30;22610:22;22590:18;;;22583:50;22650:18;;9418:53:13::1;22330:344:15::0;9418:53:13::1;9538:8;9526;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;9557:30:13::1;::::0;::::1;;::::0;;;:19:::1;:30;::::0;;;;:42;;9591:8;;9557:30;:42:::1;::::0;9591:8;;9557:42:::1;:::i;:::-;::::0;;;-1:-1:-1;9615:9:13::1;::::0;-1:-1:-1;9610:87:13::1;9634:8;9630:1;:12;9610:87;;;9664:21;9670:9:::0;9681:3;::::1;::::0;::::1;:::i;:::-;;;9664:5;:21::i;:::-;9644:3;::::0;::::1;:::i;:::-;;;9610:87;;;-1:-1:-1::0;;;;9102:621:13:o;11286:90::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11351:5:13::1;:17:::0;11286:90::o;12745:137::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12832:19:13::1;:42:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;12745:137::o;2197:104:4:-;2253:13;2286:7;2279:14;;;;;:::i;8086:914:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;8209:35:13;;::::1;8201:99;;;::::0;-1:-1:-1;;;8201:99:13;;22881:2:15;8201:99:13::1;::::0;::::1;22863:21:15::0;22920:2;22900:18;;;22893:30;22959:34;22939:18;;;22932:62;23030:21;23010:18;;;23003:49;23069:19;;8201:99:13::1;22679:415:15::0;8201:99:13::1;8359:7;:14:::0;8311:21:::1;::::0;;8384:101:::1;8404:19:::0;;::::1;8384:101;;;8462:8;;8471:1;8462:11;;;;;;;:::i;:::-;;;;;;;8445:28;;;;;:::i;:::-;::::0;-1:-1:-1;8425:3:13::1;::::0;::::1;:::i;:::-;;;8384:101;;;-1:-1:-1::0;8524:9:13::1;::::0;8503:17:::1;8507:13:::0;8503:1;:17:::1;:::i;:::-;:30;;8495:61;;;::::0;-1:-1:-1;;;8495:61:13;;19387:2:15;8495:61:13::1;::::0;::::1;19369:21:15::0;19426:2;19406:18;;;19399:30;19465:20;19445:18;;;19438:48;19503:18;;8495:61:13::1;19185:342:15::0;8495:61:13::1;8592:8;;8575:13;:25;;8567:58;;;::::0;-1:-1:-1;;;8567:58:13;;22532:2:15;8567:58:13::1;::::0;::::1;22514:21:15::0;22571:2;22551:18;;;22544:30;22610:22;22590:18;;;22583:50;22650:18;;8567:58:13::1;22330:344:15::0;8567:58:13::1;8692:13;8680:8;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8716:20:13::1;::::0;-1:-1:-1;8716:20:13;;-1:-1:-1;8747:227:13::1;8767:20:::0;;::::1;8747:227;;;8836:8;;8845:1;8836:11;;;;;;;:::i;:::-;;;;;;;8809:9;:23;8819:9;;8829:1;8819:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8809:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8867:9:13::1;::::0;-1:-1:-1;8862:101:13::1;8886:8;;8895:1;8886:11;;;;;;;:::i;:::-;;;;;;;8882:1;:15;8862:101;;;8923:24;8929:9;;8939:1;8929:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8943:3:::0;::::1;::::0;::::1;:::i;:::-;;;8923:5;:24::i;:::-;8899:3;::::0;::::1;:::i;:::-;;;8862:101;;;-1:-1:-1::0;8789:3:13::1;::::0;::::1;:::i;:::-;;;8747:227;;;-1:-1:-1::0;;;;;;;8086:914:13:o;15120:121::-;15167:7;15083:21;14978:14;;15194:39;;;;:::i;763:95:4:-;807:16;843:7;836:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:95;:::o;3045:327::-;3180:24;;;719:10:1;3180:24:4;;3172:62;;;;-1:-1:-1;;;3172:62:4;;23301:2:15;3172:62:4;;;23283:21:15;23340:2;23320:18;;;23313:30;23379:27;23359:18;;;23352:55;23424:18;;3172:62:4;23099:349:15;3172:62:4;719:10:1;3247:32:4;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;3316:48;;586:41:15;;;3247:42:4;;719:10:1;3316:48:4;;559:18:15;3316:48:4;;;;;;;3045:327;;:::o;13270:116:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;13347:18:13::1;:31:::0;13270:116::o;12196:187::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12288:9:13::1;;12274:10;:23;;12266:65;;;::::0;-1:-1:-1;;;12266:65:13;;23655:2:15;12266:65:13::1;::::0;::::1;23637:21:15::0;23694:2;23674:18;;;23667:30;23733:31;23713:18;;;23706:59;23782:18;;12266:65:13::1;23453:353:15::0;12266:65:13::1;12365:10;12353:9;;:22;;;;:::i;:::-;12342:8;:33:::0;-1:-1:-1;12196:187:13:o;4179:365:4:-;4368:41;719:10:1;4401:7:4;4368:18;:41::i;:::-;4346:140;;;;-1:-1:-1;;;4346:140:4;;16245:2:15;4346:140:4;;;16227:21:15;16284:2;16264:18;;;16257:30;16323:34;16303:18;;;16296:62;16394:19;16374:18;;;16367:47;16431:19;;4346:140:4;16043:413:15;4346:140:4;4497:39;4511:4;4517:2;4521:7;4530:5;4497:13;:39::i;13394:201:13:-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;13504:38:13::1;13526:15;13504:21;:38::i;:::-;13553:34;13573:13;13553:19;:34::i;3551:142::-:0;3660:25;;;3615:7;3660:25;;;:19;:25;;;;;;;;;3642:9;:15;;;;;;:43;;3660:25;3642:43;:::i;7115:852::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;7229:35:13;;::::1;7221:99;;;::::0;-1:-1:-1;;;7221:99:13;;22881:2:15;7221:99:13::1;::::0;::::1;22863:21:15::0;22920:2;22900:18;;;22893:30;22959:34;22939:18;;;22932:62;23030:21;23010:18;;;23003:49;23069:19;;7221:99:13::1;22679:415:15::0;7221:99:13::1;7379:7;:14:::0;7331:21:::1;::::0;;7404:101:::1;7424:19:::0;;::::1;7404:101;;;7482:8;;7491:1;7482:11;;;;;;;:::i;:::-;;;;;;;7465:28;;;;;:::i;:::-;::::0;-1:-1:-1;7445:3:13::1;::::0;::::1;:::i;:::-;;;7404:101;;;-1:-1:-1::0;7544:9:13::1;::::0;7523:17:::1;7527:13:::0;7523:1;:17:::1;:::i;:::-;:30;;7515:61;;;::::0;-1:-1:-1;;;7515:61:13;;19387:2:15;7515:61:13::1;::::0;::::1;19369:21:15::0;19426:2;19406:18;;;19399:30;19465:20;19445:18;;;19438:48;19503:18;;7515:61:13::1;19185:342:15::0;7515:61:13::1;7612:8;;7595:13;:25;;7587:58;;;::::0;-1:-1:-1;;;7587:58:13;;22532:2:15;7587:58:13::1;::::0;::::1;22514:21:15::0;22571:2;22551:18;;;22544:30;22610:22;22590:18;;;22583:50;22650:18;;7587:58:13::1;22330:344:15::0;7587:58:13::1;7712:13;7700:8;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;7736:20:13::1;::::0;-1:-1:-1;7736:20:13;;-1:-1:-1;7767:174:13::1;7787:20:::0;;::::1;7767:174;;;7834:9;7829:101;7853:8;;7862:1;7853:11;;;;;;;:::i;:::-;;;;;;;7849:1;:15;7829:101;;;7890:24;7896:9;;7906:1;7896:12;;;;;;;:::i;7890:24::-;7866:3;::::0;::::1;:::i;:::-;;;7829:101;;;-1:-1:-1::0;7809:3:13::1;::::0;::::1;:::i;:::-;;;7767:174;;11488:96:::0;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11556:8:13::1;:20:::0;11488:96::o;10561:339::-;10634:13;10668:16;10676:7;10668;:16::i;:::-;10660:62;;;;-1:-1:-1;;;10660:62:13;;24013:2:15;10660:62:13;;;23995:21:15;24052:2;24032:18;;;24025:30;24091:34;24071:18;;;24064:62;24162:3;24142:18;;;24135:31;24183:19;;10660:62:13;23811:397:15;10660:62:13;10733:28;10764:10;:8;:10::i;:::-;10733:41;;10823:1;10798:14;10792:28;:32;:100;;;;;;;;;;;;;;;;;10851:14;10867:18;:7;:16;:18::i;:::-;10834:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10792:100;10785:107;10561:339;-1:-1:-1;;;10561:339:13:o;11726:136::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11814:18:13::1;:40:::0;11726:136::o;15705:401::-;15917:20;;15961:28;;;;;15917:20;1612:55:15;;;15961:28:13;;;1594:74:15;15794:4:13;;15917:20;;;15953:49;;;;15917:20;;15961:21;;1567:18:15;;15961:28:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15953:49;;;15949:93;;;16026:4;16019:11;;;;;15949:93;3551:25:4;;;;3522:4;3551:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;16059:39:13;16052:46;15705:401;-1:-1:-1;;;;15705:401:13:o;1911:198:11:-;1101:6;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:11;;25175:2:15;1991:73:11::1;::::0;::::1;25157:21:15::0;25214:2;25194:18;;;25187:30;25253:34;25233:18;;;25226:62;25324:8;25304:18;;;25297:36;25350:19;;1991:73:11::1;24973:402:15::0;1991:73:11::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;9897:220:13:-;10003:9;9998:112;10022:9;:16;10018:1;:20;9998:112;;;10060:38;10073:5;10080:3;10085:9;10095:1;10085:12;;;;;;;;:::i;:::-;;;;;;;10060;:38::i;:::-;10040:3;;;;:::i;:::-;;;;9998:112;;12612:125;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;12693:16:13::1;:36:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;12612:125::o;6307:94::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;6374:6:13::1;:19:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;6307:94::o;11592:126::-;1101:6:11;;1241:23;1101:6;719:10:1;1241:23:11;1233:68;;;;-1:-1:-1;;;1233:68:11;;15884:2:15;1233:68:11;;;15866:21:15;;;15903:18;;;15896:30;15962:34;15942:18;;;15935:62;16014:18;;1233:68:11;15682:356:15;1233:68:11;11675:19:13::1;:35:::0;11592:126::o;866:355:4:-;1013:4;1055:40;;;1070:25;1055:40;;:105;;-1:-1:-1;1112:48:4;;;1127:33;1112:48;1055:105;:158;;;-1:-1:-1;952:25:2;937:40;;;;1177:36:4;829:155:2;4912::4;5011:7;:14;4977:4;;5001:24;;:58;;;;;5057:1;5029:30;;:7;5037;5029:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;4994:65;4912:155;-1:-1:-1;;4912:155:4:o;7240:175::-;7315:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;7369;7315;7369:15;:24::i;:::-;7360:47;;;;;;;;;;;;7240:175;;:::o;5075:453::-;5204:4;5248:16;5256:7;5248;:16::i;:::-;5226:110;;;;-1:-1:-1;;;5226:110:4;;25582:2:15;5226:110:4;;;25564:21:15;25621:2;25601:18;;;25594:30;25660:34;25640:18;;;25633:62;25731:14;25711:18;;;25704:42;25763:19;;5226:110:4;25380:408:15;5226:110:4;5347:13;5363:24;5379:7;5363:15;:24::i;:::-;5347:40;;5417:5;5406:16;;:7;:16;;;:64;;;;5463:7;5439:31;;:20;5451:7;5439:11;:20::i;:::-;:31;;;5406:64;:113;;;;5487:32;5504:5;5511:7;5487:16;:32::i;6678:554::-;6852:4;6824:32;;:24;6840:7;6824:15;:24::i;:::-;:32;;;6802:123;;;;-1:-1:-1;;;6802:123:4;;25995:2:15;6802:123:4;;;25977:21:15;26034:2;26014:18;;;26007:30;26073:34;26053:18;;;26046:62;26144:11;26124:18;;;26117:39;26173:19;;6802:123:4;25793:405:15;6802:123:4;6944:16;;;6936:65;;;;-1:-1:-1;;;6936:65:4;;26405:2:15;6936:65:4;;;26387:21:15;26444:2;26424:18;;;26417:30;26483:34;26463:18;;;26456:62;26554:6;26534:18;;;26527:34;26578:19;;6936:65:4;26203:400:15;6936:65:4;7118:29;7135:1;7139:7;7118:8;:29::i;:::-;7177:2;7158:7;7166;7158:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;7197:27;;7216:7;;7197:27;;;;;;;;;;7158:16;7197:27;6678:554;;;:::o;9735:154:13:-;9816:7;:16;;;;;;;-1:-1:-1;9816:16:13;;;;;;;;;;;;;;;;;;9848:33;;9873:7;;-1:-1:-1;9848:33:13;;-1:-1:-1;;9848:33:13;9735:154;;:::o;5027:248::-;5128:7;5149:9;5160;5171:7;5182:26;5197:10;5182:14;:26::i;:::-;5226:41;;;;;;;;;;;;26835:25:15;;;26908:4;26896:17;;26876:18;;;26869:45;;;;26930:18;;;26923:34;;;26973:18;;;26966:34;;;5148:60:13;;-1:-1:-1;5148:60:13;;-1:-1:-1;5148:60:13;-1:-1:-1;5226:41:13;;26807:19:15;;5226:41:13;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5226:41:13;;;;;;5027:248;-1:-1:-1;;;;;;;5027:248:13:o;5616:168::-;5702:7;5756;5765:9;5739:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5729:47;;;;;;5722:54;;5616:168;;;;:::o;5792:153::-;5870:4;5894:43;5913:5;5920:10;;5932:4;5894:18;:43::i;2263:187:11:-;2355:6;;;;2371:17;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;4552:352:4:-;4709:28;4719:4;4725:2;4729:7;4709:9;:28::i;:::-;4770:48;4793:4;4799:2;4803:7;4812:5;4770:22;:48::i;:::-;4748:148;;;;-1:-1:-1;;;4748:148:4;;27213:2:15;4748:148:4;;;27195:21:15;27252:2;27232:18;;;27225:30;27291:34;27271:18;;;27264:62;27362:20;27342:18;;;27335:48;27400:19;;4748:148:4;27011:414:15;3190:99:13;3241:13;3274:7;3267:14;;;;;:::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;5287:321:13;5351:9;5362;5373:7;5401:3;:10;5415:2;5401:16;5393:53;;;;-1:-1:-1;;;5393:53:13;;28063:2:15;5393:53:13;;;28045:21:15;28102:2;28082:18;;;28075:30;28141:26;28121:18;;;28114:54;28185:18;;5393:53:13;27861:348:15;5393:53:13;-1:-1:-1;;;5501:2:13;5492:12;;5486:19;5539:2;5530:12;;5524:19;5585:2;5576:12;;;5570:19;5486;;5567:1;5562:28;;;;;5287:321::o;862:184:10:-;983:4;1035;1006:25;1019:5;1026:4;1006:12;:25::i;:::-;:33;;862:184;-1:-1:-1;;;;862:184:10:o;7423:980:4:-;7578:4;7599:13;;;1087:20:0;1133:8;7595:801:4;;7652:175;;;;;:36;;;;;;:175;;719:10:1;;7746:4:4;;7773:7;;7803:5;;7652:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7652:175:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7631:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8010:13:4;;8006:320;;8053:108;;-1:-1:-1;;;8053:108:4;;27213:2:15;8053:108:4;;;27195:21:15;27252:2;27232:18;;;27225:30;27291:34;27271:18;;;27264:62;27362:20;27342:18;;;27335:48;27400:19;;8053:108:4;27011:414:15;8006:320:4;8276:6;8270:13;8261:6;8257:2;8253:15;8246:38;7631:710;7891:51;;7901:41;7891:51;;-1:-1:-1;7884:58:4;;7595:801;-1:-1:-1;8380:4:4;7423:980;;;;;;:::o;1398:662:10:-;1481:7;1523:4;1481:7;1537:488;1561:5;:12;1557:1;:16;1537:488;;;1594:20;1617:5;1623:1;1617:8;;;;;;;;:::i;:::-;;;;;;;1594:31;;1659:12;1643;:28;1639:376;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1769:57;;1639:376;;;2134:13;2182:15;;;2217:4;2210:15;;;2263:4;2247:21;;1943:57;;1639:376;-1:-1:-1;1575:3:10;;;;:::i;:::-;;;;1537:488;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:15;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:15;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:15:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1679:180::-;1738:6;1791:2;1779:9;1770:7;1766:23;1762:32;1759:52;;;1807:1;1804;1797:12;1759:52;-1:-1:-1;1830:23:15;;1679:180;-1:-1:-1;1679:180:15:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:15:o;2525:456::-;2602:6;2610;2618;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;:::-;2795:5;-1:-1:-1;2852:2:15;2837:18;;2824:32;2865:33;2824:32;2865:33;:::i;:::-;2525:456;;2917:7;;-1:-1:-1;;;2971:2:15;2956:18;;;;2943:32;;2525:456::o;3168:367::-;3231:8;3241:6;3295:3;3288:4;3280:6;3276:17;3272:27;3262:55;;3313:1;3310;3303:12;3262:55;-1:-1:-1;3336:20:15;;3379:18;3368:30;;3365:50;;;3411:1;3408;3401:12;3365:50;3448:4;3440:6;3436:17;3424:29;;3508:3;3501:4;3491:6;3488:1;3484:14;3476:6;3472:27;3468:38;3465:47;3462:67;;;3525:1;3522;3515:12;3462:67;3168:367;;;;;:::o;3540:773::-;3662:6;3670;3678;3686;3739:2;3727:9;3718:7;3714:23;3710:32;3707:52;;;3755:1;3752;3745:12;3707:52;3795:9;3782:23;3824:18;3865:2;3857:6;3854:14;3851:34;;;3881:1;3878;3871:12;3851:34;3920:70;3982:7;3973:6;3962:9;3958:22;3920:70;:::i;:::-;4009:8;;-1:-1:-1;3894:96:15;-1:-1:-1;4097:2:15;4082:18;;4069:32;;-1:-1:-1;4113:16:15;;;4110:36;;;4142:1;4139;4132:12;4110:36;;4181:72;4245:7;4234:8;4223:9;4219:24;4181:72;:::i;:::-;3540:773;;;;-1:-1:-1;4272:8:15;-1:-1:-1;;;;3540:773:15:o;4318:160::-;4383:20;;4439:13;;4432:21;4422:32;;4412:60;;4468:1;4465;4458:12;4412:60;4318:160;;;:::o;4483:180::-;4539:6;4592:2;4580:9;4571:7;4567:23;4563:32;4560:52;;;4608:1;4605;4598:12;4560:52;4631:26;4647:9;4631:26;:::i;4668:184::-;4720:77;4717:1;4710:88;4817:4;4814:1;4807:15;4841:4;4838:1;4831:15;4857:334;4928:2;4922:9;4984:2;4974:13;;4989:66;4970:86;4958:99;;5087:18;5072:34;;5108:22;;;5069:62;5066:88;;;5134:18;;:::i;:::-;5170:2;5163:22;4857:334;;-1:-1:-1;4857:334:15:o;5196:589::-;5238:5;5291:3;5284:4;5276:6;5272:17;5268:27;5258:55;;5309:1;5306;5299:12;5258:55;5345:6;5332:20;5371:18;5367:2;5364:26;5361:52;;;5393:18;;:::i;:::-;5437:114;5545:4;5476:66;5469:4;5465:2;5461:13;5457:86;5453:97;5437:114;:::i;:::-;5576:2;5567:7;5560:19;5622:3;5615:4;5610:2;5602:6;5598:15;5594:26;5591:35;5588:55;;;5639:1;5636;5629:12;5588:55;5704:2;5697:4;5689:6;5685:17;5678:4;5669:7;5665:18;5652:55;5752:1;5727:16;;;5745:4;5723:27;5716:38;;;;5731:7;5196:589;-1:-1:-1;;;5196:589:15:o;5790:455::-;5867:6;5875;5928:2;5916:9;5907:7;5903:23;5899:32;5896:52;;;5944:1;5941;5934:12;5896:52;5983:9;5970:23;6002:31;6027:5;6002:31;:::i;:::-;6052:5;-1:-1:-1;6108:2:15;6093:18;;6080:32;6135:18;6124:30;;6121:50;;;6167:1;6164;6157:12;6121:50;6190:49;6231:7;6222:6;6211:9;6207:22;6190:49;:::i;:::-;6180:59;;;5790:455;;;;;:::o;6250:321::-;6319:6;6372:2;6360:9;6351:7;6347:23;6343:32;6340:52;;;6388:1;6385;6378:12;6340:52;6428:9;6415:23;6461:18;6453:6;6450:30;6447:50;;;6493:1;6490;6483:12;6447:50;6516:49;6557:7;6548:6;6537:9;6533:22;6516:49;:::i;6576:661::-;6695:6;6703;6711;6719;6727;6735;6743;6751;6804:3;6792:9;6783:7;6779:23;6775:33;6772:53;;;6821:1;6818;6811:12;6772:53;6857:9;6844:23;6834:33;;6914:2;6903:9;6899:18;6886:32;6876:42;;6965:2;6954:9;6950:18;6937:32;6927:42;;7016:2;7005:9;7001:18;6988:32;6978:42;;7067:3;7056:9;7052:19;7039:33;7029:43;;7119:3;7108:9;7104:19;7091:33;7081:43;;7143:36;7174:3;7163:9;7159:19;7143:36;:::i;:::-;7133:46;;7226:3;7215:9;7211:19;7198:33;7188:43;;6576:661;;;;;;;;;;;:::o;7936:657::-;8041:6;8049;8057;8110:2;8098:9;8089:7;8085:23;8081:32;8078:52;;;8126:1;8123;8116:12;8078:52;8166:9;8153:23;8195:18;8236:2;8228:6;8225:14;8222:34;;;8252:1;8249;8242:12;8222:34;8275:49;8316:7;8307:6;8296:9;8292:22;8275:49;:::i;:::-;8265:59;;8377:2;8366:9;8362:18;8349:32;8333:48;;8406:2;8396:8;8393:16;8390:36;;;8422:1;8419;8412:12;8390:36;;8461:72;8525:7;8514:8;8503:9;8499:24;8461:72;:::i;:::-;7936:657;;8552:8;;-1:-1:-1;8435:98:15;;-1:-1:-1;;;;7936:657:15:o;8598:247::-;8657:6;8710:2;8698:9;8689:7;8685:23;8681:32;8678:52;;;8726:1;8723;8716:12;8678:52;8765:9;8752:23;8784:31;8809:5;8784:31;:::i;9035:454::-;9130:6;9138;9146;9154;9162;9215:3;9203:9;9194:7;9190:23;9186:33;9183:53;;;9232:1;9229;9222:12;9183:53;-1:-1:-1;;9255:23:15;;;9325:2;9310:18;;9297:32;;-1:-1:-1;9376:2:15;9361:18;;9348:32;;9427:2;9412:18;;9399:32;;-1:-1:-1;9478:3:15;9463:19;9450:33;;-1:-1:-1;9035:454:15;-1:-1:-1;9035:454:15:o;9494:632::-;9665:2;9717:21;;;9787:13;;9690:18;;;9809:22;;;9636:4;;9665:2;9888:15;;;;9862:2;9847:18;;;9636:4;9931:169;9945:6;9942:1;9939:13;9931:169;;;10006:13;;9994:26;;10075:15;;;;10040:12;;;;9967:1;9960:9;9931:169;;;-1:-1:-1;10117:3:15;;9494:632;-1:-1:-1;;;;;;9494:632:15:o;10131:315::-;10199:6;10207;10260:2;10248:9;10239:7;10235:23;10231:32;10228:52;;;10276:1;10273;10266:12;10228:52;10312:9;10299:23;10289:33;;10372:2;10361:9;10357:18;10344:32;10385:31;10410:5;10385:31;:::i;:::-;10435:5;10425:15;;;10131:315;;;;;:::o;10451:681::-;10622:2;10674:21;;;10744:13;;10647:18;;;10766:22;;;10593:4;;10622:2;10845:15;;;;10819:2;10804:18;;;10593:4;10888:218;10902:6;10899:1;10896:13;10888:218;;;10967:13;;10982:42;10963:62;10951:75;;11081:15;;;;11046:12;;;;10924:1;10917:9;10888:218;;11137:315;11202:6;11210;11263:2;11251:9;11242:7;11238:23;11234:32;11231:52;;;11279:1;11276;11269:12;11231:52;11318:9;11305:23;11337:31;11362:5;11337:31;:::i;:::-;11387:5;-1:-1:-1;11411:35:15;11442:2;11427:18;;11411:35;:::i;:::-;11401:45;;11137:315;;;;;:::o;11457:665::-;11552:6;11560;11568;11576;11629:3;11617:9;11608:7;11604:23;11600:33;11597:53;;;11646:1;11643;11636:12;11597:53;11685:9;11672:23;11704:31;11729:5;11704:31;:::i;:::-;11754:5;-1:-1:-1;11811:2:15;11796:18;;11783:32;11824:33;11783:32;11824:33;:::i;:::-;11876:7;-1:-1:-1;11930:2:15;11915:18;;11902:32;;-1:-1:-1;11985:2:15;11970:18;;11957:32;12012:18;12001:30;;11998:50;;;12044:1;12041;12034:12;11998:50;12067:49;12108:7;12099:6;12088:9;12084:22;12067:49;:::i;:::-;12057:59;;;11457:665;;;;;;;:::o;12127:248::-;12195:6;12203;12256:2;12244:9;12235:7;12231:23;12227:32;12224:52;;;12272:1;12269;12262:12;12224:52;-1:-1:-1;;12295:23:15;;;12365:2;12350:18;;;12337:32;;-1:-1:-1;12127:248:15:o;12380:388::-;12448:6;12456;12509:2;12497:9;12488:7;12484:23;12480:32;12477:52;;;12525:1;12522;12515:12;12477:52;12564:9;12551:23;12583:31;12608:5;12583:31;:::i;:::-;12633:5;-1:-1:-1;12690:2:15;12675:18;;12662:32;12703:33;12662:32;12703:33;:::i;12773:1222::-;12875:6;12883;12891;12944:2;12932:9;12923:7;12919:23;12915:32;12912:52;;;12960:1;12957;12950:12;12912:52;12999:9;12986:23;13018:31;13043:5;13018:31;:::i;:::-;13068:5;-1:-1:-1;13092:2:15;13131:18;;;13118:32;13159:33;13118:32;13159:33;:::i;:::-;13211:7;-1:-1:-1;13269:2:15;13254:18;;13241:32;13292:18;13322:14;;;13319:34;;;13349:1;13346;13339:12;13319:34;13387:6;13376:9;13372:22;13362:32;;13432:7;13425:4;13421:2;13417:13;13413:27;13403:55;;13454:1;13451;13444:12;13403:55;13490:2;13477:16;13512:2;13508;13505:10;13502:36;;;13518:18;;:::i;:::-;13564:2;13561:1;13557:10;13547:20;;13587:28;13611:2;13607;13603:11;13587:28;:::i;:::-;13649:15;;;13719:11;;;13715:20;;;13680:12;;;;13747:19;;;13744:39;;;13779:1;13776;13769:12;13744:39;13803:11;;;;13823:142;13839:6;13834:3;13831:15;13823:142;;;13905:17;;13893:30;;13856:12;;;;13943;;;;13823:142;;;13984:5;13974:15;;;;;;;;12773:1222;;;;;:::o;14000:437::-;14079:1;14075:12;;;;14122;;;14143:61;;14197:4;14189:6;14185:17;14175:27;;14143:61;14250:2;14242:6;14239:14;14219:18;14216:38;14213:218;;;14287:77;14284:1;14277:88;14388:4;14385:1;14378:15;14416:4;14413:1;14406:15;14213:218;;14000:437;;;:::o;16812:184::-;16864:77;16861:1;16854:88;16961:4;16958:1;16951:15;16985:4;16982:1;16975:15;17001:184;17053:77;17050:1;17043:88;17150:4;17147:1;17140:15;17174:4;17171:1;17164:15;17190:195;17229:3;17260:66;17253:5;17250:77;17247:103;;;17330:18;;:::i;:::-;-1:-1:-1;17377:1:15;17366:13;;17190:195::o;18922:125::-;18962:4;18990:1;18987;18984:8;18981:34;;;18995:18;;:::i;:::-;-1:-1:-1;19032:9:15;;18922:125::o;19052:128::-;19092:3;19123:1;19119:6;19116:1;19113:13;19110:39;;;19129:18;;:::i;:::-;-1:-1:-1;19165:9:15;;19052:128::o;24213:470::-;24392:3;24430:6;24424:13;24446:53;24492:6;24487:3;24480:4;24472:6;24468:17;24446:53;:::i;:::-;24562:13;;24521:16;;;;24584:57;24562:13;24521:16;24618:4;24606:17;;24584:57;:::i;:::-;24657:20;;24213:470;-1:-1:-1;;;;24213:470:15:o;24688:280::-;24787:6;24840:2;24828:9;24819:7;24815:23;24811:32;24808:52;;;24856:1;24853;24846:12;24808:52;24888:9;24882:16;24907:31;24932:5;24907:31;:::i;27430:184::-;27482:77;27479:1;27472:88;27579:4;27576:1;27569:15;27603:4;27600:1;27593:15;27619:120;27659:1;27685;27675:35;;27690:18;;:::i;:::-;-1:-1:-1;27724:9:15;;27619:120::o;27744:112::-;27776:1;27802;27792:35;;27807:18;;:::i;:::-;-1:-1:-1;27841:9:15;;27744:112::o;28214:512::-;28408:4;28437:42;28518:2;28510:6;28506:15;28495:9;28488:34;28570:2;28562:6;28558:15;28553:2;28542:9;28538:18;28531:43;;28610:6;28605:2;28594:9;28590:18;28583:34;28653:3;28648:2;28637:9;28633:18;28626:31;28674:46;28715:3;28704:9;28700:19;28692:6;28674:46;:::i;:::-;28666:54;28214:512;-1:-1:-1;;;;;;28214:512:15:o;28731:249::-;28800:6;28853:2;28841:9;28832:7;28828:23;28824:32;28821:52;;;28869:1;28866;28859:12;28821:52;28901:9;28895:16;28920:30;28944:5;28920:30;:::i

Swarm Source

ipfs://040aa189c2f82b0721fee0c1c7e66e0019746936b7163b3f0d155155db511b93
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.