ETH Price: $3,407.39 (+1.12%)

Token

Dominapes (DPE)
 

Overview

Max Total Supply

3,191 DPE

Holders

719

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
joaooo.eth
Balance
1 DPE
0x3e397E679fB1aDb0AC1FACf4679cc222A9dEa1a3
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:
Dominapes

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 12: Dominapes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721.sol";

contract Dominapes is ERC721 {
    event Mint(address indexed from, uint256 indexed tokenId);

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    modifier saleStarted() {
        require(
            startMintDate != 0 && startMintDate <= block.timestamp,
            "You are too early"
        );

        _;
    }

    uint256 public startMintDate = 1628636400;
    uint256 private salePrice = 15000000000000000;
    uint256 private totalTokens = 8000;
    uint256 private totalMintedTokens = 0;
    uint256 private maxSlicesPerWallet = 200;
    uint256 private maxSlicesPerTransaction = 10;
    string private baseURI =
        "https://dominapes.s3.us-west-1.amazonaws.com/";
    bool public premintingComplete = false;
    uint256 public giveawayCount = 50;

    mapping(address => uint256) private claimedSlicesPerWallet;

    uint16[] availableSlices;

    constructor() ERC721("Dominapes", "DPE") {
        addAvailableSlices();
        premintSlices();
    }


    // ONLY OWNER

    /**
     * @dev Allows to withdraw the Ether in the contract
     */
    function withdraw() external onlyOwner {
        uint256 totalBalance = address(this).balance;
        payable(msg.sender).transfer(totalBalance);
    }

    /**
     * @dev Sets the base URI for the API that provides the NFT data.
     */
    function setBaseTokenURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    /**
     * @dev Sets the claim price for each slice
     */
    function setsalePrice(uint256 _salePrice) external onlyOwner {
        salePrice = _salePrice;
    }

    /**
     * @dev Populates the available slices
     */
    function addAvailableSlices()
        internal
        onlyOwner
    {
        for (uint16 i = 0; i <= 7999; i++) {
            availableSlices.push(i);
        }
    }

    /**
     * @dev Removes a chosen slice from the available list
     */
    function removeSlicesFromAvailableSlices(uint16 tokenId)
        external
        onlyOwner
    {
        for (uint16 i; i <= availableSlices.length; i++) {
            if (availableSlices[i] != tokenId) {
                continue;
            }

            availableSlices[i] = availableSlices[availableSlices.length - 1];
            availableSlices.pop();

            break;
        }
    }

    /**
     * @dev Allow devs to hand pick some slices before the available slices list is created
     */
    function allocateTokens(uint256[] memory tokenIds)
        external
        onlyOwner
    {
        require(availableSlices.length == 0, "Available slices are already set");

        _batchMint(msg.sender, tokenIds);

        totalMintedTokens += tokenIds.length;
    }

    /**
     * @dev Sets the date that users can start claiming slices
     */
    function setStartSaleDate(uint256 _startSaleDate)
        external
        onlyOwner
    {
        startMintDate = _startSaleDate;
    }

    /**
     * @dev Sets the date that users can start minting slices
     */
    function setStartMintDate(uint256 _startMintDate)
        external
        onlyOwner
    {
        startMintDate = _startMintDate;
    }

    /**
     * @dev Checks if an slice is in the available list
     */
    function isSliceAvailable(uint16 tokenId)
        external
        view
        onlyOwner
        returns (bool)
    {
        for (uint16 i; i < availableSlices.length; i++) {
            if (availableSlices[i] == tokenId) {
                return true;
            }
        }

        return false;
    }

    /**
     * @dev Give random slices to the provided addresses
     */
    function ownerMintSlices(address[] memory addresses)
        external
        onlyOwner
    {
        require(
            availableSlices.length >= addresses.length,
            "No slices left to be claimed"
        );
        totalMintedTokens += addresses.length;

        for (uint256 i; i < addresses.length; i++) {
            _mint(addresses[i], getSliceToBeClaimed());
        }
    }

    /**
     * @dev Give random slices to the provided address
     */
    function premintSlices()
        internal
        onlyOwner
    {
        require(availableSlices.length >= giveawayCount, "No slices left to be claimed");
        require(
            !premintingComplete,
            "You can only premint the horses once"
            );
        totalMintedTokens += giveawayCount;

        uint256[] memory tokenIds = new uint256[](giveawayCount);

        for (uint256 i; i < giveawayCount; i++) {
            tokenIds[i] = getSliceToBeClaimed();
        }
        _batchMint(msg.sender, tokenIds);
        premintingComplete = true;
    }

    // END ONLY OWNER

    /**
     * @dev Claim a single slice
     */
    function mintSlice() external payable callerIsUser saleStarted {
        require(msg.value >= salePrice, "Not enough Ether to claim an slice");

        require(
            claimedSlicesPerWallet[msg.sender] < maxSlicesPerWallet,
            "You cannot claim more slices"
        );

        require(availableSlices.length > 0, "No slices left to be claimed");

        claimedSlicesPerWallet[msg.sender]++;
        totalMintedTokens++;

        _mint(msg.sender, getSliceToBeClaimed());
    }

    /**
     * @dev Claim up to 10 slices at once
     */
    function mintSlices(uint256 amount)
        external
        payable
        callerIsUser
        saleStarted
    {
        require(
            msg.value >= salePrice * amount,
            "Not enough Ether to claim the slices"
        );

        require(
            claimedSlicesPerWallet[msg.sender] + amount <= maxSlicesPerWallet,
            "You cannot claim more slices"
        );
        require(amount <= maxSlicesPerTransaction, "You can only claim 10 slices in 1 transaction");

        require(availableSlices.length >= amount, "No slices left to be claimed");

        uint256[] memory tokenIds = new uint256[](amount);

        claimedSlicesPerWallet[msg.sender] += amount;
        totalMintedTokens += amount;

        for (uint256 i; i < amount; i++) {
            tokenIds[i] = getSliceToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
    }

    /**
     * @dev Returns the tokenId by index
     */
    function tokenByIndex(uint256 tokenId) external view returns (uint256) {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );

        return tokenId;
    }

    /**
     * @dev Returns the base URI for the tokens API.
     */
    function baseTokenURI() external view returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Returns how many slices are still available to be claimed
     */
    function getAvailableSlices() external view returns (uint256) {
        return availableSlices.length;
    }

    /**
     * @dev Returns the claim price
     */
    function getSalePrice() external view returns (uint256) {
        return salePrice;
    }

    /**
     * @dev Returns the total supply
     */
    function totalSupply() external view virtual returns (uint256) {
        return totalMintedTokens;
    }

    // Private and Internal functions

    /**
     * @dev Returns a random available slice to be claimed
     */
    function getSliceToBeClaimed() private returns (uint256) {
        uint256 random = _getRandomNumber(availableSlices.length);
        uint256 tokenId = uint256(availableSlices[random]);

        availableSlices[random] = availableSlices[availableSlices.length - 1];
        availableSlices.pop();

        return tokenId;
    }

    /**
     * @dev Generates a pseudo-random number.
     */
    function _getRandomNumber(uint256 _upper) private view returns (uint256) {
        uint256 random = uint256(
            keccak256(
                abi.encodePacked(
                    availableSlices.length,
                    blockhash(block.number - 1),
                    block.coinbase,
                    block.difficulty,
                    msg.sender
                )
            )
        );

        return random % _upper;
    }

    /**
     * @dev See {ERC721}.
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function mulScale(
        uint256 x,
        uint256 y,
        uint128 scale
    ) internal pure returns (uint256) {
        uint256 a = x / scale;
        uint256 b = x % scale;
        uint256 c = y / scale;
        uint256 d = y % scale;

        return a * c * scale + a * d + b * c + (b * d) / scale;
    }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 12: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 12: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

    function _batchMint(address to, uint256[] memory tokenIds)
        internal
        virtual
    {
        require(to != address(0), "ERC721: mint to the zero address");
        _balances[to] += tokenIds.length;

        for (uint256 i; i < tokenIds.length; i++) {
            require(!_exists(tokenIds[i]), "ERC721: token already minted");

            _beforeTokenTransfer(address(0), to, tokenIds[i]);

            _owners[tokenIds[i]] = to;

            emit Transfer(address(0), to, tokenIds[i]);
        }
    }

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

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

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

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

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

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 6 of 12: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 12: IERC721.sol
// SPDX-License-Identifier: MIT

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 12: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

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 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 12: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 12 of 12: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[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":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"allocateTokens","outputs":[],"stateMutability":"nonpayable","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getAvailableSlices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"isSliceAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintSlice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintSlices","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"ownerMintSlices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premintingComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"removeSlicesFromAvailableSlices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startMintDate","type":"uint256"}],"name":"setStartMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startSaleDate","type":"uint256"}],"name":"setStartSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setsalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMintDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405263611304f060075566354a6ba7a18000600855611f406009556000600a5560c8600b55600a600c556040518060600160405280602d815260200162006080602d9139600d90805190602001906200005d92919062000b53565b506000600e60006101000a81548160ff0219169083151502179055506032600f553480156200008b57600080fd5b506040518060400160405280600981526020017f446f6d696e6170657300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f445045000000000000000000000000000000000000000000000000000000000081525060006200010a6200020260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160019080519060200190620001c092919062000b53565b508060029080519060200190620001d992919062000b53565b505050620001ec6200020a60201b60201c565b620001fc6200030d60201b60201c565b62001221565b600033905090565b6200021a6200020260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002406200057b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000299576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002909062000e01565b60405180910390fd5b60005b611f3f8161ffff16116200030a5760118190806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff1602179055508080620003019062000f8e565b9150506200029c565b50565b6200031d6200020260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003436200057b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003939062000e01565b60405180910390fd5b600f546011805490501015620003e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e09062000e23565b60405180910390fd5b600e60009054906101000a900460ff16156200043c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004339062000dbd565b60405180910390fd5b600f54600a600082825462000452919062000e56565b925050819055506000600f5467ffffffffffffffff8111156200049e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620004cd5781602001602082028036833780820191505090505b50905060005b600f548110156200054a57620004ee620005a460201b60201c565b82828151811062000528577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080620005419062000fbe565b915050620004d3565b506200055d33826200077160201b60201c565b6001600e60006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080620005bd60118054905062000a7f60201b60201c565b9050600060118281548110620005fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050601160016011805490506200063c919062000eb3565b8154811062000674577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660118381548110620006d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060118054806200073b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055809250505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007db9062000ddf565b60405180910390fd5b8051600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000836919062000e56565b9250508190555060005b815181101562000a7a576200089c82828151811062000888577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015162000ae260201b60201c565b15620008df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d69062000d9b565b60405180910390fd5b6200093460008484848151811062000920577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015162000b4e60201b60201c565b826003600084848151811062000973577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081818151811062000a01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808062000a719062000fbe565b91505062000840565b505050565b60008060118054905060014362000a97919062000eb3565b4041443360405160200162000ab195949392919062000d32565b6040516020818303038152906040528051906020012060001c9050828162000ada91906200105c565b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b82805462000b619062000f58565b90600052602060002090601f01602090048101928262000b85576000855562000bd1565b82601f1062000ba057805160ff191683800117855562000bd1565b8280016001018555821562000bd1579182015b8281111562000bd057825182559160200191906001019062000bb3565b5b50905062000be0919062000be4565b5090565b5b8082111562000bff57600081600090555060010162000be5565b5090565b62000c1862000c128262000f02565b62001020565b82525050565b62000c3362000c2d8262000eee565b6200100c565b82525050565b62000c4e62000c488262000f16565b62001034565b82525050565b600062000c63601c8362000e45565b915062000c70826200112e565b602082019050919050565b600062000c8a60248362000e45565b915062000c978262001157565b604082019050919050565b600062000cb160208362000e45565b915062000cbe82620011a6565b602082019050919050565b600062000cd860208362000e45565b915062000ce582620011cf565b602082019050919050565b600062000cff601c8362000e45565b915062000d0c82620011f8565b602082019050919050565b62000d2c62000d268262000f4e565b62001052565b82525050565b600062000d40828862000d17565b60208201915062000d52828762000c39565b60208201915062000d64828662000c03565b60148201915062000d76828562000d17565b60208201915062000d88828462000c1e565b6014820191508190509695505050505050565b6000602082019050818103600083015262000db68162000c54565b9050919050565b6000602082019050818103600083015262000dd88162000c7b565b9050919050565b6000602082019050818103600083015262000dfa8162000ca2565b9050919050565b6000602082019050818103600083015262000e1c8162000cc9565b9050919050565b6000602082019050818103600083015262000e3e8162000cf0565b9050919050565b600082825260208201905092915050565b600062000e638262000f4e565b915062000e708362000f4e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ea85762000ea762001094565b5b828201905092915050565b600062000ec08262000f4e565b915062000ecd8362000f4e565b92508282101562000ee35762000ee262001094565b5b828203905092915050565b600062000efb8262000f2e565b9050919050565b600062000f0f8262000f2e565b9050919050565b6000819050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000f7157607f821691505b6020821081141562000f885762000f87620010f2565b5b50919050565b600062000f9b8262000f20565b915061ffff82141562000fb35762000fb262001094565b5b600182019050919050565b600062000fcb8262000f4e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001001576200100062001094565b5b600182019050919050565b600062001019826200103e565b9050919050565b60006200102d826200103e565b9050919050565b6000819050919050565b60006200104b8262001121565b9050919050565b6000819050919050565b6000620010698262000f4e565b9150620010768362000f4e565b925082620010895762001088620010c3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160601b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752063616e206f6e6c79207072656d696e742074686520686f727365732060008201527f6f6e636500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f20736c69636573206c65667420746f20626520636c61696d656400000000600082015250565b614e4f80620012316000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063c87b56dd116100a0578063da67e22a1161006f578063da67e22a14610723578063e985e9c51461074e578063e9be0f3f1461078b578063f2fde38b146107b6578063fc14ba49146107df57610204565b8063c87b56dd14610676578063d4f0a7e1146106b3578063d547cfb7146106cf578063d89377f4146106fa57610204565b806395d89b41116100e757806395d89b41146105c6578063a22cb465146105f1578063b73c4bd71461061a578063b88d4fde14610624578063c2416c8c1461064d57610204565b806370a082311461050a578063715018a61461054757806386266e8a1461055e5780638da5cb5b1461059b57610204565b806330176e131161019b578063493143e41161016a578063493143e4146104135780634f6ccce71461043c5780635445d956146104795780636352211e146104a25780636e5eb109146104df57610204565b806330176e13146103815780633c29a4d9146103aa5780633ccfd60b146103d357806342842e0e146103ea57610204565b806318160ddd116101d757806318160ddd146102d75780632344e9181461030257806323b872dd1461032d5780632fbc0bf11461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906138b6565b610808565b60405161023d9190613ef9565b60405180910390f35b34801561025257600080fd5b5061025b6108ea565b6040516102689190613f14565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613972565b61097c565b6040516102a59190613e92565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906137f8565b610a01565b005b3480156102e357600080fd5b506102ec610b19565b6040516102f99190614236565b60405180910390f35b34801561030e57600080fd5b50610317610b23565b6040516103249190613ef9565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f91906136f2565b610b36565b005b34801561036257600080fd5b5061036b610b96565b6040516103789190614236565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613908565b610ba0565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613949565b610c36565b005b3480156103df57600080fd5b506103e8610e98565b005b3480156103f657600080fd5b50610411600480360381019061040c91906136f2565b610f63565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613972565b610f83565b005b34801561044857600080fd5b50610463600480360381019061045e9190613972565b611009565b6040516104709190614236565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613972565b61105b565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613972565b6110e1565b6040516104d69190613e92565b60405180910390f35b3480156104eb57600080fd5b506104f4611193565b6040516105019190614236565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061368d565b6111a0565b60405161053e9190614236565b60405180910390f35b34801561055357600080fd5b5061055c611258565b005b34801561056a57600080fd5b5061058560048036038101906105809190613949565b611392565b6040516105929190613ef9565b60405180910390f35b3480156105a757600080fd5b506105b06114bd565b6040516105bd9190613e92565b60405180910390f35b3480156105d257600080fd5b506105db6114e6565b6040516105e89190613f14565b60405180910390f35b3480156105fd57600080fd5b50610618600480360381019061061391906137bc565b611578565b005b6106226116f9565b005b34801561063057600080fd5b5061064b60048036038101906106469190613741565b61194b565b005b34801561065957600080fd5b50610674600480360381019061066f9190613972565b6119ad565b005b34801561068257600080fd5b5061069d60048036038101906106989190613972565b611a33565b6040516106aa9190613f14565b60405180910390f35b6106cd60048036038101906106c89190613972565b611ada565b005b3480156106db57600080fd5b506106e4611e64565b6040516106f19190613f14565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190613834565b611ef6565b005b34801561072f57600080fd5b50610738612049565b6040516107459190614236565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906136b6565b61204f565b6040516107829190613ef9565b60405180910390f35b34801561079757600080fd5b506107a06120e3565b6040516107ad9190614236565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061368d565b6120e9565b005b3480156107eb57600080fd5b5061080660048036038101906108019190613875565b612292565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e357506108e28261237d565b5b9050919050565b6060600180546108f990614568565b80601f016020809104026020016040519081016040528092919081815260200182805461092590614568565b80156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050505050905090565b6000610987826123e7565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906140f6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c826110e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9c612453565b73ffffffffffffffffffffffffffffffffffffffff161480610acb5750610aca81610ac5612453565b61204f565b5b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614036565b60405180910390fd5b610b14838361245b565b505050565b6000600a54905090565b600e60009054906101000a900460ff1681565b610b47610b41612453565b82612514565b610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d906141b6565b60405180910390fd5b610b918383836125f2565b505050565b6000600854905090565b610ba8612453565b73ffffffffffffffffffffffffffffffffffffffff16610bc66114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614116565b60405180910390fd5b80600d9080519060200190610c32929190613370565b5050565b610c3e612453565b73ffffffffffffffffffffffffffffffffffffffff16610c5c6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614116565b60405180910390fd5b60005b6011805490508161ffff1611610e94578161ffff1660118261ffff1681548110610d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614610d3a57610e81565b60116001601180549050610d4e9190614454565b81548110610d85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660118261ffff1681548110610de7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506011805480610e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055610e94565b8080610e8c906145cb565b915050610cb5565b5050565b610ea0612453565b73ffffffffffffffffffffffffffffffffffffffff16610ebe6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614116565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f5f573d6000803e3d6000fd5b5050565b610f7e8383836040518060200160405280600081525061194b565b505050565b610f8b612453565b73ffffffffffffffffffffffffffffffffffffffff16610fa96114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614116565b60405180910390fd5b8060078190555050565b6000611014826123e7565b611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613ff6565b60405180910390fd5b819050919050565b611063612453565b73ffffffffffffffffffffffffffffffffffffffff166110816114bd565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614116565b60405180910390fd5b8060088190555050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614096565b60405180910390fd5b80915050919050565b6000601180549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614076565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611260612453565b73ffffffffffffffffffffffffffffffffffffffff1661127e6114bd565b73ffffffffffffffffffffffffffffffffffffffff16146112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90614116565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061139c612453565b73ffffffffffffffffffffffffffffffffffffffff166113ba6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614116565b60405180910390fd5b60005b6011805490508161ffff1610156114b2578261ffff1660118261ffff1681548110611467577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16141561149f5760019150506114b8565b80806114aa906145cb565b915050611413565b50600090505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114f590614568565b80601f016020809104026020016040519081016040528092919081815260200182805461152190614568565b801561156e5780601f106115435761010080835404028352916020019161156e565b820191906000526020600020905b81548152906001019060200180831161155157829003601f168201915b5050505050905090565b611580612453565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590613fd6565b60405180910390fd5b80600660006115fb612453565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a8612453565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ed9190613ef9565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614016565b60405180910390fd5b60006007541415801561177c57504260075411155b6117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290614056565b60405180910390fd5b600854341015611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614156565b60405180910390fd5b600b54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a906141d6565b60405180910390fd5b6000601180549050116118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906141f6565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061191b906145f6565b9190505550600a6000815480929190611933906145f6565b91905055506119493361194461284e565b612a0d565b565b61195c611956612453565b83612514565b61199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906141b6565b60405180910390fd5b6119a784848484612bdb565b50505050565b6119b5612453565b73ffffffffffffffffffffffffffffffffffffffff166119d36114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090614116565b60405180910390fd5b8060078190555050565b6060611a3e826123e7565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614176565b60405180910390fd5b6000611a87612c37565b90506000815111611aa75760405180602001604052806000815250611ad2565b80611ab184612cc9565b604051602001611ac2929190613e0f565b6040516020818303038152906040525b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90614016565b60405180910390fd5b600060075414158015611b5d57504260075411155b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614056565b60405180910390fd5b80600854611baa91906143fa565b341015611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613f56565b60405180910390fd5b600b5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c3a9190614373565b1115611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906141d6565b60405180910390fd5b600c54811115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906140b6565b60405180910390fd5b806011805490501015611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff906141f6565b60405180910390fd5b60008167ffffffffffffffff811115611d4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d785781602001602082028036833780820191505090505b50905081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dca9190614373565b9250508190555081600a6000828254611de39190614373565b9250508190555060005b82811015611e5557611dfd61284e565b828281518110611e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e4d906145f6565b915050611ded565b50611e603382612e76565b5050565b6060600d8054611e7390614568565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9f90614568565b8015611eec5780601f10611ec157610100808354040283529160200191611eec565b820191906000526020600020905b815481529060010190602001808311611ecf57829003601f168201915b5050505050905090565b611efe612453565b73ffffffffffffffffffffffffffffffffffffffff16611f1c6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990614116565b60405180910390fd5b80516011805490501015611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906141f6565b60405180910390fd5b8051600a6000828254611fce9190614373565b9250508190555060005b81518110156120455761203282828151811061201d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161202d61284e565b612a0d565b808061203d906145f6565b915050611fd8565b5050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b6120f1612453565b73ffffffffffffffffffffffffffffffffffffffff1661210f6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90614116565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90613f76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61229a612453565b73ffffffffffffffffffffffffffffffffffffffff166122b86114bd565b73ffffffffffffffffffffffffffffffffffffffff161461230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590614116565b60405180910390fd5b600060118054905014612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90614216565b60405180910390fd5b6123603382612e76565b8051600a60008282546123739190614373565b9250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124ce836110e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061251f826123e7565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613ff6565b60405180910390fd5b6000612569836110e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125d857508373ffffffffffffffffffffffffffffffffffffffff166125c08461097c565b73ffffffffffffffffffffffffffffffffffffffff16145b806125e957506125e8818561204f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612612826110e1565b73ffffffffffffffffffffffffffffffffffffffff1614612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90614136565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90613fb6565b60405180910390fd5b6126e3838383613164565b6126ee60008261245b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273e9190614454565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127959190614373565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008061285f601180549050613169565b905060006011828154811061289d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050601160016011805490506128db9190614454565b81548110612912577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660118381548110612970577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060118054806129d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055809250505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a74906140d6565b60405180910390fd5b612a86816123e7565b15612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90613f96565b60405180910390fd5b612ad260008383613164565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b229190614373565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612be68484846125f2565b612bf2848484846131c6565b612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2890613f36565b60405180910390fd5b50505050565b6060600d8054612c4690614568565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7290614568565b8015612cbf5780601f10612c9457610100808354040283529160200191612cbf565b820191906000526020600020905b815481529060010190602001808311612ca257829003601f168201915b5050505050905090565b60606000821415612d11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e71565b600082905060005b60008214612d43578080612d2c906145f6565b915050600a82612d3c91906143c9565b9150612d19565b60008167ffffffffffffffff811115612d85577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612db75781602001600182028036833780820191505090505b5090505b60008514612e6a57600182612dd09190614454565b9150600a85612ddf9190614689565b6030612deb9190614373565b60f81b818381518110612e27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e6391906143c9565b9450612dbb565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edd906140d6565b60405180910390fd5b8051600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f369190614373565b9250508190555060005b815181101561315f57612f92828281518110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516123e7565b15612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990613f96565b60405180910390fd5b61301e600084848481518110613011577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613164565b826003600084848151811061305c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181815181106130e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48080613157906145f6565b915050612f40565b505050565b505050565b60008060118054905060014361317f9190614454565b40414433604051602001613197959493929190613e33565b6040516020818303038152906040528051906020012060001c905082816131be9190614689565b915050919050565b60006131e78473ffffffffffffffffffffffffffffffffffffffff1661335d565b15613350578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613210612453565b8786866040518563ffffffff1660e01b81526004016132329493929190613ead565b602060405180830381600087803b15801561324c57600080fd5b505af192505050801561327d57506040513d601f19601f8201168201806040525081019061327a91906138df565b60015b613300573d80600081146132ad576040519150601f19603f3d011682016040523d82523d6000602084013e6132b2565b606091505b506000815114156132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef90613f36565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613355565b600190505b949350505050565b600080823b905060008111915050919050565b82805461337c90614568565b90600052602060002090601f01602090048101928261339e57600085556133e5565b82601f106133b757805160ff19168380011785556133e5565b828001600101855582156133e5579182015b828111156133e45782518255916020019190600101906133c9565b5b5090506133f291906133f6565b5090565b5b8082111561340f5760008160009055506001016133f7565b5090565b600061342661342184614276565b614251565b9050808382526020820190508285602086028201111561344557600080fd5b60005b85811015613475578161345b8882613567565b845260208401935060208301925050600181019050613448565b5050509392505050565b600061349261348d846142a2565b614251565b905080838252602082019050828560208602820111156134b157600080fd5b60005b858110156134e157816134c78882613678565b8452602084019350602083019250506001810190506134b4565b5050509392505050565b60006134fe6134f9846142ce565b614251565b90508281526020810184848401111561351657600080fd5b613521848285614526565b509392505050565b600061353c613537846142ff565b614251565b90508281526020810184848401111561355457600080fd5b61355f848285614526565b509392505050565b60008135905061357681614da6565b92915050565b600082601f83011261358d57600080fd5b813561359d848260208601613413565b91505092915050565b600082601f8301126135b757600080fd5b81356135c784826020860161347f565b91505092915050565b6000813590506135df81614dbd565b92915050565b6000813590506135f481614dd4565b92915050565b60008151905061360981614dd4565b92915050565b600082601f83011261362057600080fd5b81356136308482602086016134eb565b91505092915050565b600082601f83011261364a57600080fd5b813561365a848260208601613529565b91505092915050565b60008135905061367281614deb565b92915050565b60008135905061368781614e02565b92915050565b60006020828403121561369f57600080fd5b60006136ad84828501613567565b91505092915050565b600080604083850312156136c957600080fd5b60006136d785828601613567565b92505060206136e885828601613567565b9150509250929050565b60008060006060848603121561370757600080fd5b600061371586828701613567565b935050602061372686828701613567565b925050604061373786828701613678565b9150509250925092565b6000806000806080858703121561375757600080fd5b600061376587828801613567565b945050602061377687828801613567565b935050604061378787828801613678565b925050606085013567ffffffffffffffff8111156137a457600080fd5b6137b08782880161360f565b91505092959194509250565b600080604083850312156137cf57600080fd5b60006137dd85828601613567565b92505060206137ee858286016135d0565b9150509250929050565b6000806040838503121561380b57600080fd5b600061381985828601613567565b925050602061382a85828601613678565b9150509250929050565b60006020828403121561384657600080fd5b600082013567ffffffffffffffff81111561386057600080fd5b61386c8482850161357c565b91505092915050565b60006020828403121561388757600080fd5b600082013567ffffffffffffffff8111156138a157600080fd5b6138ad848285016135a6565b91505092915050565b6000602082840312156138c857600080fd5b60006138d6848285016135e5565b91505092915050565b6000602082840312156138f157600080fd5b60006138ff848285016135fa565b91505092915050565b60006020828403121561391a57600080fd5b600082013567ffffffffffffffff81111561393457600080fd5b61394084828501613639565b91505092915050565b60006020828403121561395b57600080fd5b600061396984828501613663565b91505092915050565b60006020828403121561398457600080fd5b600061399284828501613678565b91505092915050565b6139ac6139a78261449a565b614651565b82525050565b6139bb81614488565b82525050565b6139d26139cd82614488565b61463f565b82525050565b6139e1816144ac565b82525050565b6139f86139f3826144b8565b614663565b82525050565b6000613a0982614330565b613a138185614346565b9350613a23818560208601614535565b613a2c81614776565b840191505092915050565b6000613a428261433b565b613a4c8185614357565b9350613a5c818560208601614535565b613a6581614776565b840191505092915050565b6000613a7b8261433b565b613a858185614368565b9350613a95818560208601614535565b80840191505092915050565b6000613aae603283614357565b9150613ab982614794565b604082019050919050565b6000613ad1602483614357565b9150613adc826147e3565b604082019050919050565b6000613af4602683614357565b9150613aff82614832565b604082019050919050565b6000613b17601c83614357565b9150613b2282614881565b602082019050919050565b6000613b3a602483614357565b9150613b45826148aa565b604082019050919050565b6000613b5d601983614357565b9150613b68826148f9565b602082019050919050565b6000613b80602c83614357565b9150613b8b82614922565b604082019050919050565b6000613ba3601e83614357565b9150613bae82614971565b602082019050919050565b6000613bc6603883614357565b9150613bd18261499a565b604082019050919050565b6000613be9601183614357565b9150613bf4826149e9565b602082019050919050565b6000613c0c602a83614357565b9150613c1782614a12565b604082019050919050565b6000613c2f602983614357565b9150613c3a82614a61565b604082019050919050565b6000613c52602d83614357565b9150613c5d82614ab0565b604082019050919050565b6000613c75602083614357565b9150613c8082614aff565b602082019050919050565b6000613c98602c83614357565b9150613ca382614b28565b604082019050919050565b6000613cbb602083614357565b9150613cc682614b77565b602082019050919050565b6000613cde602983614357565b9150613ce982614ba0565b604082019050919050565b6000613d01602283614357565b9150613d0c82614bef565b604082019050919050565b6000613d24602f83614357565b9150613d2f82614c3e565b604082019050919050565b6000613d47602183614357565b9150613d5282614c8d565b604082019050919050565b6000613d6a603183614357565b9150613d7582614cdc565b604082019050919050565b6000613d8d601c83614357565b9150613d9882614d2b565b602082019050919050565b6000613db0601c83614357565b9150613dbb82614d54565b602082019050919050565b6000613dd3602083614357565b9150613dde82614d7d565b602082019050919050565b613df28161451c565b82525050565b613e09613e048261451c565b61467f565b82525050565b6000613e1b8285613a70565b9150613e278284613a70565b91508190509392505050565b6000613e3f8288613df8565b602082019150613e4f82876139e7565b602082019150613e5f828661399b565b601482019150613e6f8285613df8565b602082019150613e7f82846139c1565b6014820191508190509695505050505050565b6000602082019050613ea760008301846139b2565b92915050565b6000608082019050613ec260008301876139b2565b613ecf60208301866139b2565b613edc6040830185613de9565b8181036060830152613eee81846139fe565b905095945050505050565b6000602082019050613f0e60008301846139d8565b92915050565b60006020820190508181036000830152613f2e8184613a37565b905092915050565b60006020820190508181036000830152613f4f81613aa1565b9050919050565b60006020820190508181036000830152613f6f81613ac4565b9050919050565b60006020820190508181036000830152613f8f81613ae7565b9050919050565b60006020820190508181036000830152613faf81613b0a565b9050919050565b60006020820190508181036000830152613fcf81613b2d565b9050919050565b60006020820190508181036000830152613fef81613b50565b9050919050565b6000602082019050818103600083015261400f81613b73565b9050919050565b6000602082019050818103600083015261402f81613b96565b9050919050565b6000602082019050818103600083015261404f81613bb9565b9050919050565b6000602082019050818103600083015261406f81613bdc565b9050919050565b6000602082019050818103600083015261408f81613bff565b9050919050565b600060208201905081810360008301526140af81613c22565b9050919050565b600060208201905081810360008301526140cf81613c45565b9050919050565b600060208201905081810360008301526140ef81613c68565b9050919050565b6000602082019050818103600083015261410f81613c8b565b9050919050565b6000602082019050818103600083015261412f81613cae565b9050919050565b6000602082019050818103600083015261414f81613cd1565b9050919050565b6000602082019050818103600083015261416f81613cf4565b9050919050565b6000602082019050818103600083015261418f81613d17565b9050919050565b600060208201905081810360008301526141af81613d3a565b9050919050565b600060208201905081810360008301526141cf81613d5d565b9050919050565b600060208201905081810360008301526141ef81613d80565b9050919050565b6000602082019050818103600083015261420f81613da3565b9050919050565b6000602082019050818103600083015261422f81613dc6565b9050919050565b600060208201905061424b6000830184613de9565b92915050565b600061425b61426c565b9050614267828261459a565b919050565b6000604051905090565b600067ffffffffffffffff82111561429157614290614747565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142bd576142bc614747565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142e9576142e8614747565b5b6142f282614776565b9050602081019050919050565b600067ffffffffffffffff82111561431a57614319614747565b5b61432382614776565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437e8261451c565b91506143898361451c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143be576143bd6146ba565b5b828201905092915050565b60006143d48261451c565b91506143df8361451c565b9250826143ef576143ee6146e9565b5b828204905092915050565b60006144058261451c565b91506144108361451c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614449576144486146ba565b5b828202905092915050565b600061445f8261451c565b915061446a8361451c565b92508282101561447d5761447c6146ba565b5b828203905092915050565b6000614493826144fc565b9050919050565b60006144a5826144fc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614553578082015181840152602081019050614538565b83811115614562576000848401525b50505050565b6000600282049050600182168061458057607f821691505b6020821081141561459457614593614718565b5b50919050565b6145a382614776565b810181811067ffffffffffffffff821117156145c2576145c1614747565b5b80604052505050565b60006145d6826144ee565b915061ffff8214156145eb576145ea6146ba565b5b600182019050919050565b60006146018261451c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614634576146336146ba565b5b600182019050919050565b600061464a8261466d565b9050919050565b600061465c8261466d565b9050919050565b6000819050919050565b600061467882614787565b9050919050565b6000819050919050565b60006146948261451c565b915061469f8361451c565b9250826146af576146ae6146e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468657220746f20636c61696d2074686520736c60008201527f6963657300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520746f6f206561726c79000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c7920636c61696d20313020736c6963657320696e2060008201527f31207472616e73616374696f6e00000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468657220746f20636c61696d20616e20736c6960008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f596f752063616e6e6f7420636c61696d206d6f726520736c6963657300000000600082015250565b7f4e6f20736c69636573206c65667420746f20626520636c61696d656400000000600082015250565b7f417661696c61626c6520736c696365732061726520616c726561647920736574600082015250565b614daf81614488565b8114614dba57600080fd5b50565b614dc6816144ac565b8114614dd157600080fd5b50565b614ddd816144c2565b8114614de857600080fd5b50565b614df4816144ee565b8114614dff57600080fd5b50565b614e0b8161451c565b8114614e1657600080fd5b5056fea2646970667358221220fa041b611ed9ac0066da463946d14ab2f326adb71011a65fc5d9386c7afdcb7e64736f6c6343000804003368747470733a2f2f646f6d696e617065732e73332e75732d776573742d312e616d617a6f6e6177732e636f6d2f

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a0823111610118578063c87b56dd116100a0578063da67e22a1161006f578063da67e22a14610723578063e985e9c51461074e578063e9be0f3f1461078b578063f2fde38b146107b6578063fc14ba49146107df57610204565b8063c87b56dd14610676578063d4f0a7e1146106b3578063d547cfb7146106cf578063d89377f4146106fa57610204565b806395d89b41116100e757806395d89b41146105c6578063a22cb465146105f1578063b73c4bd71461061a578063b88d4fde14610624578063c2416c8c1461064d57610204565b806370a082311461050a578063715018a61461054757806386266e8a1461055e5780638da5cb5b1461059b57610204565b806330176e131161019b578063493143e41161016a578063493143e4146104135780634f6ccce71461043c5780635445d956146104795780636352211e146104a25780636e5eb109146104df57610204565b806330176e13146103815780633c29a4d9146103aa5780633ccfd60b146103d357806342842e0e146103ea57610204565b806318160ddd116101d757806318160ddd146102d75780632344e9181461030257806323b872dd1461032d5780632fbc0bf11461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906138b6565b610808565b60405161023d9190613ef9565b60405180910390f35b34801561025257600080fd5b5061025b6108ea565b6040516102689190613f14565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613972565b61097c565b6040516102a59190613e92565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906137f8565b610a01565b005b3480156102e357600080fd5b506102ec610b19565b6040516102f99190614236565b60405180910390f35b34801561030e57600080fd5b50610317610b23565b6040516103249190613ef9565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f91906136f2565b610b36565b005b34801561036257600080fd5b5061036b610b96565b6040516103789190614236565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613908565b610ba0565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613949565b610c36565b005b3480156103df57600080fd5b506103e8610e98565b005b3480156103f657600080fd5b50610411600480360381019061040c91906136f2565b610f63565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613972565b610f83565b005b34801561044857600080fd5b50610463600480360381019061045e9190613972565b611009565b6040516104709190614236565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613972565b61105b565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613972565b6110e1565b6040516104d69190613e92565b60405180910390f35b3480156104eb57600080fd5b506104f4611193565b6040516105019190614236565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061368d565b6111a0565b60405161053e9190614236565b60405180910390f35b34801561055357600080fd5b5061055c611258565b005b34801561056a57600080fd5b5061058560048036038101906105809190613949565b611392565b6040516105929190613ef9565b60405180910390f35b3480156105a757600080fd5b506105b06114bd565b6040516105bd9190613e92565b60405180910390f35b3480156105d257600080fd5b506105db6114e6565b6040516105e89190613f14565b60405180910390f35b3480156105fd57600080fd5b50610618600480360381019061061391906137bc565b611578565b005b6106226116f9565b005b34801561063057600080fd5b5061064b60048036038101906106469190613741565b61194b565b005b34801561065957600080fd5b50610674600480360381019061066f9190613972565b6119ad565b005b34801561068257600080fd5b5061069d60048036038101906106989190613972565b611a33565b6040516106aa9190613f14565b60405180910390f35b6106cd60048036038101906106c89190613972565b611ada565b005b3480156106db57600080fd5b506106e4611e64565b6040516106f19190613f14565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190613834565b611ef6565b005b34801561072f57600080fd5b50610738612049565b6040516107459190614236565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906136b6565b61204f565b6040516107829190613ef9565b60405180910390f35b34801561079757600080fd5b506107a06120e3565b6040516107ad9190614236565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d8919061368d565b6120e9565b005b3480156107eb57600080fd5b5061080660048036038101906108019190613875565b612292565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e357506108e28261237d565b5b9050919050565b6060600180546108f990614568565b80601f016020809104026020016040519081016040528092919081815260200182805461092590614568565b80156109725780601f1061094757610100808354040283529160200191610972565b820191906000526020600020905b81548152906001019060200180831161095557829003601f168201915b5050505050905090565b6000610987826123e7565b6109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906140f6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c826110e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7490614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a9c612453565b73ffffffffffffffffffffffffffffffffffffffff161480610acb5750610aca81610ac5612453565b61204f565b5b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614036565b60405180910390fd5b610b14838361245b565b505050565b6000600a54905090565b600e60009054906101000a900460ff1681565b610b47610b41612453565b82612514565b610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d906141b6565b60405180910390fd5b610b918383836125f2565b505050565b6000600854905090565b610ba8612453565b73ffffffffffffffffffffffffffffffffffffffff16610bc66114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614116565b60405180910390fd5b80600d9080519060200190610c32929190613370565b5050565b610c3e612453565b73ffffffffffffffffffffffffffffffffffffffff16610c5c6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614116565b60405180910390fd5b60005b6011805490508161ffff1611610e94578161ffff1660118261ffff1681548110610d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1614610d3a57610e81565b60116001601180549050610d4e9190614454565b81548110610d85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660118261ffff1681548110610de7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506011805480610e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055610e94565b8080610e8c906145cb565b915050610cb5565b5050565b610ea0612453565b73ffffffffffffffffffffffffffffffffffffffff16610ebe6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614116565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f5f573d6000803e3d6000fd5b5050565b610f7e8383836040518060200160405280600081525061194b565b505050565b610f8b612453565b73ffffffffffffffffffffffffffffffffffffffff16610fa96114bd565b73ffffffffffffffffffffffffffffffffffffffff1614610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614116565b60405180910390fd5b8060078190555050565b6000611014826123e7565b611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613ff6565b60405180910390fd5b819050919050565b611063612453565b73ffffffffffffffffffffffffffffffffffffffff166110816114bd565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614116565b60405180910390fd5b8060088190555050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190614096565b60405180910390fd5b80915050919050565b6000601180549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614076565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611260612453565b73ffffffffffffffffffffffffffffffffffffffff1661127e6114bd565b73ffffffffffffffffffffffffffffffffffffffff16146112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90614116565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061139c612453565b73ffffffffffffffffffffffffffffffffffffffff166113ba6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790614116565b60405180910390fd5b60005b6011805490508161ffff1610156114b2578261ffff1660118261ffff1681548110611467577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16141561149f5760019150506114b8565b80806114aa906145cb565b915050611413565b50600090505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114f590614568565b80601f016020809104026020016040519081016040528092919081815260200182805461152190614568565b801561156e5780601f106115435761010080835404028352916020019161156e565b820191906000526020600020905b81548152906001019060200180831161155157829003601f168201915b5050505050905090565b611580612453565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590613fd6565b60405180910390fd5b80600660006115fb612453565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a8612453565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116ed9190613ef9565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614016565b60405180910390fd5b60006007541415801561177c57504260075411155b6117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290614056565b60405180910390fd5b600854341015611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614156565b60405180910390fd5b600b54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a906141d6565b60405180910390fd5b6000601180549050116118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906141f6565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061191b906145f6565b9190505550600a6000815480929190611933906145f6565b91905055506119493361194461284e565b612a0d565b565b61195c611956612453565b83612514565b61199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906141b6565b60405180910390fd5b6119a784848484612bdb565b50505050565b6119b5612453565b73ffffffffffffffffffffffffffffffffffffffff166119d36114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2090614116565b60405180910390fd5b8060078190555050565b6060611a3e826123e7565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490614176565b60405180910390fd5b6000611a87612c37565b90506000815111611aa75760405180602001604052806000815250611ad2565b80611ab184612cc9565b604051602001611ac2929190613e0f565b6040516020818303038152906040525b915050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f90614016565b60405180910390fd5b600060075414158015611b5d57504260075411155b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614056565b60405180910390fd5b80600854611baa91906143fa565b341015611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613f56565b60405180910390fd5b600b5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c3a9190614373565b1115611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906141d6565b60405180910390fd5b600c54811115611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb7906140b6565b60405180910390fd5b806011805490501015611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff906141f6565b60405180910390fd5b60008167ffffffffffffffff811115611d4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d785781602001602082028036833780820191505090505b50905081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dca9190614373565b9250508190555081600a6000828254611de39190614373565b9250508190555060005b82811015611e5557611dfd61284e565b828281518110611e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611e4d906145f6565b915050611ded565b50611e603382612e76565b5050565b6060600d8054611e7390614568565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9f90614568565b8015611eec5780601f10611ec157610100808354040283529160200191611eec565b820191906000526020600020905b815481529060010190602001808311611ecf57829003601f168201915b5050505050905090565b611efe612453565b73ffffffffffffffffffffffffffffffffffffffff16611f1c6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990614116565b60405180910390fd5b80516011805490501015611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906141f6565b60405180910390fd5b8051600a6000828254611fce9190614373565b9250508190555060005b81518110156120455761203282828151811061201d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161202d61284e565b612a0d565b808061203d906145f6565b915050611fd8565b5050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b6120f1612453565b73ffffffffffffffffffffffffffffffffffffffff1661210f6114bd565b73ffffffffffffffffffffffffffffffffffffffff1614612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90614116565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90613f76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61229a612453565b73ffffffffffffffffffffffffffffffffffffffff166122b86114bd565b73ffffffffffffffffffffffffffffffffffffffff161461230e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230590614116565b60405180910390fd5b600060118054905014612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d90614216565b60405180910390fd5b6123603382612e76565b8051600a60008282546123739190614373565b9250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124ce836110e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061251f826123e7565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613ff6565b60405180910390fd5b6000612569836110e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125d857508373ffffffffffffffffffffffffffffffffffffffff166125c08461097c565b73ffffffffffffffffffffffffffffffffffffffff16145b806125e957506125e8818561204f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612612826110e1565b73ffffffffffffffffffffffffffffffffffffffff1614612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90614136565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90613fb6565b60405180910390fd5b6126e3838383613164565b6126ee60008261245b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273e9190614454565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127959190614373565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008061285f601180549050613169565b905060006011828154811061289d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050601160016011805490506128db9190614454565b81548110612912577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660118381548110612970577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060118054806129d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff02191690559055809250505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a74906140d6565b60405180910390fd5b612a86816123e7565b15612ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abd90613f96565b60405180910390fd5b612ad260008383613164565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b229190614373565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612be68484846125f2565b612bf2848484846131c6565b612c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2890613f36565b60405180910390fd5b50505050565b6060600d8054612c4690614568565b80601f0160208091040260200160405190810160405280929190818152602001828054612c7290614568565b8015612cbf5780601f10612c9457610100808354040283529160200191612cbf565b820191906000526020600020905b815481529060010190602001808311612ca257829003601f168201915b5050505050905090565b60606000821415612d11576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e71565b600082905060005b60008214612d43578080612d2c906145f6565b915050600a82612d3c91906143c9565b9150612d19565b60008167ffffffffffffffff811115612d85577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612db75781602001600182028036833780820191505090505b5090505b60008514612e6a57600182612dd09190614454565b9150600a85612ddf9190614689565b6030612deb9190614373565b60f81b818381518110612e27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e6391906143c9565b9450612dbb565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edd906140d6565b60405180910390fd5b8051600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f369190614373565b9250508190555060005b815181101561315f57612f92828281518110612f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516123e7565b15612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990613f96565b60405180910390fd5b61301e600084848481518110613011577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613164565b826003600084848151811061305c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181815181106130e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48080613157906145f6565b915050612f40565b505050565b505050565b60008060118054905060014361317f9190614454565b40414433604051602001613197959493929190613e33565b6040516020818303038152906040528051906020012060001c905082816131be9190614689565b915050919050565b60006131e78473ffffffffffffffffffffffffffffffffffffffff1661335d565b15613350578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613210612453565b8786866040518563ffffffff1660e01b81526004016132329493929190613ead565b602060405180830381600087803b15801561324c57600080fd5b505af192505050801561327d57506040513d601f19601f8201168201806040525081019061327a91906138df565b60015b613300573d80600081146132ad576040519150601f19603f3d011682016040523d82523d6000602084013e6132b2565b606091505b506000815114156132f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ef90613f36565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613355565b600190505b949350505050565b600080823b905060008111915050919050565b82805461337c90614568565b90600052602060002090601f01602090048101928261339e57600085556133e5565b82601f106133b757805160ff19168380011785556133e5565b828001600101855582156133e5579182015b828111156133e45782518255916020019190600101906133c9565b5b5090506133f291906133f6565b5090565b5b8082111561340f5760008160009055506001016133f7565b5090565b600061342661342184614276565b614251565b9050808382526020820190508285602086028201111561344557600080fd5b60005b85811015613475578161345b8882613567565b845260208401935060208301925050600181019050613448565b5050509392505050565b600061349261348d846142a2565b614251565b905080838252602082019050828560208602820111156134b157600080fd5b60005b858110156134e157816134c78882613678565b8452602084019350602083019250506001810190506134b4565b5050509392505050565b60006134fe6134f9846142ce565b614251565b90508281526020810184848401111561351657600080fd5b613521848285614526565b509392505050565b600061353c613537846142ff565b614251565b90508281526020810184848401111561355457600080fd5b61355f848285614526565b509392505050565b60008135905061357681614da6565b92915050565b600082601f83011261358d57600080fd5b813561359d848260208601613413565b91505092915050565b600082601f8301126135b757600080fd5b81356135c784826020860161347f565b91505092915050565b6000813590506135df81614dbd565b92915050565b6000813590506135f481614dd4565b92915050565b60008151905061360981614dd4565b92915050565b600082601f83011261362057600080fd5b81356136308482602086016134eb565b91505092915050565b600082601f83011261364a57600080fd5b813561365a848260208601613529565b91505092915050565b60008135905061367281614deb565b92915050565b60008135905061368781614e02565b92915050565b60006020828403121561369f57600080fd5b60006136ad84828501613567565b91505092915050565b600080604083850312156136c957600080fd5b60006136d785828601613567565b92505060206136e885828601613567565b9150509250929050565b60008060006060848603121561370757600080fd5b600061371586828701613567565b935050602061372686828701613567565b925050604061373786828701613678565b9150509250925092565b6000806000806080858703121561375757600080fd5b600061376587828801613567565b945050602061377687828801613567565b935050604061378787828801613678565b925050606085013567ffffffffffffffff8111156137a457600080fd5b6137b08782880161360f565b91505092959194509250565b600080604083850312156137cf57600080fd5b60006137dd85828601613567565b92505060206137ee858286016135d0565b9150509250929050565b6000806040838503121561380b57600080fd5b600061381985828601613567565b925050602061382a85828601613678565b9150509250929050565b60006020828403121561384657600080fd5b600082013567ffffffffffffffff81111561386057600080fd5b61386c8482850161357c565b91505092915050565b60006020828403121561388757600080fd5b600082013567ffffffffffffffff8111156138a157600080fd5b6138ad848285016135a6565b91505092915050565b6000602082840312156138c857600080fd5b60006138d6848285016135e5565b91505092915050565b6000602082840312156138f157600080fd5b60006138ff848285016135fa565b91505092915050565b60006020828403121561391a57600080fd5b600082013567ffffffffffffffff81111561393457600080fd5b61394084828501613639565b91505092915050565b60006020828403121561395b57600080fd5b600061396984828501613663565b91505092915050565b60006020828403121561398457600080fd5b600061399284828501613678565b91505092915050565b6139ac6139a78261449a565b614651565b82525050565b6139bb81614488565b82525050565b6139d26139cd82614488565b61463f565b82525050565b6139e1816144ac565b82525050565b6139f86139f3826144b8565b614663565b82525050565b6000613a0982614330565b613a138185614346565b9350613a23818560208601614535565b613a2c81614776565b840191505092915050565b6000613a428261433b565b613a4c8185614357565b9350613a5c818560208601614535565b613a6581614776565b840191505092915050565b6000613a7b8261433b565b613a858185614368565b9350613a95818560208601614535565b80840191505092915050565b6000613aae603283614357565b9150613ab982614794565b604082019050919050565b6000613ad1602483614357565b9150613adc826147e3565b604082019050919050565b6000613af4602683614357565b9150613aff82614832565b604082019050919050565b6000613b17601c83614357565b9150613b2282614881565b602082019050919050565b6000613b3a602483614357565b9150613b45826148aa565b604082019050919050565b6000613b5d601983614357565b9150613b68826148f9565b602082019050919050565b6000613b80602c83614357565b9150613b8b82614922565b604082019050919050565b6000613ba3601e83614357565b9150613bae82614971565b602082019050919050565b6000613bc6603883614357565b9150613bd18261499a565b604082019050919050565b6000613be9601183614357565b9150613bf4826149e9565b602082019050919050565b6000613c0c602a83614357565b9150613c1782614a12565b604082019050919050565b6000613c2f602983614357565b9150613c3a82614a61565b604082019050919050565b6000613c52602d83614357565b9150613c5d82614ab0565b604082019050919050565b6000613c75602083614357565b9150613c8082614aff565b602082019050919050565b6000613c98602c83614357565b9150613ca382614b28565b604082019050919050565b6000613cbb602083614357565b9150613cc682614b77565b602082019050919050565b6000613cde602983614357565b9150613ce982614ba0565b604082019050919050565b6000613d01602283614357565b9150613d0c82614bef565b604082019050919050565b6000613d24602f83614357565b9150613d2f82614c3e565b604082019050919050565b6000613d47602183614357565b9150613d5282614c8d565b604082019050919050565b6000613d6a603183614357565b9150613d7582614cdc565b604082019050919050565b6000613d8d601c83614357565b9150613d9882614d2b565b602082019050919050565b6000613db0601c83614357565b9150613dbb82614d54565b602082019050919050565b6000613dd3602083614357565b9150613dde82614d7d565b602082019050919050565b613df28161451c565b82525050565b613e09613e048261451c565b61467f565b82525050565b6000613e1b8285613a70565b9150613e278284613a70565b91508190509392505050565b6000613e3f8288613df8565b602082019150613e4f82876139e7565b602082019150613e5f828661399b565b601482019150613e6f8285613df8565b602082019150613e7f82846139c1565b6014820191508190509695505050505050565b6000602082019050613ea760008301846139b2565b92915050565b6000608082019050613ec260008301876139b2565b613ecf60208301866139b2565b613edc6040830185613de9565b8181036060830152613eee81846139fe565b905095945050505050565b6000602082019050613f0e60008301846139d8565b92915050565b60006020820190508181036000830152613f2e8184613a37565b905092915050565b60006020820190508181036000830152613f4f81613aa1565b9050919050565b60006020820190508181036000830152613f6f81613ac4565b9050919050565b60006020820190508181036000830152613f8f81613ae7565b9050919050565b60006020820190508181036000830152613faf81613b0a565b9050919050565b60006020820190508181036000830152613fcf81613b2d565b9050919050565b60006020820190508181036000830152613fef81613b50565b9050919050565b6000602082019050818103600083015261400f81613b73565b9050919050565b6000602082019050818103600083015261402f81613b96565b9050919050565b6000602082019050818103600083015261404f81613bb9565b9050919050565b6000602082019050818103600083015261406f81613bdc565b9050919050565b6000602082019050818103600083015261408f81613bff565b9050919050565b600060208201905081810360008301526140af81613c22565b9050919050565b600060208201905081810360008301526140cf81613c45565b9050919050565b600060208201905081810360008301526140ef81613c68565b9050919050565b6000602082019050818103600083015261410f81613c8b565b9050919050565b6000602082019050818103600083015261412f81613cae565b9050919050565b6000602082019050818103600083015261414f81613cd1565b9050919050565b6000602082019050818103600083015261416f81613cf4565b9050919050565b6000602082019050818103600083015261418f81613d17565b9050919050565b600060208201905081810360008301526141af81613d3a565b9050919050565b600060208201905081810360008301526141cf81613d5d565b9050919050565b600060208201905081810360008301526141ef81613d80565b9050919050565b6000602082019050818103600083015261420f81613da3565b9050919050565b6000602082019050818103600083015261422f81613dc6565b9050919050565b600060208201905061424b6000830184613de9565b92915050565b600061425b61426c565b9050614267828261459a565b919050565b6000604051905090565b600067ffffffffffffffff82111561429157614290614747565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142bd576142bc614747565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142e9576142e8614747565b5b6142f282614776565b9050602081019050919050565b600067ffffffffffffffff82111561431a57614319614747565b5b61432382614776565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437e8261451c565b91506143898361451c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143be576143bd6146ba565b5b828201905092915050565b60006143d48261451c565b91506143df8361451c565b9250826143ef576143ee6146e9565b5b828204905092915050565b60006144058261451c565b91506144108361451c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614449576144486146ba565b5b828202905092915050565b600061445f8261451c565b915061446a8361451c565b92508282101561447d5761447c6146ba565b5b828203905092915050565b6000614493826144fc565b9050919050565b60006144a5826144fc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614553578082015181840152602081019050614538565b83811115614562576000848401525b50505050565b6000600282049050600182168061458057607f821691505b6020821081141561459457614593614718565b5b50919050565b6145a382614776565b810181811067ffffffffffffffff821117156145c2576145c1614747565b5b80604052505050565b60006145d6826144ee565b915061ffff8214156145eb576145ea6146ba565b5b600182019050919050565b60006146018261451c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614634576146336146ba565b5b600182019050919050565b600061464a8261466d565b9050919050565b600061465c8261466d565b9050919050565b6000819050919050565b600061467882614787565b9050919050565b6000819050919050565b60006146948261451c565b915061469f8361451c565b9250826146af576146ae6146e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468657220746f20636c61696d2074686520736c60008201527f6963657300000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520746f6f206561726c79000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c7920636c61696d20313020736c6963657320696e2060008201527f31207472616e73616374696f6e00000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820457468657220746f20636c61696d20616e20736c6960008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f596f752063616e6e6f7420636c61696d206d6f726520736c6963657300000000600082015250565b7f4e6f20736c69636573206c65667420746f20626520636c61696d656400000000600082015250565b7f417661696c61626c6520736c696365732061726520616c726561647920736574600082015250565b614daf81614488565b8114614dba57600080fd5b50565b614dc6816144ac565b8114614dd157600080fd5b50565b614ddd816144c2565b8114614de857600080fd5b50565b614df4816144ee565b8114614dff57600080fd5b50565b614e0b8161451c565b8114614e1657600080fd5b5056fea2646970667358221220fa041b611ed9ac0066da463946d14ab2f326adb71011a65fc5d9386c7afdcb7e64736f6c63430008040033

Deployed Bytecode Sourcemap

81:8607:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1524:344:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2642:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4188:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3703:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7149:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;843:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5202:364:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7001:89:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1469:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2048:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1225:152;;;;;;;;;;;;;:::i;:::-;;5632:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3131:136:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6355:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1634:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2267:313:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6835:108:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1927:283:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:10;;;;;;;;;;;;;:::i;:::-;;3345:307:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2804:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4550:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4854:495:2;;;:::i;:::-;;5877:354:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2911:136:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2972:451:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5413:879:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6650:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3731:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;480:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4934:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;887:33:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2557:269:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1524:344:4;1666:4;1720:25;1705:40;;;:11;:40;;;;:104;;;;1776:33;1761:48;;;:11;:48;;;;1705:104;:156;;;;1825:36;1849:11;1825:23;:36::i;:::-;1705:156;1686:175;;1524:344;;;:::o;2642:98::-;2696:13;2728:5;2721:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2642:98;:::o;4188:295::-;4304:7;4348:16;4356:7;4348;:16::i;:::-;4327:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;4452:15;:24;4468:7;4452:24;;;;;;;;;;;;;;;;;;;;;4445:31;;4188:295;;;:::o;3703:424::-;3783:13;3799:23;3814:7;3799:14;:23::i;:::-;3783:39;;3846:5;3840:11;;:2;:11;;;;3832:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3937:5;3921:21;;:12;:10;:12::i;:::-;:21;;;:85;;;;3962:44;3986:5;3993:12;:10;:12::i;:::-;3962:23;:44::i;:::-;3921:85;3900:188;;;;;;;;;;;;:::i;:::-;;;;;;;;;4099:21;4108:2;4112:7;4099:8;:21::i;:::-;3703:424;;;:::o;7149:104:2:-;7203:7;7229:17;;7222:24;;7149:104;:::o;843:38::-;;;;;;;;;;;;;:::o;5202:364:4:-;5404:41;5423:12;:10;:12::i;:::-;5437:7;5404:18;:41::i;:::-;5383:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;5531:28;5541:4;5547:2;5551:7;5531:9;:28::i;:::-;5202:364;;;:::o;7001:89:2:-;7048:7;7074:9;;7067:16;;7001:89;:::o;1469:95::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1553:4:2::1;1543:7;:14;;;;;;;;;;;;:::i;:::-;;1469:95:::0;:::o;2048:395::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2159:8:2::1;2154:283;2174:15;:22;;;;2169:1;:27;;;2154:283;;2243:7;2221:29;;:15;2237:1;2221:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;2217:76;;2270:8;;2217:76;2328:15;2369:1;2344:15;:22;;;;:26;;;;:::i;:::-;2328:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2307:15;2323:1;2307:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;2385:15;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2421:5;;2154:283;2198:3;;;;;:::i;:::-;;;;2154:283;;;;2048:395:::0;:::o;1225:152::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1274:20:2::1;1297:21;1274:44;;1336:10;1328:28;;:42;1357:12;1328:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1343:1:10;1225:152:2:o:0;5632:179:4:-;5765:39;5782:4;5788:2;5792:7;5765:39;;;;;;;;;;;;:16;:39::i;:::-;5632:179;;;:::o;3131:136:2:-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3246:14:2::1;3230:13;:30;;;;3131:136:::0;:::o;6355:220::-;6417:7;6457:16;6465:7;6457;:16::i;:::-;6436:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;6561:7;6554:14;;6355:220;;;:::o;1634:100::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1717:10:2::1;1705:9;:22;;;;1634:100:::0;:::o;2267:313:4:-;2379:7;2402:13;2418:7;:16;2426:7;2418:16;;;;;;;;;;;;;;;;;;;;;2402:32;;2482:1;2465:19;;:5;:19;;;;2444:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2568:5;2561:12;;;2267:313;;;:::o;6835:108:2:-;6888:7;6914:15;:22;;;;6907:29;;6835:108;:::o;1927:283:4:-;2039:7;2100:1;2083:19;;:5;:19;;;;2062:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2187:9;:16;2197:5;2187:16;;;;;;;;;;;;;;;;2180:23;;1927:283;;;:::o;1693:145:10:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;::::0;::::1;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;3345:307:2:-;3452:4;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3477:8:2::1;3472:151;3491:15;:22;;;;3487:1;:26;;;3472:151;;;3560:7;3538:29;;:15;3554:1;3538:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;3534:79;;;3594:4;3587:11;;;;;3534:79;3515:3;;;;;:::i;:::-;;;;3472:151;;;;3640:5;3633:12;;1343:1:10;3345:307:2::0;;;:::o;1061:85:10:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2804:102:4:-;2860:13;2892:7;2885:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2804:102;:::o;4550:318::-;4692:12;:10;:12::i;:::-;4680:24;;:8;:24;;;;4672:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:8;4745:18;:32;4764:12;:10;:12::i;:::-;4745:32;;;;;;;;;;;;;;;:42;4778:8;4745:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4842:8;4813:48;;4828:12;:10;:12::i;:::-;4813:48;;;4852:8;4813:48;;;;;;:::i;:::-;;;;;;;;4550:318;;:::o;4854:495:2:-;235:10;222:23;;:9;:23;;;214:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;375:1:::1;358:13;;:18;;:54;;;;;397:15;380:13;;:32;;358:54;337:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;4948:9:::2;;4935;:22;;4927:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;5065:18;;5028:22;:34;5051:10;5028:34;;;;;;;;;;;;;;;;:55;5007:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;5181:1;5156:15;:22;;;;:26;5148:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5226:22;:34;5249:10;5226:34;;;;;;;;;;;;;;;;:36;;;;;;;;;:::i;:::-;;;;;;5272:17;;:19;;;;;;;;;:::i;:::-;;;;;;5302:40;5308:10;5320:21;:19;:21::i;:::-;5302:5;:40::i;:::-;4854:495::o:0;5877:354:4:-;6059:41;6078:12;:10;:12::i;:::-;6092:7;6059:18;:41::i;:::-;6038:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6185:39;6199:4;6205:2;6209:7;6218:5;6185:13;:39::i;:::-;5877:354;;;;:::o;2911:136:2:-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3026:14:2::1;3010:13;:30;;;;2911:136:::0;:::o;2972:451:4:-;3085:13;3135:16;3143:7;3135;:16::i;:::-;3114:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3235:21;3259:10;:8;:10::i;:::-;3235:34;;3322:1;3304:7;3298:21;:25;:118;;;;;;;;;;;;;;;;;3366:7;3375:18;:7;:16;:18::i;:::-;3349:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3298:118;3279:137;;;2972:451;;;:::o;5413:879:2:-;235:10;222:23;;:9;:23;;;214:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;375:1:::1;358:13;;:18;;:54;;;;;397:15;380:13;;:32;;358:54;337:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;5583:6:::2;5571:9;;:18;;;;:::i;:::-;5558:9;:31;;5537:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;5730:18;;5720:6;5683:22;:34;5706:10;5683:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:65;;5662:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;5830:23;;5820:6;:33;;5812:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;5948:6;5922:15;:22;;;;:32;;5914:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5998:25;6040:6;6026:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5998:49;;6096:6;6058:22;:34;6081:10;6058:34;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;6133:6;6112:17;;:27;;;;;;;:::i;:::-;;;;;;;;6155:9;6150:93;6170:6;6166:1;:10;6150:93;;;6211:21;:19;:21::i;:::-;6197:8;6206:1;6197:11;;;;;;;;;;;;;;;;;;;;;:35;;;::::0;::::2;6178:3;;;;;:::i;:::-;;;;6150:93;;;;6253:32;6264:10;6276:8;6253:10;:32::i;:::-;466:1;5413:879:::0;:::o;6650:93::-;6697:13;6729:7;6722:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6650:93;:::o;3731:393::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3880:9:2::1;:16;3854:15;:22;;;;:42;;3833:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3981:9;:16;3960:17;;:37;;;;;;;:::i;:::-;;;;;;;;4013:9;4008:110;4028:9;:16;4024:1;:20;4008:110;;;4065:42;4071:9;4081:1;4071:12;;;;;;;;;;;;;;;;;;;;;;4085:21;:19;:21::i;:::-;4065:5;:42::i;:::-;4046:3;;;;;:::i;:::-;;;;4008:110;;;;3731:393:::0;:::o;480:41::-;;;;:::o;4934:206:4:-;5071:4;5098:18;:25;5117:5;5098:25;;;;;;;;;;;;;;;:35;5124:8;5098:35;;;;;;;;;;;;;;;;;;;;;;;;;5091:42;;4934:206;;;;:::o;887:33:2:-;;;;:::o;1987:240:10:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;::::0;::::1;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;2557:269:2:-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2691:1:2::1;2665:15;:22;;;;:27;2657:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2740:32;2751:10;2763:8;2740:10;:32::i;:::-;2804:8;:15;2783:17;;:36;;;;;;;:::i;:::-;;;;;;;;2557:269:::0;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;7737:125:4:-;7802:4;7853:1;7825:30;;:7;:16;7833:7;7825:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7818:37;;7737:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;12245:171:4:-;12346:2;12319:15;:24;12335:7;12319:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12401:7;12397:2;12363:46;;12372:23;12387:7;12372:14;:23::i;:::-;12363:46;;;;;;;;;;;;12245:171;;:::o;8020:445::-;8145:4;8186:16;8194:7;8186;:16::i;:::-;8165:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;8282:13;8298:23;8313:7;8298:14;:23::i;:::-;8282:39;;8350:5;8339:16;;:7;:16;;;:63;;;;8395:7;8371:31;;:20;8383:7;8371:11;:20::i;:::-;:31;;;8339:63;:118;;;;8418:39;8442:5;8449:7;8418:23;:39::i;:::-;8339:118;8331:127;;;8020:445;;;;:::o;11540:594::-;11707:4;11680:31;;:23;11695:7;11680:14;:23::i;:::-;:31;;;11659:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;11810:1;11796:16;;:2;:16;;;;11788:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11864:39;11885:4;11891:2;11895:7;11864:20;:39::i;:::-;11965:29;11982:1;11986:7;11965:8;:29::i;:::-;12024:1;12005:9;:15;12015:4;12005:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;12052:1;12035:9;:13;12045:2;12035:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;12082:2;12063:7;:16;12071:7;12063:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12119:7;12115:2;12100:27;;12109:4;12100:27;;;;;;;;;;;;11540:594;;;:::o;7373:327:2:-;7421:7;7440:14;7457:40;7474:15;:22;;;;7457:16;:40::i;:::-;7440:57;;7507:15;7533;7549:6;7533:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7525:32;;7507:50;;7594:15;7635:1;7610:15;:22;;;;:26;;;;:::i;:::-;7594:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7568:15;7584:6;7568:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;7647:15;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7686:7;7679:14;;;;7373:327;:::o;9757:372:4:-;9850:1;9836:16;;:2;:16;;;;9828:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9908:16;9916:7;9908;:16::i;:::-;9907:17;9899:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9968:45;9997:1;10001:2;10005:7;9968:20;:45::i;:::-;10041:1;10024:9;:13;10034:2;10024:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10071:2;10052:7;:16;10060:7;10052:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10114:7;10110:2;10089:33;;10106:1;10089:33;;;;;;;;;;;;9757:372;;:::o;7093:341::-;7244:28;7254:4;7260:2;7264:7;7244:9;:28::i;:::-;7303:48;7326:4;7332:2;7336:7;7345:5;7303:22;:48::i;:::-;7282:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;7093:341;;;;:::o;8261:106:2:-;8321:13;8353:7;8346:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8261:106;:::o;271:703:11:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;10135:516:4:-;10263:1;10249:16;;:2;:16;;;;10241:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;10329:8;:15;10312:9;:13;10322:2;10312:13;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;10360:9;10355:290;10375:8;:15;10371:1;:19;10355:290;;;10420:20;10428:8;10437:1;10428:11;;;;;;;;;;;;;;;;;;;;;;10420:7;:20::i;:::-;10419:21;10411:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10488:49;10517:1;10521:2;10525:8;10534:1;10525:11;;;;;;;;;;;;;;;;;;;;;;10488:20;:49::i;:::-;10575:2;10552:7;:20;10560:8;10569:1;10560:11;;;;;;;;;;;;;;;;;;;;;;10552:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;10622:8;10631:1;10622:11;;;;;;;;;;;;;;;;;;;;;;10618:2;10597:37;;10614:1;10597:37;;;;;;;;;;;;10392:3;;;;;:::i;:::-;;;;10355:290;;;;10135:516;;:::o;14595:122::-;;;;:::o;7768:445:2:-;7832:7;7851:14;7954:15;:22;;;;8023:1;8008:12;:16;;;;:::i;:::-;7998:27;8047:14;8083:16;8121:10;7916:233;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7889:274;;;;;;7868:305;;7851:322;;8200:6;8191;:15;;;;:::i;:::-;8184:22;;;7768:445;;;:::o;12969:1022:4:-;13119:4;13139:15;:2;:13;;;:15::i;:::-;13135:850;;;13206:2;13190:36;;;13248:12;:10;:12::i;:::-;13282:4;13308:7;13337:5;13190:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13170:763;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13560:1;13543:6;:13;:18;13539:380;;;13585:106;;;;;;;;;;:::i;:::-;;;;;;;;13539:380;13871:6;13865:13;13856:6;13852:2;13848:15;13841:38;13170:763;13432:45;;;13422:55;;;:6;:55;;;;13415:62;;;;;13135:850;13970:4;13963:11;;12969:1022;;;;;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:12:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;3050:86;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3204:79;;;;:::o;3302:271::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:2;;3424:1;3421;3414:12;3373:2;3464:6;3451:20;3489:78;3563:3;3555:6;3548:4;3540:6;3536:17;3489:78;:::i;:::-;3480:87;;3363:210;;;;;:::o;3593:273::-;3649:5;3698:3;3691:4;3683:6;3679:17;3675:27;3665:2;;3716:1;3713;3706:12;3665:2;3756:6;3743:20;3781:79;3856:3;3848:6;3841:4;3833:6;3829:17;3781:79;:::i;:::-;3772:88;;3655:211;;;;;:::o;3872:137::-;3917:5;3955:6;3942:20;3933:29;;3971:32;3997:5;3971:32;:::i;:::-;3923:86;;;;:::o;4015:139::-;4061:5;4099:6;4086:20;4077:29;;4115:33;4142:5;4115:33;:::i;:::-;4067:87;;;;:::o;4160:262::-;4219:6;4268:2;4256:9;4247:7;4243:23;4239:32;4236:2;;;4284:1;4281;4274:12;4236:2;4327:1;4352:53;4397:7;4388:6;4377:9;4373:22;4352:53;:::i;:::-;4342:63;;4298:117;4226:196;;;;:::o;4428:407::-;4496:6;4504;4553:2;4541:9;4532:7;4528:23;4524:32;4521:2;;;4569:1;4566;4559:12;4521:2;4612:1;4637:53;4682:7;4673:6;4662:9;4658:22;4637:53;:::i;:::-;4627:63;;4583:117;4739:2;4765:53;4810:7;4801:6;4790:9;4786:22;4765:53;:::i;:::-;4755:63;;4710:118;4511:324;;;;;:::o;4841:552::-;4918:6;4926;4934;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;5297:2;5323:53;5368:7;5359:6;5348:9;5344:22;5323:53;:::i;:::-;5313:63;;5268:118;4941:452;;;;;:::o;5399:809::-;5494:6;5502;5510;5518;5567:3;5555:9;5546:7;5542:23;5538:33;5535:2;;;5584:1;5581;5574:12;5535:2;5627:1;5652:53;5697:7;5688:6;5677:9;5673:22;5652:53;:::i;:::-;5642:63;;5598:117;5754:2;5780:53;5825:7;5816:6;5805:9;5801:22;5780:53;:::i;:::-;5770:63;;5725:118;5882:2;5908:53;5953:7;5944:6;5933:9;5929:22;5908:53;:::i;:::-;5898:63;;5853:118;6038:2;6027:9;6023:18;6010:32;6069:18;6061:6;6058:30;6055:2;;;6101:1;6098;6091:12;6055:2;6129:62;6183:7;6174:6;6163:9;6159:22;6129:62;:::i;:::-;6119:72;;5981:220;5525:683;;;;;;;:::o;6214:401::-;6279:6;6287;6336:2;6324:9;6315:7;6311:23;6307:32;6304:2;;;6352:1;6349;6342:12;6304:2;6395:1;6420:53;6465:7;6456:6;6445:9;6441:22;6420:53;:::i;:::-;6410:63;;6366:117;6522:2;6548:50;6590:7;6581:6;6570:9;6566:22;6548:50;:::i;:::-;6538:60;;6493:115;6294:321;;;;;:::o;6621:407::-;6689:6;6697;6746:2;6734:9;6725:7;6721:23;6717:32;6714:2;;;6762:1;6759;6752:12;6714:2;6805:1;6830:53;6875:7;6866:6;6855:9;6851:22;6830:53;:::i;:::-;6820:63;;6776:117;6932:2;6958:53;7003:7;6994:6;6983:9;6979:22;6958:53;:::i;:::-;6948:63;;6903:118;6704:324;;;;;:::o;7034:405::-;7118:6;7167:2;7155:9;7146:7;7142:23;7138:32;7135:2;;;7183:1;7180;7173:12;7135:2;7254:1;7243:9;7239:17;7226:31;7284:18;7276:6;7273:30;7270:2;;;7316:1;7313;7306:12;7270:2;7344:78;7414:7;7405:6;7394:9;7390:22;7344:78;:::i;:::-;7334:88;;7197:235;7125:314;;;;:::o;7445:405::-;7529:6;7578:2;7566:9;7557:7;7553:23;7549:32;7546:2;;;7594:1;7591;7584:12;7546:2;7665:1;7654:9;7650:17;7637:31;7695:18;7687:6;7684:30;7681:2;;;7727:1;7724;7717:12;7681:2;7755:78;7825:7;7816:6;7805:9;7801:22;7755:78;:::i;:::-;7745:88;;7608:235;7536:314;;;;:::o;7856:260::-;7914:6;7963:2;7951:9;7942:7;7938:23;7934:32;7931:2;;;7979:1;7976;7969:12;7931:2;8022:1;8047:52;8091:7;8082:6;8071:9;8067:22;8047:52;:::i;:::-;8037:62;;7993:116;7921:195;;;;:::o;8122:282::-;8191:6;8240:2;8228:9;8219:7;8215:23;8211:32;8208:2;;;8256:1;8253;8246:12;8208:2;8299:1;8324:63;8379:7;8370:6;8359:9;8355:22;8324:63;:::i;:::-;8314:73;;8270:127;8198:206;;;;:::o;8410:375::-;8479:6;8528:2;8516:9;8507:7;8503:23;8499:32;8496:2;;;8544:1;8541;8534:12;8496:2;8615:1;8604:9;8600:17;8587:31;8645:18;8637:6;8634:30;8631:2;;;8677:1;8674;8667:12;8631:2;8705:63;8760:7;8751:6;8740:9;8736:22;8705:63;:::i;:::-;8695:73;;8558:220;8486:299;;;;:::o;8791:260::-;8849:6;8898:2;8886:9;8877:7;8873:23;8869:32;8866:2;;;8914:1;8911;8904:12;8866:2;8957:1;8982:52;9026:7;9017:6;9006:9;9002:22;8982:52;:::i;:::-;8972:62;;8928:116;8856:195;;;;:::o;9057:262::-;9116:6;9165:2;9153:9;9144:7;9140:23;9136:32;9133:2;;;9181:1;9178;9171:12;9133:2;9224:1;9249:53;9294:7;9285:6;9274:9;9270:22;9249:53;:::i;:::-;9239:63;;9195:117;9123:196;;;;:::o;9325:189::-;9446:61;9474:32;9500:5;9474:32;:::i;:::-;9446:61;:::i;:::-;9441:3;9434:74;9424:90;;:::o;9520:118::-;9607:24;9625:5;9607:24;:::i;:::-;9602:3;9595:37;9585:53;;:::o;9644:157::-;9749:45;9769:24;9787:5;9769:24;:::i;:::-;9749:45;:::i;:::-;9744:3;9737:58;9727:74;;:::o;9807:109::-;9888:21;9903:5;9888:21;:::i;:::-;9883:3;9876:34;9866:50;;:::o;9922:157::-;10027:45;10047:24;10065:5;10047:24;:::i;:::-;10027:45;:::i;:::-;10022:3;10015:58;10005:74;;:::o;10085:360::-;10171:3;10199:38;10231:5;10199:38;:::i;:::-;10253:70;10316:6;10311:3;10253:70;:::i;:::-;10246:77;;10332:52;10377:6;10372:3;10365:4;10358:5;10354:16;10332:52;:::i;:::-;10409:29;10431:6;10409:29;:::i;:::-;10404:3;10400:39;10393:46;;10175:270;;;;;:::o;10451:364::-;10539:3;10567:39;10600:5;10567:39;:::i;:::-;10622:71;10686:6;10681:3;10622:71;:::i;:::-;10615:78;;10702:52;10747:6;10742:3;10735:4;10728:5;10724:16;10702:52;:::i;:::-;10779:29;10801:6;10779:29;:::i;:::-;10774:3;10770:39;10763:46;;10543:272;;;;;:::o;10821:377::-;10927:3;10955:39;10988:5;10955:39;:::i;:::-;11010:89;11092:6;11087:3;11010:89;:::i;:::-;11003:96;;11108:52;11153:6;11148:3;11141:4;11134:5;11130:16;11108:52;:::i;:::-;11185:6;11180:3;11176:16;11169:23;;10931:267;;;;;:::o;11204:366::-;11346:3;11367:67;11431:2;11426:3;11367:67;:::i;:::-;11360:74;;11443:93;11532:3;11443:93;:::i;:::-;11561:2;11556:3;11552:12;11545:19;;11350:220;;;:::o;11576:366::-;11718:3;11739:67;11803:2;11798:3;11739:67;:::i;:::-;11732:74;;11815:93;11904:3;11815:93;:::i;:::-;11933:2;11928:3;11924:12;11917:19;;11722:220;;;:::o;11948:366::-;12090:3;12111:67;12175:2;12170:3;12111:67;:::i;:::-;12104:74;;12187:93;12276:3;12187:93;:::i;:::-;12305:2;12300:3;12296:12;12289:19;;12094:220;;;:::o;12320:366::-;12462:3;12483:67;12547:2;12542:3;12483:67;:::i;:::-;12476:74;;12559:93;12648:3;12559:93;:::i;:::-;12677:2;12672:3;12668:12;12661:19;;12466:220;;;:::o;12692:366::-;12834:3;12855:67;12919:2;12914:3;12855:67;:::i;:::-;12848:74;;12931:93;13020:3;12931:93;:::i;:::-;13049:2;13044:3;13040:12;13033:19;;12838:220;;;:::o;13064:366::-;13206:3;13227:67;13291:2;13286:3;13227:67;:::i;:::-;13220:74;;13303:93;13392:3;13303:93;:::i;:::-;13421:2;13416:3;13412:12;13405:19;;13210:220;;;:::o;13436:366::-;13578:3;13599:67;13663:2;13658:3;13599:67;:::i;:::-;13592:74;;13675:93;13764:3;13675:93;:::i;:::-;13793:2;13788:3;13784:12;13777:19;;13582:220;;;:::o;13808:366::-;13950:3;13971:67;14035:2;14030:3;13971:67;:::i;:::-;13964:74;;14047:93;14136:3;14047:93;:::i;:::-;14165:2;14160:3;14156:12;14149:19;;13954:220;;;:::o;14180:366::-;14322:3;14343:67;14407:2;14402:3;14343:67;:::i;:::-;14336:74;;14419:93;14508:3;14419:93;:::i;:::-;14537:2;14532:3;14528:12;14521:19;;14326:220;;;:::o;14552:366::-;14694:3;14715:67;14779:2;14774:3;14715:67;:::i;:::-;14708:74;;14791:93;14880:3;14791:93;:::i;:::-;14909:2;14904:3;14900:12;14893:19;;14698:220;;;:::o;14924:366::-;15066:3;15087:67;15151:2;15146:3;15087:67;:::i;:::-;15080:74;;15163:93;15252:3;15163:93;:::i;:::-;15281:2;15276:3;15272:12;15265:19;;15070:220;;;:::o;15296:366::-;15438:3;15459:67;15523:2;15518:3;15459:67;:::i;:::-;15452:74;;15535:93;15624:3;15535:93;:::i;:::-;15653:2;15648:3;15644:12;15637:19;;15442:220;;;:::o;15668:366::-;15810:3;15831:67;15895:2;15890:3;15831:67;:::i;:::-;15824:74;;15907:93;15996:3;15907:93;:::i;:::-;16025:2;16020:3;16016:12;16009:19;;15814:220;;;:::o;16040:366::-;16182:3;16203:67;16267:2;16262:3;16203:67;:::i;:::-;16196:74;;16279:93;16368:3;16279:93;:::i;:::-;16397:2;16392:3;16388:12;16381:19;;16186:220;;;:::o;16412:366::-;16554:3;16575:67;16639:2;16634:3;16575:67;:::i;:::-;16568:74;;16651:93;16740:3;16651:93;:::i;:::-;16769:2;16764:3;16760:12;16753:19;;16558:220;;;:::o;16784:366::-;16926:3;16947:67;17011:2;17006:3;16947:67;:::i;:::-;16940:74;;17023:93;17112:3;17023:93;:::i;:::-;17141:2;17136:3;17132:12;17125:19;;16930:220;;;:::o;17156:366::-;17298:3;17319:67;17383:2;17378:3;17319:67;:::i;:::-;17312:74;;17395:93;17484:3;17395:93;:::i;:::-;17513:2;17508:3;17504:12;17497:19;;17302:220;;;:::o;17528:366::-;17670:3;17691:67;17755:2;17750:3;17691:67;:::i;:::-;17684:74;;17767:93;17856:3;17767:93;:::i;:::-;17885:2;17880:3;17876:12;17869:19;;17674:220;;;:::o;17900:366::-;18042:3;18063:67;18127:2;18122:3;18063:67;:::i;:::-;18056:74;;18139:93;18228:3;18139:93;:::i;:::-;18257:2;18252:3;18248:12;18241:19;;18046:220;;;:::o;18272:366::-;18414:3;18435:67;18499:2;18494:3;18435:67;:::i;:::-;18428:74;;18511:93;18600:3;18511:93;:::i;:::-;18629:2;18624:3;18620:12;18613:19;;18418:220;;;:::o;18644:366::-;18786:3;18807:67;18871:2;18866:3;18807:67;:::i;:::-;18800:74;;18883:93;18972:3;18883:93;:::i;:::-;19001:2;18996:3;18992:12;18985:19;;18790:220;;;:::o;19016:366::-;19158:3;19179:67;19243:2;19238:3;19179:67;:::i;:::-;19172:74;;19255:93;19344:3;19255:93;:::i;:::-;19373:2;19368:3;19364:12;19357:19;;19162:220;;;:::o;19388:366::-;19530:3;19551:67;19615:2;19610:3;19551:67;:::i;:::-;19544:74;;19627:93;19716:3;19627:93;:::i;:::-;19745:2;19740:3;19736:12;19729:19;;19534:220;;;:::o;19760:366::-;19902:3;19923:67;19987:2;19982:3;19923:67;:::i;:::-;19916:74;;19999:93;20088:3;19999:93;:::i;:::-;20117:2;20112:3;20108:12;20101:19;;19906:220;;;:::o;20132:118::-;20219:24;20237:5;20219:24;:::i;:::-;20214:3;20207:37;20197:53;;:::o;20256:157::-;20361:45;20381:24;20399:5;20381:24;:::i;:::-;20361:45;:::i;:::-;20356:3;20349:58;20339:74;;:::o;20419:435::-;20599:3;20621:95;20712:3;20703:6;20621:95;:::i;:::-;20614:102;;20733:95;20824:3;20815:6;20733:95;:::i;:::-;20726:102;;20845:3;20838:10;;20603:251;;;;;:::o;20860:852::-;21100:3;21115:75;21186:3;21177:6;21115:75;:::i;:::-;21215:2;21210:3;21206:12;21199:19;;21228:75;21299:3;21290:6;21228:75;:::i;:::-;21328:2;21323:3;21319:12;21312:19;;21341:91;21428:3;21419:6;21341:91;:::i;:::-;21457:2;21452:3;21448:12;21441:19;;21470:75;21541:3;21532:6;21470:75;:::i;:::-;21570:2;21565:3;21561:12;21554:19;;21583:75;21654:3;21645:6;21583:75;:::i;:::-;21683:2;21678:3;21674:12;21667:19;;21703:3;21696:10;;21104:608;;;;;;;;:::o;21718:222::-;21811:4;21849:2;21838:9;21834:18;21826:26;;21862:71;21930:1;21919:9;21915:17;21906:6;21862:71;:::i;:::-;21816:124;;;;:::o;21946:640::-;22141:4;22179:3;22168:9;22164:19;22156:27;;22193:71;22261:1;22250:9;22246:17;22237:6;22193:71;:::i;:::-;22274:72;22342:2;22331:9;22327:18;22318:6;22274:72;:::i;:::-;22356;22424:2;22413:9;22409:18;22400:6;22356:72;:::i;:::-;22475:9;22469:4;22465:20;22460:2;22449:9;22445:18;22438:48;22503:76;22574:4;22565:6;22503:76;:::i;:::-;22495:84;;22146:440;;;;;;;:::o;22592:210::-;22679:4;22717:2;22706:9;22702:18;22694:26;;22730:65;22792:1;22781:9;22777:17;22768:6;22730:65;:::i;:::-;22684:118;;;;:::o;22808:313::-;22921:4;22959:2;22948:9;22944:18;22936:26;;23008:9;23002:4;22998:20;22994:1;22983:9;22979:17;22972:47;23036:78;23109:4;23100:6;23036:78;:::i;:::-;23028:86;;22926:195;;;;:::o;23127:419::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:131;23534:4;23408:131;:::i;:::-;23400:139;;23298:248;;;:::o;23552:419::-;23718:4;23756:2;23745:9;23741:18;23733:26;;23805:9;23799:4;23795:20;23791:1;23780:9;23776:17;23769:47;23833:131;23959:4;23833:131;:::i;:::-;23825:139;;23723:248;;;:::o;23977:419::-;24143:4;24181:2;24170:9;24166:18;24158:26;;24230:9;24224:4;24220:20;24216:1;24205:9;24201:17;24194:47;24258:131;24384:4;24258:131;:::i;:::-;24250:139;;24148:248;;;:::o;24402:419::-;24568:4;24606:2;24595:9;24591:18;24583:26;;24655:9;24649:4;24645:20;24641:1;24630:9;24626:17;24619:47;24683:131;24809:4;24683:131;:::i;:::-;24675:139;;24573:248;;;:::o;24827:419::-;24993:4;25031:2;25020:9;25016:18;25008:26;;25080:9;25074:4;25070:20;25066:1;25055:9;25051:17;25044:47;25108:131;25234:4;25108:131;:::i;:::-;25100:139;;24998:248;;;:::o;25252:419::-;25418:4;25456:2;25445:9;25441:18;25433:26;;25505:9;25499:4;25495:20;25491:1;25480:9;25476:17;25469:47;25533:131;25659:4;25533:131;:::i;:::-;25525:139;;25423:248;;;:::o;25677:419::-;25843:4;25881:2;25870:9;25866:18;25858:26;;25930:9;25924:4;25920:20;25916:1;25905:9;25901:17;25894:47;25958:131;26084:4;25958:131;:::i;:::-;25950:139;;25848:248;;;:::o;26102:419::-;26268:4;26306:2;26295:9;26291:18;26283:26;;26355:9;26349:4;26345:20;26341:1;26330:9;26326:17;26319:47;26383:131;26509:4;26383:131;:::i;:::-;26375:139;;26273:248;;;:::o;26527:419::-;26693:4;26731:2;26720:9;26716:18;26708:26;;26780:9;26774:4;26770:20;26766:1;26755:9;26751:17;26744:47;26808:131;26934:4;26808:131;:::i;:::-;26800:139;;26698:248;;;:::o;26952:419::-;27118:4;27156:2;27145:9;27141:18;27133:26;;27205:9;27199:4;27195:20;27191:1;27180:9;27176:17;27169:47;27233:131;27359:4;27233:131;:::i;:::-;27225:139;;27123:248;;;:::o;27377:419::-;27543:4;27581:2;27570:9;27566:18;27558:26;;27630:9;27624:4;27620:20;27616:1;27605:9;27601:17;27594:47;27658:131;27784:4;27658:131;:::i;:::-;27650:139;;27548:248;;;:::o;27802:419::-;27968:4;28006:2;27995:9;27991:18;27983:26;;28055:9;28049:4;28045:20;28041:1;28030:9;28026:17;28019:47;28083:131;28209:4;28083:131;:::i;:::-;28075:139;;27973:248;;;:::o;28227:419::-;28393:4;28431:2;28420:9;28416:18;28408:26;;28480:9;28474:4;28470:20;28466:1;28455:9;28451:17;28444:47;28508:131;28634:4;28508:131;:::i;:::-;28500:139;;28398:248;;;:::o;28652:419::-;28818:4;28856:2;28845:9;28841:18;28833:26;;28905:9;28899:4;28895:20;28891:1;28880:9;28876:17;28869:47;28933:131;29059:4;28933:131;:::i;:::-;28925:139;;28823:248;;;:::o;29077:419::-;29243:4;29281:2;29270:9;29266:18;29258:26;;29330:9;29324:4;29320:20;29316:1;29305:9;29301:17;29294:47;29358:131;29484:4;29358:131;:::i;:::-;29350:139;;29248:248;;;:::o;29502:419::-;29668:4;29706:2;29695:9;29691:18;29683:26;;29755:9;29749:4;29745:20;29741:1;29730:9;29726:17;29719:47;29783:131;29909:4;29783:131;:::i;:::-;29775:139;;29673:248;;;:::o;29927:419::-;30093:4;30131:2;30120:9;30116:18;30108:26;;30180:9;30174:4;30170:20;30166:1;30155:9;30151:17;30144:47;30208:131;30334:4;30208:131;:::i;:::-;30200:139;;30098:248;;;:::o;30352:419::-;30518:4;30556:2;30545:9;30541:18;30533:26;;30605:9;30599:4;30595:20;30591:1;30580:9;30576:17;30569:47;30633:131;30759:4;30633:131;:::i;:::-;30625:139;;30523:248;;;:::o;30777:419::-;30943:4;30981:2;30970:9;30966:18;30958:26;;31030:9;31024:4;31020:20;31016:1;31005:9;31001:17;30994:47;31058:131;31184:4;31058:131;:::i;:::-;31050:139;;30948:248;;;:::o;31202:419::-;31368:4;31406:2;31395:9;31391:18;31383:26;;31455:9;31449:4;31445:20;31441:1;31430:9;31426:17;31419:47;31483:131;31609:4;31483:131;:::i;:::-;31475:139;;31373:248;;;:::o;31627:419::-;31793:4;31831:2;31820:9;31816:18;31808:26;;31880:9;31874:4;31870:20;31866:1;31855:9;31851:17;31844:47;31908:131;32034:4;31908:131;:::i;:::-;31900:139;;31798:248;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32223:248;;;:::o;32477:419::-;32643:4;32681:2;32670:9;32666:18;32658:26;;32730:9;32724:4;32720:20;32716:1;32705:9;32701:17;32694:47;32758:131;32884:4;32758:131;:::i;:::-;32750:139;;32648:248;;;:::o;32902:419::-;33068:4;33106:2;33095:9;33091:18;33083:26;;33155:9;33149:4;33145:20;33141:1;33130:9;33126:17;33119:47;33183:131;33309:4;33183:131;:::i;:::-;33175:139;;33073:248;;;:::o;33327:222::-;33420:4;33458:2;33447:9;33443:18;33435:26;;33471:71;33539:1;33528:9;33524:17;33515:6;33471:71;:::i;:::-;33425:124;;;;:::o;33555:129::-;33589:6;33616:20;;:::i;:::-;33606:30;;33645:33;33673:4;33665:6;33645:33;:::i;:::-;33596:88;;;:::o;33690:75::-;33723:6;33756:2;33750:9;33740:19;;33730:35;:::o;33771:311::-;33848:4;33938:18;33930:6;33927:30;33924:2;;;33960:18;;:::i;:::-;33924:2;34010:4;34002:6;33998:17;33990:25;;34070:4;34064;34060:15;34052:23;;33853:229;;;:::o;34088:311::-;34165:4;34255:18;34247:6;34244:30;34241:2;;;34277:18;;:::i;:::-;34241:2;34327:4;34319:6;34315:17;34307:25;;34387:4;34381;34377:15;34369:23;;34170:229;;;:::o;34405:307::-;34466:4;34556:18;34548:6;34545:30;34542:2;;;34578:18;;:::i;:::-;34542:2;34616:29;34638:6;34616:29;:::i;:::-;34608:37;;34700:4;34694;34690:15;34682:23;;34471:241;;;:::o;34718:308::-;34780:4;34870:18;34862:6;34859:30;34856:2;;;34892:18;;:::i;:::-;34856:2;34930:29;34952:6;34930:29;:::i;:::-;34922:37;;35014:4;35008;35004:15;34996:23;;34785:241;;;:::o;35032:98::-;35083:6;35117:5;35111:12;35101:22;;35090:40;;;:::o;35136:99::-;35188:6;35222:5;35216:12;35206:22;;35195:40;;;:::o;35241:168::-;35324:11;35358:6;35353:3;35346:19;35398:4;35393:3;35389:14;35374:29;;35336:73;;;;:::o;35415:169::-;35499:11;35533:6;35528:3;35521:19;35573:4;35568:3;35564:14;35549:29;;35511:73;;;;:::o;35590:148::-;35692:11;35729:3;35714:18;;35704:34;;;;:::o;35744:305::-;35784:3;35803:20;35821:1;35803:20;:::i;:::-;35798:25;;35837:20;35855:1;35837:20;:::i;:::-;35832:25;;35991:1;35923:66;35919:74;35916:1;35913:81;35910:2;;;35997:18;;:::i;:::-;35910:2;36041:1;36038;36034:9;36027:16;;35788:261;;;;:::o;36055:185::-;36095:1;36112:20;36130:1;36112:20;:::i;:::-;36107:25;;36146:20;36164:1;36146:20;:::i;:::-;36141:25;;36185:1;36175:2;;36190:18;;:::i;:::-;36175:2;36232:1;36229;36225:9;36220:14;;36097:143;;;;:::o;36246:348::-;36286:7;36309:20;36327:1;36309:20;:::i;:::-;36304:25;;36343:20;36361:1;36343:20;:::i;:::-;36338:25;;36531:1;36463:66;36459:74;36456:1;36453:81;36448:1;36441:9;36434:17;36430:105;36427:2;;;36538:18;;:::i;:::-;36427:2;36586:1;36583;36579:9;36568:20;;36294:300;;;;:::o;36600:191::-;36640:4;36660:20;36678:1;36660:20;:::i;:::-;36655:25;;36694:20;36712:1;36694:20;:::i;:::-;36689:25;;36733:1;36730;36727:8;36724:2;;;36738:18;;:::i;:::-;36724:2;36783:1;36780;36776:9;36768:17;;36645:146;;;;:::o;36797:96::-;36834:7;36863:24;36881:5;36863:24;:::i;:::-;36852:35;;36842:51;;;:::o;36899:104::-;36944:7;36973:24;36991:5;36973:24;:::i;:::-;36962:35;;36952:51;;;:::o;37009:90::-;37043:7;37086:5;37079:13;37072:21;37061:32;;37051:48;;;:::o;37105:77::-;37142:7;37171:5;37160:16;;37150:32;;;:::o;37188:149::-;37224:7;37264:66;37257:5;37253:78;37242:89;;37232:105;;;:::o;37343:89::-;37379:7;37419:6;37412:5;37408:18;37397:29;;37387:45;;;:::o;37438:126::-;37475:7;37515:42;37508:5;37504:54;37493:65;;37483:81;;;:::o;37570:77::-;37607:7;37636:5;37625:16;;37615:32;;;:::o;37653:154::-;37737:6;37732:3;37727;37714:30;37799:1;37790:6;37785:3;37781:16;37774:27;37704:103;;;:::o;37813:307::-;37881:1;37891:113;37905:6;37902:1;37899:13;37891:113;;;37990:1;37985:3;37981:11;37975:18;37971:1;37966:3;37962:11;37955:39;37927:2;37924:1;37920:10;37915:15;;37891:113;;;38022:6;38019:1;38016:13;38013:2;;;38102:1;38093:6;38088:3;38084:16;38077:27;38013:2;37862:258;;;;:::o;38126:320::-;38170:6;38207:1;38201:4;38197:12;38187:22;;38254:1;38248:4;38244:12;38275:18;38265:2;;38331:4;38323:6;38319:17;38309:27;;38265:2;38393;38385:6;38382:14;38362:18;38359:38;38356:2;;;38412:18;;:::i;:::-;38356:2;38177:269;;;;:::o;38452:281::-;38535:27;38557:4;38535:27;:::i;:::-;38527:6;38523:40;38665:6;38653:10;38650:22;38629:18;38617:10;38614:34;38611:62;38608:2;;;38676:18;;:::i;:::-;38608:2;38716:10;38712:2;38705:22;38495:238;;;:::o;38739:171::-;38777:3;38800:23;38817:5;38800:23;:::i;:::-;38791:32;;38845:6;38838:5;38835:17;38832:2;;;38855:18;;:::i;:::-;38832:2;38902:1;38895:5;38891:13;38884:20;;38781:129;;;:::o;38916:233::-;38955:3;38978:24;38996:5;38978:24;:::i;:::-;38969:33;;39024:66;39017:5;39014:77;39011:2;;;39094:18;;:::i;:::-;39011:2;39141:1;39134:5;39130:13;39123:20;;38959:190;;;:::o;39155:100::-;39194:7;39223:26;39243:5;39223:26;:::i;:::-;39212:37;;39202:53;;;:::o;39261:108::-;39308:7;39337:26;39357:5;39337:26;:::i;:::-;39326:37;;39316:53;;;:::o;39375:79::-;39414:7;39443:5;39432:16;;39422:32;;;:::o;39460:94::-;39499:7;39528:20;39542:5;39528:20;:::i;:::-;39517:31;;39507:47;;;:::o;39560:79::-;39599:7;39628:5;39617:16;;39607:32;;;:::o;39645:176::-;39677:1;39694:20;39712:1;39694:20;:::i;:::-;39689:25;;39728:20;39746:1;39728:20;:::i;:::-;39723:25;;39767:1;39757:2;;39772:18;;:::i;:::-;39757:2;39813:1;39810;39806:9;39801:14;;39679:142;;;;:::o;39827:180::-;39875:77;39872:1;39865:88;39972:4;39969:1;39962:15;39996:4;39993:1;39986:15;40013:180;40061:77;40058:1;40051:88;40158:4;40155:1;40148:15;40182:4;40179:1;40172:15;40199:180;40247:77;40244:1;40237:88;40344:4;40341:1;40334:15;40368:4;40365:1;40358:15;40385:180;40433:77;40430:1;40423:88;40530:4;40527:1;40520:15;40554:4;40551:1;40544:15;40571:102;40612:6;40663:2;40659:7;40654:2;40647:5;40643:14;40639:28;40629:38;;40619:54;;;:::o;40679:94::-;40712:8;40760:5;40756:2;40752:14;40731:35;;40721:52;;;:::o;40779:237::-;40919:34;40915:1;40907:6;40903:14;40896:58;40988:20;40983:2;40975:6;40971:15;40964:45;40885:131;:::o;41022:223::-;41162:34;41158:1;41150:6;41146:14;41139:58;41231:6;41226:2;41218:6;41214:15;41207:31;41128:117;:::o;41251:225::-;41391:34;41387:1;41379:6;41375:14;41368:58;41460:8;41455:2;41447:6;41443:15;41436:33;41357:119;:::o;41482:178::-;41622:30;41618:1;41610:6;41606:14;41599:54;41588:72;:::o;41666:223::-;41806:34;41802:1;41794:6;41790:14;41783:58;41875:6;41870:2;41862:6;41858:15;41851:31;41772:117;:::o;41895:175::-;42035:27;42031:1;42023:6;42019:14;42012:51;42001:69;:::o;42076:231::-;42216:34;42212:1;42204:6;42200:14;42193:58;42285:14;42280:2;42272:6;42268:15;42261:39;42182:125;:::o;42313:180::-;42453:32;42449:1;42441:6;42437:14;42430:56;42419:74;:::o;42499:243::-;42639:34;42635:1;42627:6;42623:14;42616:58;42708:26;42703:2;42695:6;42691:15;42684:51;42605:137;:::o;42748:167::-;42888:19;42884:1;42876:6;42872:14;42865:43;42854:61;:::o;42921:229::-;43061:34;43057:1;43049:6;43045:14;43038:58;43130:12;43125:2;43117:6;43113:15;43106:37;43027:123;:::o;43156:228::-;43296:34;43292:1;43284:6;43280:14;43273:58;43365:11;43360:2;43352:6;43348:15;43341:36;43262:122;:::o;43390:232::-;43530:34;43526:1;43518:6;43514:14;43507:58;43599:15;43594:2;43586:6;43582:15;43575:40;43496:126;:::o;43628:182::-;43768:34;43764:1;43756:6;43752:14;43745:58;43734:76;:::o;43816:231::-;43956:34;43952:1;43944:6;43940:14;43933:58;44025:14;44020:2;44012:6;44008:15;44001:39;43922:125;:::o;44053:182::-;44193:34;44189:1;44181:6;44177:14;44170:58;44159:76;:::o;44241:228::-;44381:34;44377:1;44369:6;44365:14;44358:58;44450:11;44445:2;44437:6;44433:15;44426:36;44347:122;:::o;44475:221::-;44615:34;44611:1;44603:6;44599:14;44592:58;44684:4;44679:2;44671:6;44667:15;44660:29;44581:115;:::o;44702:234::-;44842:34;44838:1;44830:6;44826:14;44819:58;44911:17;44906:2;44898:6;44894:15;44887:42;44808:128;:::o;44942:220::-;45082:34;45078:1;45070:6;45066:14;45059:58;45151:3;45146:2;45138:6;45134:15;45127:28;45048:114;:::o;45168:236::-;45308:34;45304:1;45296:6;45292:14;45285:58;45377:19;45372:2;45364:6;45360:15;45353:44;45274:130;:::o;45410:178::-;45550:30;45546:1;45538:6;45534:14;45527:54;45516:72;:::o;45594:178::-;45734:30;45730:1;45722:6;45718:14;45711:54;45700:72;:::o;45778:182::-;45918:34;45914:1;45906:6;45902:14;45895:58;45884:76;:::o;45966:122::-;46039:24;46057:5;46039:24;:::i;:::-;46032:5;46029:35;46019:2;;46078:1;46075;46068:12;46019:2;46009:79;:::o;46094:116::-;46164:21;46179:5;46164:21;:::i;:::-;46157:5;46154:32;46144:2;;46200:1;46197;46190:12;46144:2;46134:76;:::o;46216:120::-;46288:23;46305:5;46288:23;:::i;:::-;46281:5;46278:34;46268:2;;46326:1;46323;46316:12;46268:2;46258:78;:::o;46342:120::-;46414:23;46431:5;46414:23;:::i;:::-;46407:5;46404:34;46394:2;;46452:1;46449;46442:12;46394:2;46384:78;:::o;46468:122::-;46541:24;46559:5;46541:24;:::i;:::-;46534:5;46531:35;46521:2;;46580:1;46577;46570:12;46521:2;46511:79;:::o

Swarm Source

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