ETH Price: $2,287.71 (+0.48%)

Token

Decentral ART (ART)
 

Overview

Max Total Supply

0 ART

Holders

9

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
7 ART
0x14f8f97f373643538d2d17e1283767a6b106153d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Decentralized sale of an oil painting cut into 10,927 pieces sold in 19 sessions of the lottery system with 240 prizes in the primary market. And an aftermarket trading tool. The goal is to put the image together into one wallet for which the smart contract will pay the main prize.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DECENTRAL_ART

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 220 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-08
*/

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT
/**
 * @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);
}


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

    /**
     * @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 payable;

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) 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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. 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 || 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 payable{
        //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 payable{
        safeTransferFrom(from, to, tokenId, "");
    }

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

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

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

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

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

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

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

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

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

       // emit Transfer(address(0), to, tokenId); // tady povolit
    }

    /**
     * @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 {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


interface ITOKEN {
    function firstOwnner(address owner) external view returns (uint balance);
}


contract VAR is ITOKEN {
    address owner;
    uint mainGoalAmount = 20000000000000000;

    uint8 actualPhase = 0;
    uint totalMintedTokens = 0;
    
    address[] public hodlers;
    mapping(address => uint) public hodlersIndex;
    
    uint[] VIPIndexes;
    mapping(uint256 => uint) sellingPrice;
    mapping(address => uint) firstOwnners;
    
    struct Phase {
        uint tokensAmount;
        uint prizesAmount;
        uint price;
        uint prize;
        address[] buyers;
        uint[] winners;
        uint toGoalWallet;
    }
    
    uint nonce = 0;
    function random(uint participants, address salt) internal returns(uint) {
        nonce++;
        return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, salt, nonce))) % participants;
    }
    
    Phase[] phases;
    
    constructor() {
        address[] memory emptyAddressesArray;
        uint[] memory emptyWinners;
        phases.push(Phase(1, 1, 1000000000000000, 1500000000000000, emptyAddressesArray, emptyWinners, 19705000000000000));//1
        phases.push(Phase(1, 1, 1000000000000000, 20000000000000000, emptyAddressesArray, emptyWinners, 8790000000000000));//2
        phases.push(Phase(2, 1, 23600000000000000, 40000000000000000, emptyAddressesArray, emptyWinners, 22124000000000000));//3
        phases.push(Phase(3, 1, 38200000000000000, 100000000000000000, emptyAddressesArray, emptyWinners, 22871333333333300));//4
        phases.push(Phase(5, 1, 50000000000000000, 200000000000000000, emptyAddressesArray, emptyWinners, 25900000000000000));//5
        phases.push(Phase(8, 1, 61800000000000000, 400000000000000000, emptyAddressesArray, emptyWinners, 26962000000000000));//6
        phases.push(Phase(13, 1, 78600000000000000, 786000000000000000, emptyAddressesArray, emptyWinners, 30701692307692300));//7
        phases.push(Phase(21, 1, 161800000000000000, 1618000000000000000, emptyAddressesArray, emptyWinners, 70003904761904800));//8
        phases.push(Phase(34, 1, 218000000000000000, 2180000000000000000, emptyAddressesArray, emptyWinners, 110790588235294000));//9
        phases.push(Phase(55, 1, 236000000000000000, 2360000000000000000, emptyAddressesArray, emptyWinners, 133923636363636000));//10
        phases.push(Phase(89, 2, 382000000000000000, 3820000000000000000, emptyAddressesArray, emptyWinners, 194732808988764000));//11
        phases.push(Phase(144, 3, 500000000000000000, 5000000000000000000, emptyAddressesArray, emptyWinners, 253541666666667000));//12
        phases.push(Phase(233, 5, 618000000000000000, 6180000000000000000, emptyAddressesArray, emptyWinners, 306375364806867000));//13
        phases.push(Phase(377, 8, 786000000000000000, 7860000000000000000, emptyAddressesArray, emptyWinners, 385333633952255000));//14
        phases.push(Phase(610, 13, 1618000000000000000, 16180000000000000000, emptyAddressesArray, emptyWinners, 771176393442623000));//15
        phases.push(Phase(987, 21, 2618000000000000000, 26180000000000000000, emptyAddressesArray, emptyWinners, 1235977446808510000));//16
        phases.push(Phase(1579, 34, 3618000000000000000, 36180000000000000000, emptyAddressesArray, emptyWinners, 1694980481317290000));//17
        phases.push(Phase(2584, 55, 4236000000000000000, 42360000000000000000, emptyAddressesArray, emptyWinners, 1987281021671830000));//18
        phases.push(Phase(4181, 89, 6872300000000000000, 68723000000000000000, emptyAddressesArray, emptyWinners, 3211551348242050000));//19
    }
    
    function info() public view returns(uint ActualPhase, uint TotalMintedTokens, uint MainGoalWei, uint TotalWei){
        return (actualPhase, totalMintedTokens, mainGoalAmount, address(this).balance);
    }
    
    function firstOwnner(address ownerAddress) external view  override returns (uint balance){
        require(ownerAddress != address(0), "ITOKEN: balance query for the zero address");
        return firstOwnners[ownerAddress];
    }
}


contract DRAW is VAR {
    event DrawLots (uint8 phase, address[] winners, uint amount, uint[] winnerIndexes);

    function drawLots() public {
        require(phases[actualPhase].tokensAmount == 0, "Not all tokens were sold in the actual phase");
        uint[] memory winnerIndexes = new uint[](phases[actualPhase].prizesAmount);
        address[] memory winners = new address[](phases[actualPhase].prizesAmount);
        
        for(uint16 i = 0; i < phases[actualPhase].prizesAmount; i++){
            winnerIndexes[i] = random( phases[actualPhase].buyers.length, phases[actualPhase].buyers[i]);
            winners[i] = phases[actualPhase].buyers[winnerIndexes[i]];
            phases[actualPhase].winners.push(winnerIndexes[i]);
            payable(winners[i]).transfer(phases[actualPhase].prize);
        }
        emit DrawLots(actualPhase, winners, phases[actualPhase].prize, winnerIndexes);
        actualPhase++;
    }
    
}


abstract contract GOALS is VAR, ERC721 {
    
    event GoalReached (uint16 owningTokens, address winner, uint amount);
    event WinHodlers (uint8 index, address[] winners, uint amount);
    
    uint goalsReached = 0;
    uint16[12] goalsInTokens = [54, 109, 218, 327, 546, 874, 1420, 2294, 3715, 6009, 9725, 10927];
    uint16[11] goalPrizes = [890, 550, 340, 210, 130, 80, 50, 30, 20, 10, 10];
    
    uint8[19] VIPsInPhases = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];
    
    
    uint8 public actualHolderPriceIndex = 0;
    uint[10] holdersPrices = [10, 20, 22, 23, 24, 25, 26, 27, 28, 29];


    function checkGoalReached(address payable testedAddress) internal {
        uint256 amount = balanceOf(testedAddress);
        if(goalsReached < 11 && amount >= goalsInTokens[goalsReached]){
            uint prize = mainGoalAmount * goalPrizes[goalsReached] / 1000;
            testedAddress.transfer(prize);
            mainGoalAmount -= prize;
            emit GoalReached(goalsInTokens[goalsReached], testedAddress, prize);
            goalsReached++;
        } else if(goalsReached == 11 && amount >= goalsInTokens[goalsReached]){
            testedAddress.transfer(mainGoalAmount);
            emit GoalReached(10927, testedAddress, mainGoalAmount);
            mainGoalAmount -= mainGoalAmount;
            goalsReached++;
        }
    }
    
    mapping(address => uint8) isWinner;
    
    function drawHodlers() public {
        require(actualHolderPriceIndex < holdersPrices.length, "No prizes for hodlers");
        require(owner == msg.sender, "Function is only for owner");
        uint countOfWinners = hodlers.length < 100 ? hodlers.length : 100;
        address[] memory winners = new address[](countOfWinners);
        uint prize = mainGoalAmount * holdersPrices[actualHolderPriceIndex] / 100000;
        uint index;
        address winner;
        uint8 maxRandoms;
        
        for(uint8 p = 0; p < countOfWinners; p++){
            maxRandoms = 10;
            do {
                index = random( countOfWinners, hodlers[hodlers.length/2] );
                winner = hodlers[index];
            } while (isWinner[winner] == actualHolderPriceIndex + 1 && maxRandoms-- > 1);
            isWinner[winner] = actualHolderPriceIndex+1;
            winners[p] = hodlers[index];
            payable(winner).transfer(prize);
            mainGoalAmount -= prize;
        }
        
        emit WinHodlers(actualHolderPriceIndex, winners, prize);
        actualHolderPriceIndex++;
    }
}


abstract contract BUYPIX is VAR, ERC721, DRAW, GOALS {
    
    constructor() {
    
    }
    
    event TokenPurchased (uint8 oldPhase, uint8 actualPhase, uint256 first, uint256 count, address newOwner, uint price);
    event VIPFounded (uint[] tokenIds, uint returnAmount, address owner, uint8 phase);
    
    receive() external payable { }
    
    function beforeBuyTokens (uint weiAmount) public view returns(bool, string memory, uint){
        uint tokens = weiAmount / phases[actualPhase].price;
        uint rest = weiAmount % phases[actualPhase].price;
        if(0 == tokens)
            return( true, "Not enough wei to buy a token",tokens);
        if(rest > 0)
            return( true, "Please send exact amount of wei",tokens);
        if(phases[actualPhase].tokensAmount < tokens)
            return( true, "Not enough tokens in actual phase",tokens);
        if(totalMintedTokens >= 10927)
            return( true, "All tokens purchased",tokens);

        return(false, "ok",tokens);
    }
    
    
    
    function buyTokens() public payable {
        (bool error, , uint tokens) = beforeBuyTokens(msg.value);
        
        require(!error, "Error, use method beforeBuyTokens(uint weiAmount)");


        uint oldTokenIndex = totalMintedTokens;
        uint returnAmount = 0;
        
        if(_balances[msg.sender] == 0){
            hodlersIndex[msg.sender] = hodlers.length;
            hodlers.push(msg.sender);
        }
        
        for(uint i = 0; i < tokens; i++){
            _safeMint(msg.sender , totalMintedTokens+i); 
            mainGoalAmount = mainGoalAmount + phases[actualPhase].toGoalWallet - 20000000000000000;
            phases[actualPhase].buyers.push(msg.sender);

            checkGoalReached(payable(msg.sender));

            if(VIPsInPhases[actualPhase] > 0){ 
                uint8 isWin = phases[actualPhase].tokensAmount <= VIPsInPhases[actualPhase]? 1 : randomVIP(msg.sender, actualPhase, totalMintedTokens);
                if(isWin == 1){
                    VIPsInPhases[actualPhase]--;
                    VIPIndexes.push(totalMintedTokens+i);
                    returnAmount += phases[actualPhase].price / 2;
                }
            }
            phases[actualPhase].tokensAmount--;
        }
        
        if(returnAmount > 0){
            payable(msg.sender).transfer(returnAmount);
            emit VIPFounded(VIPIndexes, returnAmount, msg.sender, actualPhase);
            delete VIPIndexes;
        }
        
        totalMintedTokens += tokens;
        firstOwnners[msg.sender] += tokens;

        uint8 oldPhase = actualPhase;


        if(phases[actualPhase].tokensAmount == 0){
            drawLots();
        }
        
        emit TokenPurchased(oldPhase, actualPhase, oldTokenIndex, tokens, msg.sender, phases[actualPhase].price);
    }
    
    function randomVIP(address salt, uint8 phase, uint lastToken) view internal returns(uint8) {
        return uint8(uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, salt, phase, lastToken))) % 2);
    }
}


contract VOTING is VAR {

    event Vote(ActionType actionType, uint proposalIndex, address addr, uint8 vote);
    event FinishVoting(ActionType actionType, bool result, uint proposalIndex);
    event ProposalCreated(uint endTime, ActionType actionType, address actionAddress, uint8[] percents, address[] addresses, uint amount, uint proposalIndex);
    
    enum ActionType {add_voter, remove_voter, set_percent, eth_emission}

    struct VoteStatus {
        address participant;
        uint8 vote; // 0 no 1 yes 2 resignation
    }
    
    struct Proposal {
        uint endTime;
        uint8 result; // 0 no 1 yes 2 notFinished
        ActionType actionType; // 0 add 1 remove participant 2 transfer ETH
        address actionAddress; // Add/Remove participant or transfer address
        uint8[] percents;
        address[] addresses;
        uint amount; // amount of transfered Wei
        address[] voters;
        uint8[] votes;
    }

    struct ParticipantVote {
        address addr;
        uint8 vote;
    }
    
    address[] public participants;
    mapping(address => uint8) participantPercent;
    Proposal[] proposals;
    
    VoteStatus[] status;
    
    constructor() {
        address one = 0xdD5775D8F839bDEEc91a0f7E47f3423752Ed6e4F;
        address two = 0x9d269611ae44bB242416Ed78Dc070Bf5449385Ae;
        participants.push(one);
        participants.push(two);
        participantPercent[one] = 50;
        participantPercent[two] = 50;
    }
    
    //receive() external payable { }

    function beforeCreateProposal(ActionType _actionType, address _actionAddress, uint8[] memory _percents, address[] memory _addresses, address _senderAddress) public view returns(bool, string memory) {

        if(findParticipantIndex(_senderAddress) == 0)
            return(true, "You are not in participant");
            
        if(uint(_actionType) < 2) {
            uint index = findParticipantIndex(_actionAddress);
            if(_actionType == ActionType.add_voter && index != 0)
                return(true, "This participant already exist");
            if(_actionType == ActionType.remove_voter){
                if(participantPercent[_actionAddress] > 0)
                    return(true, "The participant to delete must have zero percent");
                if(index == 0)
                    return(true, "This is not participant address");
                if(participants.length <= 2)
                    return(true, "Minimal count of participants is 2");
            }
        }
        if(_actionType == ActionType.set_percent){
            if(_percents.length != participants.length)
                return(true, "Wrong percents length");
            if(_addresses.length != participants.length)
                return(true, "Wrong addresses length");
            uint8 total = 0;
            for(uint i = 0; _percents.length > i; i++){
                total += _percents[i];
            }
            if(total != 100)
                return(true, "The sum of the percentages must be 100");
        }
        return(false, "ok");
    }
    
    function createProposal( ActionType _actionType, address _actionAddress, uint8[] memory _percents, address[] memory _addresses, uint _amount) public {
        (bool error, string memory message) = beforeCreateProposal(_actionType, _actionAddress, _percents, _addresses, msg.sender);
        require (!error, message);

        uint time = block.timestamp + (3 * 24 hours); // Three days
        address[] memory emptyVoters;
        uint8[] memory emptyVotes;
        proposals.push(
            Proposal(time, 2,  _actionType, _actionAddress, _percents, _addresses, _amount, emptyVoters, emptyVotes)
        );
        emit ProposalCreated(time, _actionType, _actionAddress, _percents, _addresses, _amount, proposals.length-1);
    }
    
    function beforeVoteInProposal (uint proposalIndex, address senderAddress) public view returns(bool error, string memory description) {
        uint index = findParticipantIndex(senderAddress);
        if(index == 0)
            return(true, "You are not in participant");
        if(proposals.length <= proposalIndex)
            return(true, "Proposal not exist");
        if(proposals[proposalIndex].result != 2)
            return(true, "Proposal finished");
        if(block.timestamp >= proposals[proposalIndex].endTime)
            return(true, "Time for voting is out");

        for(uint i = 0; proposals[proposalIndex].voters.length > i; i++){
            if(proposals[proposalIndex].voters[i] == senderAddress){
                return(true, "You are already voted");
            }
        }
        return(false, "ok");
    }

    function voteInProposal (uint proposalIndex, uint8 vote) public{
        (bool error, string memory message) = beforeVoteInProposal(proposalIndex, msg.sender);
        require (!error, message);
        proposals[proposalIndex].voters.push(msg.sender);
        proposals[proposalIndex].votes.push(vote);
        emit Vote(proposals[proposalIndex].actionType, proposalIndex, msg.sender, vote);
    }

    function beforeFinishProposal (uint proposalIndex, address senderAddress) public view 
    returns(bool error, string memory message, uint votedYes, uint votedNo) {
        uint index = findParticipantIndex(senderAddress);
        uint _votedYes = 0;
        uint _votedNo = 0;
        
        for(uint i = 0; proposals[proposalIndex].voters.length > i; i++){
            if(proposals[proposalIndex].votes[i] == 1)
                _votedYes++;
            if(proposals[proposalIndex].votes[i] == 0)
                _votedNo++;
        }

        if(index == 0)
            return(true, "You are not in participant", _votedYes, _votedNo);
        if(proposals[proposalIndex].actionType == ActionType.add_voter && findParticipantIndex(proposals[proposalIndex].actionAddress) > 0)
            return(true, "This participant already exist", _votedYes, _votedNo);
        if(proposals[proposalIndex].actionType == ActionType.remove_voter && participants.length == 2)
            return(true, "Minimal count of voted participants is 2", _votedYes, _votedNo);
        if(proposals[proposalIndex].actionType == ActionType.remove_voter && participantPercent[proposals[proposalIndex].actionAddress] > 0)
            return(true, "The participant to delete must have zero percent", _votedYes, _votedNo);
        if(proposals.length <= proposalIndex)
            return(true, "Proposal does not exist", _votedYes, _votedNo);
        if(proposals[proposalIndex].result != 2)
            return(true, "Voting has finished", _votedYes, _votedNo);
        if(block.timestamp <= proposals[proposalIndex].endTime && proposals[proposalIndex].voters.length != participants.length)
            return(true, "Voting is not finished", _votedYes, _votedNo);
            // Tady změnit balance na konkrétní účet
        if(proposals[proposalIndex].actionType == ActionType.eth_emission && address(this).balance < proposals[proposalIndex].amount)
            return(true, "Low ETH balance", _votedYes, _votedNo);    
        
        if(proposals[proposalIndex].voters.length <= participants.length - proposals[proposalIndex].voters.length) // Minimum participants on proposal
            return(true, "Count of voted participants must be more than 50%", _votedYes, _votedNo);
        return(false, "ok", _votedYes, _votedNo);
    }
    
    function finishProposal(uint proposalIndex) public {
        (bool error, string memory message, uint votedYes, uint votedNo) = beforeFinishProposal(proposalIndex, msg.sender);
        require (!error, message);

        proposals[proposalIndex].result = votedYes > votedNo? 1 : 0;

        if(votedYes > votedNo){
            if(proposals[proposalIndex].actionType == ActionType.add_voter){ // Add participant
                participants.push(proposals[proposalIndex].actionAddress);
            } 
            else if (proposals[proposalIndex].actionType == ActionType.remove_voter) { // Remove participant
                uint index = findParticipantIndex(proposals[proposalIndex].actionAddress) - 1;
                participants[index] = participants[participants.length-1]; // Copy last item on removed position and
                participants.pop(); // remove last
            }
            else if (proposals[proposalIndex].actionType == ActionType.set_percent){
                for(uint i = 0; proposals[proposalIndex].addresses.length > i; i++){
                    participantPercent[proposals[proposalIndex].addresses[i]] = proposals[proposalIndex].percents[i];
                }
            }
            else if (proposals[proposalIndex].actionType == ActionType.eth_emission) { // Transfer ETH
                uint totalSend = proposals[proposalIndex].amount;
                uint remains = totalSend;
                for(uint i = 0; participants.length > i; i++){
                    if(i < participants.length-1){
                        payable(participants[i]).transfer(totalSend/100*participantPercent[participants[i]]);
                        remains -= totalSend/100*participantPercent[participants[i]];
                    }
                    else
                        payable(participants[i]).transfer(remains);
                }
               
            }
        }
        emit FinishVoting(proposals[proposalIndex].actionType, votedYes > votedNo, proposalIndex);
    }

    function statusOfProposal (uint index) public view returns (address[] memory, uint8[] memory) {
        require(proposals.length > index, "Proposal at index not exist");
        return (proposals[index].voters, proposals[index].votes);
    }
    
    function getProposal(uint index) public view returns( uint endTime, uint8 result, ActionType actionType, address actionAddress, 
    uint8[] memory percents, address[] memory addresses, uint amount, address[] memory voters, uint8[] memory votes) {
        require(proposals.length > index, "Proposal at index not exist");
        Proposal memory p = proposals[index];
        return (p.endTime, p.result, p.actionType, p.actionAddress, p.percents, p.addresses, p.amount, p.voters, p.votes);
    }

    function proposalsLength () public view returns (uint) {
        return proposals.length;
    }

    function participantsLength () public view returns (uint) {
        return participants.length;
    }
    
    function percentagePayouts () public view returns (address[] memory participantsAdresses, uint8[] memory percents) {
        uint8[] memory pom = new uint8[](participants.length);
        for(uint i = 0; participants.length > i; i++){
            pom[i] = participantPercent[participants[i]];
        }
        return (participants, pom);
    }
    
    function findParticipantIndex(address addr) private view returns (uint) {
        for(uint i = 0; participants.length > i; i++){
            if(participants[i] == addr)
            return i+1;
        }
        return 0;
    }
}


contract DECENTRAL_ART is VAR, ERC721, DRAW, BUYPIX, VOTING {
    
    event PricesUpdated (uint256[] tokenIds, uint[] prices, address owner);
    event TokensSold (uint[] tokenIds, uint[] tokenPrices, uint fee, address newOwner);
    event ContractCreated (uint TransferFee, Phase[] Phases);
    
    uint transferFee = 15000;
    
    constructor() ERC721("Decentral ART", "ART"){
        owner = msg.sender;
        
        emit ContractCreated(transferFee, phases);
    }
    
    function setTransferFee(uint fee) public {
        require(owner == msg.sender, "Function is only for owner");
        transferFee = fee;
    }
    
    function getTransferFee() public view  returns (uint fee){
        return transferFee;
    }
    
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public  override payable{
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(msg.value == transferFee, "ART: not payed transfer fee. Please use method getTransferFee()");
        require(sellingPrice[tokenId] == 0, "ART: token is set to sell. Please use method setSellingPrices() and set price to zero.");
        _transfer(from, to, tokenId);

        uint[] memory tokens = new uint[](1);
        uint[] memory prices = new uint[](1);
        tokens[0] = tokenId;
        prices[0] = 0;
        emit TokensSold(tokens, prices, transferFee, to);
        
        if(_balances[to] == 0){
            hodlersIndex[to] = hodlers.length;
            hodlers.push(to);
        }

        checkGoalReached(payable(msg.sender));
        checkHodler(msg.sender);
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override payable{
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(msg.value == transferFee, "ART: not payed transfer fee. Please use method getTransferFee()");
        require(sellingPrice[tokenId] == 0, "ART: token is set to sell. Please use method setSellingPrices() and set price to zero.");
        _safeTransfer(from, to, tokenId, _data);

        uint[] memory tokens = new uint[](1);
        uint[] memory prices = new uint[](1);
        tokens[0] = tokenId;
        prices[0] = 0;
        emit TokensSold(tokens, prices, transferFee, to);

        if(_balances[to] == 0){
            hodlersIndex[to] = hodlers.length;
            hodlers.push(to);
        }

        checkGoalReached(payable(msg.sender));
        checkHodler(msg.sender);
    }
    
    function beforeSetSellingPrices(uint256[] memory tokenIds, uint[] memory prices) public view returns (bool error, string memory description){
        if(tokenIds.length != prices.length)
            return( true, "Not same size of arrays");
        
        for(uint256 i = 0; i < tokenIds.length; i++){
            if(_owners[tokenIds[i]] != msg.sender){
                return( true, "You are not owner of selected tokens");
            }
        }

        return(false, "ok");
    }
    
    function setSellingPrices(uint256[] memory tokenIds, uint[] memory prices) public {
        (bool error,  ) = beforeSetSellingPrices(tokenIds, prices);
        
        require(!error, "Error, use method beforeSetSellingPrices(uint256[] memory tokenIds, uint[] memory prices)");
        
        for(uint256 i = 0; i < tokenIds.length; i++){
            sellingPrice[tokenIds[i]] = prices[i];
        }
        emit PricesUpdated(tokenIds, prices, msg.sender);
    }
    
    function beforeBuyOfferedTokens(uint256[] memory tokenIds, uint sendingETH) public view returns (bool error, string memory description, uint fee){
        uint _price = 0;
        uint _fee = 0;
        for(uint256 i = 0; i < tokenIds.length; i++){
            if(sellingPrice[tokenIds[i]] == 0){
                return( true, "One of the selected tokens is not for sale.", _fee);
            }
            _price += sellingPrice[tokenIds[i]];
        }
        _fee = _price * 45;
        _fee = _fee / 1000;
        
        if(sendingETH != _price + _fee)
            return( true, "You are sending wrong amount of ETH.", _fee);
            
        return(false, "ok", _fee);
    }
    
    function buyOfferedTokens(uint256[] memory tokenIds) payable public {
        (bool error, ,uint256 fee) = beforeBuyOfferedTokens(tokenIds, msg.value);
        require(!error, "Error, use method beforeBuyOfferedTokens(uint256[] memory tokenIds, uint sendingETH)");
        
        if(_balances[msg.sender] == 0){
            hodlersIndex[msg.sender] = hodlers.length;
            hodlers.push(msg.sender);
        }
        
        uint[] memory tokenPrices = new uint[](tokenIds.length);
        for(uint256 i = 0; i < tokenIds.length; i++){
            address payable oldOwner = payable(_owners[tokenIds[i]]);
             oldOwner.transfer(sellingPrice[tokenIds[i]]);
             _transfer(oldOwner, msg.sender, tokenIds[i]);
             
             checkHodler(oldOwner);
             
             tokenPrices[i] = sellingPrice[tokenIds[i]];
             sellingPrice[tokenIds[i]] = 0;
        }
        emit TokensSold(tokenIds, tokenPrices, fee, msg.sender);
        mainGoalAmount += fee * 100 / 225;
    }
    
    function checkHodler(address hodler) internal {
        if(_balances[hodler] == 0){
            uint index = hodlersIndex[hodler];
            if(hodlers.length > 0 && hodlers[index] == hodler){
                if(index < hodlers.length-1){
                    hodlers[index] = hodlers[hodlers.length-1];
                    hodlersIndex[hodlers[hodlers.length-1]] = index;
                }
                hodlers.pop();
            }
        }
    }
    
    struct Owner {
        address owner;
        uint256[] winners;
    }
}

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":false,"internalType":"uint256","name":"TransferFee","type":"uint256"},{"components":[{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"uint256","name":"prizesAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"prize","type":"uint256"},{"internalType":"address[]","name":"buyers","type":"address[]"},{"internalType":"uint256[]","name":"winners","type":"uint256[]"},{"internalType":"uint256","name":"toGoalWallet","type":"uint256"}],"indexed":false,"internalType":"struct VAR.Phase[]","name":"Phases","type":"tuple[]"}],"name":"ContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"phase","type":"uint8"},{"indexed":false,"internalType":"address[]","name":"winners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"winnerIndexes","type":"uint256[]"}],"name":"DrawLots","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum VOTING.ActionType","name":"actionType","type":"uint8"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"FinishVoting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"owningTokens","type":"uint16"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GoalReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"PricesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"enum VOTING.ActionType","name":"actionType","type":"uint8"},{"indexed":false,"internalType":"address","name":"actionAddress","type":"address"},{"indexed":false,"internalType":"uint8[]","name":"percents","type":"uint8[]"},{"indexed":false,"internalType":"address[]","name":"addresses","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"oldPhase","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"actualPhase","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"first","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenPrices","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TokensSold","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint8","name":"phase","type":"uint8"}],"name":"VIPFounded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum VOTING.ActionType","name":"actionType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint8","name":"vote","type":"uint8"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"index","type":"uint8"},{"indexed":false,"internalType":"address[]","name":"winners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WinHodlers","type":"event"},{"inputs":[],"name":"actualHolderPriceIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"sendingETH","type":"uint256"}],"name":"beforeBuyOfferedTokens","outputs":[{"internalType":"bool","name":"error","type":"bool"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"beforeBuyTokens","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum VOTING.ActionType","name":"_actionType","type":"uint8"},{"internalType":"address","name":"_actionAddress","type":"address"},{"internalType":"uint8[]","name":"_percents","type":"uint8[]"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"address","name":"_senderAddress","type":"address"}],"name":"beforeCreateProposal","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"address","name":"senderAddress","type":"address"}],"name":"beforeFinishProposal","outputs":[{"internalType":"bool","name":"error","type":"bool"},{"internalType":"string","name":"message","type":"string"},{"internalType":"uint256","name":"votedYes","type":"uint256"},{"internalType":"uint256","name":"votedNo","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"beforeSetSellingPrices","outputs":[{"internalType":"bool","name":"error","type":"bool"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"address","name":"senderAddress","type":"address"}],"name":"beforeVoteInProposal","outputs":[{"internalType":"bool","name":"error","type":"bool"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"buyOfferedTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum VOTING.ActionType","name":"_actionType","type":"uint8"},{"internalType":"address","name":"_actionAddress","type":"address"},{"internalType":"uint8[]","name":"_percents","type":"uint8[]"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"drawHodlers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"drawLots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"}],"name":"finishProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"name":"firstOwnner","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getProposal","outputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint8","name":"result","type":"uint8"},{"internalType":"enum VOTING.ActionType","name":"actionType","type":"uint8"},{"internalType":"address","name":"actionAddress","type":"address"},{"internalType":"uint8[]","name":"percents","type":"uint8[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"voters","type":"address[]"},{"internalType":"uint8[]","name":"votes","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hodlers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hodlersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"ActualPhase","type":"uint256"},{"internalType":"uint256","name":"TotalMintedTokens","type":"uint256"},{"internalType":"uint256","name":"MainGoalWei","type":"uint256"},{"internalType":"uint256","name":"TotalWei","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participantsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentagePayouts","outputs":[{"internalType":"address[]","name":"participantsAdresses","type":"address[]"},{"internalType":"uint8[]","name":"percents","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"setSellingPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"statusOfProposal","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}],"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":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalIndex","type":"uint256"},{"internalType":"uint8","name":"vote","type":"uint8"}],"name":"voteInProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

66470de4df8200006001556002805460ff1916905560006003819055600981905560115561020060405260366080908152606d60a05260da60c05261014760e0526102226101005261036a6101205261058c610140526108f661016052610e83610180526117796101a0526125fd6101c052612aaf6101e0526200008890601290600c620017ff565b50604080516101608101825261037a815261022660208201526101549181019190915260d2606082015260826080820152605060a0820152603260c0820152601e60e08201526014610100820152600a6101208201819052610140820152620000f690601390600b620017ff565b506040805161026081018252600080825260208201819052918101919091526001606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015260026101408201526003610160820152600561018082015260086101a0820152600d6101c082015260156101e0820152602261020082015260376102208201526059610240820152620001a09060149060136200189c565b506015805460ff191690556040805161014081018252600a8082526014602083015260169282018390526017606083015260186080830152601960a0830152601a60c0830152601b60e0830152601c610100830152601d6101208301526200020a92919062001922565b50613a986025553480156200021e57600080fd5b50604080518082018252600d81526c111958d95b9d1c985b08105495609a1b60208083019190915282518084018452600381526210549560ea1b81830152835160e081018552600180825281840181815266038d7ea4c680009683019687526605543df729c00060608481019182526080850181815260a0860182905266460197d54c900060c0870152600a805495860181556000528551600790950260008051602062007c188339815191528101958655935160008051602062007bf8833981519152850155985160008051602062007c58833981519152840155905160008051602062007c388339815191528301559651805196979496949586956200033c9360008051602062007c7883398151915201929091019062001958565b5060a082015180516200035a916005840191602090910190620019b0565b5060c091820151600691909101556040805160e0810182526001808252602080830182815266038d7ea4c6800094840194855266470de4df820000606085019081526080850189815260a08601899052661f3a755b93600097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620004499360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000467916005840191602090910190620019b0565b5060c091820151600691909101556040805160e08101825260028152600160208083018281526653d81330b30000948401948552668e1bc9bf040000606085019081526080850189815260a08601899052664e99a92902c00097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620005579360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000575916005840191602090910190620019b0565b5060c091820151600691909101556040805160e08101825260038152600160208083018281526687b6b2966b800094840194855267016345785d8a0000606085019081526080850189815260a086018990526651415b42df753497860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620006669360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000684916005840191602090910190620019b0565b5060c091820151600691909101556040805160e081018252600581526001602080830182815266b1a2bc2ec500009484019485526702c68af0bb140000606085019081526080850189815260a08601899052665c03e9abaec00097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620007759360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000793916005840191602090910190620019b0565b5060c091820151600691909101556040805160e081018252600881526001602080830182815266db8ec5c71e800094840194855267058d15e176280000606085019081526080850189815260a08601899052665fc9cbd06f200097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620008849360008051602062007c788339815191529093019291019062001958565b5060a08201518051620008a2916005840191602090910190620019b0565b5060c091820151600691909101556040805160e081018252600d8152600160208083018281526701173e4897588000948401948552670ae86ed5e9750000606085019081526080850189815260a08601899052666d1306c800db0c97860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c38833981519152830155935180519294620009949360008051602062007c788339815191529093019291019062001958565b5060a08201518051620009b2916005840191602090910190620019b0565b5060c091820151600691909101556040805160e081018252601581526001602080830182815267023ed43e24a880009484019485526716744a6d6e950000606085019081526080850189815260a0860189905266f8b42e34393ea097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c3883398151915283015593518051929462000aa49360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000ac2916005840191602090910190620019b0565b5060c091820151600691909101556040805160e08101825260228152600160208083018281526703067dd851090000948401948552671e40ea732a5a0000606085019081526080850189815260a086018990526701899b73f838a53097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c3883398151915283015593518051929462000bb59360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000bd3916005840191602090910190620019b0565b5060c091820151600691909101556040805160e081018252603781526001602080830182815267034670bfe6fe00009484019485526720c0677f05ec0000606085019081526080850189815260a086018990526701dbcad6747bad2097860197909752600a80549485018155600052845160008051602062007c188339815191526007909502948501908155915160008051602062007bf8833981519152850155945160008051602062007c58833981519152840155935160008051602062007c3883398151915283015593518051929462000cc69360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000ce4916005840191602090910190620019b0565b5060c0918201516006909101556040805160e081018252605981526002602080830191825267054d22f9e03300009383019384526735035dc2c1fe0000606084019081526080840188815260a085018890526702b3d47541e3a76096850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c3883398151915283015593518051929462000dd89360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000df6916005840191602090910190620019b0565b5060c0918201516006909101556040805160e08101825260908152600360208083019182526706f05b59d3b20000938301938452674563918244f40000606084019081526080840188815260a08501889052670384c2cd716d5bf896850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c3883398151915283015593518051929462000eea9360008051602062007c788339815191529093019291019062001958565b5060a0820151805162000f08916005840191602090910190620019b0565b5060c0918201516006909101556040805160e08101825260e981526005602080830191825267089393b9c73100009383019384526755c3c541c7ea0000606084019081526080840188815260a0850188905267044076c5633e783896850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c3883398151915283015593518051929462000ffc9360008051602062007c788339815191529093019291019062001958565b5060a082015180516200101a916005840191602090910190620019b0565b5060c0918201516006909101556040805160e081018252610179815260086020808301918252670ae86ed5e9750000938301938452676d14545b1e920000606084019081526080840188815260a08501889052670558fae603bc0c1896850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c388339815191528301559351805192946200110f9360008051602062007c788339815191529093019291019062001958565b5060a082015180516200112d916005840191602090910190620019b0565b5060c0918201516006909101556040805160e0810182526102628152600d60208083019182526716744a6d6e95000093830193845267e08ae84651d20000606084019081526080840188815260a08501889052670ab3c4d80e507e1896850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c38833981519152830155935180519294620012229360008051602062007c788339815191529093019291019062001958565b5060a0820151805162001240916005840191602090910190620019b0565b5060c0918201516006909101556040805160e0810182526103db815260156020808301918252672455012115f9000093830193845268016b520b4adbba0000606084019081526080840188815260a0850188905267112712f07b6a5e3096850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c38833981519152830155935180519294620013369360008051602062007c788339815191529093019291019062001958565b5060a0820151805162001354916005840191602090910190620019b0565b5060c0918201516006909101556040805160e08101825261062b815260226020808301918252673235b7d4bd5d00009383019384526801f6192e4f65a20000606084019081526080840188815260a08501889052671785c7c47223401096850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c388339815191528301559351805192946200144a9360008051602062007c788339815191529093019291019062001958565b5060a0820151805162001468916005840191602090910190620019b0565b5060c0918201516006909101556040805160e081018252610a18815260376020808301918252673ac94b8e848e000093830193845268024bdcf3912d8c0000606084019081526080840188815260a08501889052671b943d8f659ff1f096850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c388339815191528301559351805192946200155e9360008051602062007c788339815191529093019291019062001958565b5060a082015180516200157c916005840191602090910190620019b0565b5060c0918201516006909101556040805160e081018252611055815260596020808301918252675f5f507061eac0009383019384526803b9b92463d32b8000606084019081526080840188815260a08501889052672c91b8ef89e4ebd096850196909652600a80546001810182556000919091528451600790910260008051602062007c188339815191528101918255935160008051602062007bf8833981519152850155945160008051602062007c588339815191528401555160008051602062007c38833981519152830155935180519294620016729360008051602062007c788339815191529093019291019062001958565b5060a0820151805162001690916005840191602090910190620019b0565b5060c0919091015160069091015550508151620016b590600b906020850190620019ee565b508051620016cb90600c906020840190620019ee565b505060218054600181810183557f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57091820180546001600160a01b031990811673dd5775d8f839bdeec91a0f7e47f3423752ed6e4f1790915583549182019093550180548216739d269611ae44bb242416ed78dc070bf5449385ae90811790915560226020527f7e50f3b19918a4ab704109b24e61eac6c18dababbac02567450005d3611a1800805460ff19908116603290811790925560009283527f4fadc9b0b46795db882b25421eb869df935f1a4f1d266a64ba08a71080d96e2680549091169091179055805490911633179055506025546040517fbda4426fc57829e0b8436f7d21ef5f881e9d467eb4a3c16e48c225df09d25c3d91620017f191600a9062001ac3565b60405180910390a162001c01565b6001830191839082156200188a5791602002820160005b838211156200185857835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001816565b8015620018885782816101000a81549061ffff021916905560020160208160010104928301926001030262001858565b505b506200189892915062001a6a565b5090565b6001830191839082156200188a5791602002820160005b83821115620018f357835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620018b3565b8015620018885782816101000a81549060ff0219169055600101602081600001049283019260010302620018f3565b82600a81019282156200188a579160200282015b828111156200188a578251829060ff1690559160200191906001019062001936565b8280548282559060005260206000209081019282156200188a579160200282015b828111156200188a57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062001979565b8280548282559060005260206000209081019282156200188a579160200282015b828111156200188a578251825591602001919060010190620019d1565b828054620019fc9062001bc4565b90600052602060002090601f01602090048101928262001a2057600085556200188a565b82601f1062001a3b57805160ff19168380011785556200188a565b828001600101855582156200188a57918201828111156200188a578251825591602001919060010190620019d1565b5b8082111562001898576000815560010162001a6b565b6000815480845260208085019450836000528060002060005b8381101562001ab85781548752958201956001918201910162001a9a565b509495945050505050565b600060408083018584526020828186015281865480845260609350838701915060058482821b89010160008a8152858120815b8581101562001bb2578b8403605f19018752815484526001808301548986015260028301548b86015260038301548a86015260e0608086018190526004840180549187018290528552898520610100870192909186905b8082101562001b755783546001600160a01b03168552938c0193928201929082019062001b4d565b5050505084810360a086015262001b8f8187850162001a81565b600684015460c09690960195909552509587019560079091019060010162001af6565b50919c9b505050505050505050505050565b600181811c9082168062001bd957607f821691505b6020821081141562001bfb57634e487b7160e01b600052602260045260246000fd5b50919050565b615fe78062001c116000396000f3fe60806040526004361061023f5760003560e01c806370a082311161012e578063bfd6e79f116100ab578063d035e72f1161006f578063d035e72f146106ed578063d0febe4c1461070d578063ddea572e14610715578063e985e9c514610735578063ed25f58e1461077e57600080fd5b8063bfd6e79f14610638578063c433050714610658578063c7f758a814610678578063c87b56dd146106ad578063cca88839146106cd57600080fd5b80639a17d8c1116100f25780639a17d8c114610595578063a22cb465146105aa578063b1d734a6146105ca578063b88d4fde146105f6578063bb11033e1461060957600080fd5b806370a082311461050b5780637a3b1e861461052b5780638e048c391461054b5780638f02bb5b1461056057806395d89b411461058057600080fd5b806333ddc5b0116101bc57806342842e0e1161018057806342842e0e1461048057806344c7c867146104935780635691095d146104a85780636352211e146104bb5780636ca19679146104db57600080fd5b806333ddc5b0146103cd57806335c1d349146103ed578063370158ea1461040d5780633875fb01146104485780634158506a1461046b57600080fd5b80631fca6408116102035780631fca64081461032a57806323b872dd1461033f5780632739327814610352578063276ee8761461037257806331b5fb2d1461039f57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da578063124d532e146102fc57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b6102663660046153d2565b61079e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107f0565b60405161027791906158d2565b3480156102ae57600080fd5b506102c26102bd36600461552d565b610882565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046152cd565b61091c565b005b34801561030857600080fd5b5061031c610317366004615148565b610a32565b604051908152602001610277565b34801561033657600080fd5b506102fa610ab9565b6102fa61034d366004615196565b610e3b565b34801561035e57600080fd5b506102fa61036d36600461552d565b610fff565b34801561037e57600080fd5b5061031c61038d366004615148565b60056020526000908152604090205481565b3480156103ab57600080fd5b506103bf6103ba36600461540c565b61166e565b60405161027792919061580a565b3480156103d957600080fd5b506103bf6103e836600461532b565b611957565b3480156103f957600080fd5b506102c261040836600461552d565b611a55565b34801561041957600080fd5b506002546003546001546040805160ff9094168452602084019290925290820152476060820152608001610277565b34801561045457600080fd5b5061045d611a7f565b6040516102779291906156ec565b34801561047757600080fd5b5060215461031c565b6102fa61048e366004615196565b611bbd565b34801561049f57600080fd5b5060235461031c565b6102fa6104b63660046152f7565b611bd8565b3480156104c757600080fd5b506102c26104d636600461552d565b611efd565b3480156104e757600080fd5b506104fb6104f6366004615546565b611f74565b6040516102779493929190615850565b34801561051757600080fd5b5061031c610526366004615148565b6125c9565b34801561053757600080fd5b506102c261054636600461552d565b612650565b34801561055757600080fd5b506102fa612660565b34801561056c57600080fd5b506102fa61057b36600461552d565b612ae7565b34801561058c57600080fd5b50610295612b46565b3480156105a157600080fd5b5060255461031c565b3480156105b657600080fd5b506102fa6105c5366004615291565b612b55565b3480156105d657600080fd5b506015546105e49060ff1681565b60405160ff9091168152602001610277565b6102fa6106043660046151d2565b612c1a565b34801561061557600080fd5b5061062961062436600461552d565b612de0565b60405161027793929190615825565b34801561064457600080fd5b5061045d61065336600461552d565b612fba565b34801561066457600080fd5b506103bf610673366004615546565b61312e565b34801561068457600080fd5b5061069861069336600461552d565b613384565b60405161027799989796959493929190615abf565b3480156106b957600080fd5b506102956106c836600461552d565b613681565b3480156106d957600080fd5b506102fa6106e83660046154a1565b613769565b3480156106f957600080fd5b506102fa610708366004615569565b613995565b6102fa613ae0565b34801561072157600080fd5b5061062961073036600461538e565b613ff4565b34801561074157600080fd5b5061026b610750366004615163565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b34801561078a57600080fd5b506102fa61079936600461532b565b614132565b60006001600160e01b031982166380ac58cd60e01b14806107cf57506001600160e01b03198216635b5e139f60e01b145b806107ea57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600b80546107ff90615ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90615ce6565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b5050505050905090565b6000818152600d60205260408120546001600160a01b03166109005760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600f60205260409020546001600160a01b031690565b600061092782611efd565b9050806001600160a01b0316836001600160a01b031614156109955760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108f7565b336001600160a01b03821614806109b157506109b18133610750565b610a235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108f7565b610a2d8383614285565b505050565b60006001600160a01b038216610a9d5760405162461bcd60e51b815260206004820152602a60248201527f49544f4b454e3a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108f7565b506001600160a01b031660009081526008602052604090205490565b601554600a60ff90911610610b085760405162461bcd60e51b81526020600482015260156024820152744e6f207072697a657320666f7220686f646c65727360581b60448201526064016108f7565b6000546001600160a01b03163314610b625760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e206973206f6e6c7920666f72206f776e657200000000000060448201526064016108f7565b600454600090606411610b76576064610b7a565b6004545b90506000816001600160401b03811115610b9657610b96615e00565b604051908082528060200260200182016040528015610bbf578160200160208202803683370190505b50601554909150600090620186a09060169060ff16600a8110610be457610be4615dea565b0154600154610bf39190615c50565b610bfd9190615c3c565b905060008080805b868160ff161015610dc357600a91505b60048054610c55918991610c2b90600290615c3c565b81548110610c3b57610c3b615dea565b6000918252602090912001546001600160a01b03166142f3565b935060048481548110610c6a57610c6a615dea565b6000918252602090912001546015546001600160a01b039091169350610c949060ff166001615c17565b6001600160a01b038416600090815260208052604090205460ff9081169116148015610cce5750600182610cc781615cc9565b935060ff16115b610c1557601554610ce39060ff166001615c17565b6001600160a01b03841660009081526020805260409020805460ff191660ff929092169190911790556004805485908110610d2057610d20615dea565b9060005260206000200160009054906101000a90046001600160a01b0316868260ff1681518110610d5357610d53615dea565b6001600160a01b0392831660209182029290920101526040519084169086156108fc029087906000818181858888f19350505050158015610d98573d6000803e3d6000fd5b508460016000828254610dab9190615c6f565b90915550819050610dbb81615d5e565b915050610c05565b506015546040517fcf247b6ff63cebb133bd487e77ff23d65dd43f8c573189bf3c46c8fc747f15a891610dff9160ff9091169088908890615b51565b60405180910390a16015805460ff16906000610e1a83615d5e565b91906101000a81548160ff021916908360ff16021790555050505050505050565b610e45338261436e565b610e615760405162461bcd60e51b81526004016108f790615a10565b6025543414610e825760405162461bcd60e51b81526004016108f790615937565b60008181526007602052604090205415610eae5760405162461bcd60e51b81526004016108f790615994565b610eb9838383614465565b6040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508282600081518110610f1257610f12615dea565b602002602001018181525050600081600081518110610f3357610f33615dea565b6020026020010181815250507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b9828260255487604051610f769493929190615759565b60405180910390a16001600160a01b0384166000908152600e6020526040902054610fe657600480546001600160a01b038616600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b610fef33614605565b610ff83361488c565b5050505050565b60008060008061100f8533611f74565b9350935093509350831583906110385760405162461bcd60e51b81526004016108f791906158d2565b5080821161104757600061104a565b60015b6023868154811061105d5761105d615dea565b906000526020600020906007020160010160006101000a81548160ff021916908360ff160217905550808211156115f9576000602386815481106110a3576110a3615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156110d3576110d3615dbe565b141561113b576021602386815481106110ee576110ee615dea565b600091825260208083206001600790930201820154845492830185559383529091200180546001600160a01b0319166001600160a01b0362010000909304929092169190911790556115f9565b60016023868154811061115057611150615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561118057611180615dbe565b141561128b57600060016111ca602388815481106111a0576111a0615dea565b906000526020600020906007020160010160029054906101000a90046001600160a01b0316614a1e565b6111d49190615c6f565b60218054919250906111e890600190615c6f565b815481106111f8576111f8615dea565b600091825260209091200154602180546001600160a01b03909216918390811061122457611224615dea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602180548061126357611263615dd4565b600082815260209020810160001990810180546001600160a01b0319169055019055506115f9565b6002602386815481106112a0576112a0615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156112d0576112d0615dbe565b14156113e55760005b80602387815481106112ed576112ed615dea565b90600052602060002090600702016003018054905011156113df576023868154811061131b5761131b615dea565b9060005260206000209060070201600201818154811061133d5761133d615dea565b90600052602060002090602091828204019190069054906101000a900460ff16602260006023898154811061137457611374615dea565b9060005260206000209060070201600301848154811061139657611396615dea565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191660ff92909216919091179055806113d781615d43565b9150506112d9565b506115f9565b6003602386815481106113fa576113fa615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561142a5761142a615dbe565b14156115f95760006023868154811061144557611445615dea565b60009182526020822060046007909202010154915081905b6021548110156115f55760215461147690600190615c6f565b81101561158e576021818154811061149057611490615dea565b6000918252602082200154602180546001600160a01b03909216926108fc9260229290869081106114c3576114c3615dea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff166114f6606487615c3c565b6115009190615c50565b6040518115909202916000818181858888f19350505050158015611528573d6000803e3d6000fd5b50602260006021838154811061154057611540615dea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611573606485615c3c565b61157d9190615c50565b6115879083615c6f565b91506115e3565b602181815481106115a1576115a1615dea565b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f193505050501580156115e1573d6000803e3d6000fd5b505b806115ed81615d43565b91505061145d565b5050505b7fb94cf879824333a2486c43eeccd7c16331e33fe78334ae370d0013f74adbbb756023868154811061162d5761162d615dea565b906000526020600020906007020160010160019054906101000a900460ff168284118760405161165f9392919061587e565b60405180910390a15050505050565b6000606061167b83614a1e565b6116ba57505060408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019061194d565b60028760038111156116ce576116ce615dbe565b101561181a5760006116df87614a1e565b905060008860038111156116f5576116f5615dbe565b14801561170157508015155b1561174557505060408051808201909152601e81527f54686973207061727469636970616e7420616c7265616479206578697374000060208201526001915061194d565b600188600381111561175957611759615dbe565b1415611818576001600160a01b03871660009081526022602052604090205460ff16156117a5576001604051806060016040528060308152602001615eed60309139925092505061194d565b806117e957505060408051808201909152601f81527f54686973206973206e6f74207061727469636970616e7420616464726573730060208201526001915061194d565b602154600210611818576001604051806060016040528060228152602001615f4560229139925092505061194d565b505b600287600381111561182e5761182e615dbe565b141561192e576021548551146118745750506040805180820190915260158152740aee4dedcce40e0cae4c6cadce8e640d8cadccee8d605b1b602082015260019061194d565b6021548451146118b55750506040805180820190915260168152750aee4dedcce40c2c8c8e4cae6e6cae640d8cadccee8d60531b602082015260019061194d565b6000805b80875111156118fb578681815181106118d4576118d4615dea565b6020026020010151826118e79190615c17565b9150806118f381615d43565b9150506118b9565b508060ff1660641461192c576001604051806060016040528060268152602001615ec760269139925092505061194d565b505b50506040805180820190915260028152616f6b60f01b60208201526000905b9550959350505050565b6000606082518451146119a257505060408051808201909152601781527f4e6f742073616d652073697a65206f66206172726179730000000000000000006020820152600190611a4e565b60005b8451811015611a2e57336001600160a01b0316600d60008784815181106119ce576119ce615dea565b6020908102919091018101518252810191909152604001600020546001600160a01b031614611a1c576001604051806060016040528060248152602001615e2d602491399250925050611a4e565b80611a2681615d43565b9150506119a5565b50506040805180820190915260028152616f6b60f01b6020820152600091505b9250929050565b60218181548110611a6557600080fd5b6000918252602090912001546001600160a01b0316905081565b60608060006021805490506001600160401b03811115611aa157611aa1615e00565b604051908082528060200260200182016040528015611aca578160200160208202803683370190505b50905060005b602154811015611b54576022600060218381548110611af157611af1615dea565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110611b3057611b30615dea565b60ff9092166020928302919091019091015280611b4c81615d43565b915050611ad0565b5060218181805480602002602001604051908101604052809291908181526020018280548015611bad57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b8f575b5050505050915092509250509091565b610a2d83838360405180602001604052806000815250612c1a565b600080611be58334613ff4565b92505091508115611c7b5760405162461bcd60e51b815260206004820152605460248201527f4572726f722c20757365206d6574686f64206265666f72654275794f6666657260448201527f6564546f6b656e732875696e743235365b5d206d656d6f727920746f6b656e4960648201527364732c2075696e742073656e64696e674554482960601b608482015260a4016108f7565b336000908152600e6020526040902054611cd1576004805433600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b600083516001600160401b03811115611cec57611cec615e00565b604051908082528060200260200182016040528015611d15578160200160208202803683370190505b50905060005b8451811015611e8c576000600d6000878481518110611d3c57611d3c615dea565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b03166108fc60076000898681518110611d8b57611d8b615dea565b60200260200101518152602001908152602001600020549081150290604051600060405180830381858888f19350505050158015611dcd573d6000803e3d6000fd5b50611df28133888581518110611de557611de5615dea565b6020026020010151614465565b611dfb8161488c565b60076000878481518110611e1157611e11615dea565b6020026020010151815260200190815260200160002054838381518110611e3a57611e3a615dea565b602002602001018181525050600060076000888581518110611e5e57611e5e615dea565b6020026020010151815260200190815260200160002081905550508080611e8490615d43565b915050611d1b565b507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b984828433604051611ec29493929190615759565b60405180910390a160e1611ed7836064615c50565b611ee19190615c3c565b60016000828254611ef29190615bff565b909155505050505050565b6000818152600d60205260408120546001600160a01b0316806107ea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108f7565b600060606000806000611f8686614a1e565b905060008060005b8060238b81548110611fa257611fa2615dea565b90600052602060002090600702016005018054905011156120a45760238a81548110611fd057611fd0615dea565b90600052602060002090600702016006018181548110611ff257611ff2615dea565b90600052602060002090602091828204019190069054906101000a900460ff1660ff166001141561202b578261202781615d43565b9350505b60238a8154811061203e5761203e615dea565b9060005260206000209060070201600601818154811061206057612060615dea565b60009182526020918290209181049091015460ff601f9092166101000a900416612092578161208e81615d43565b9250505b8061209c81615d43565b915050611f8e565b50826120ed5760408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019750955090935091506125c09050565b600060238a8154811061210257612102615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561213257612132615dbe565b1480156121545750600061215260238b815481106111a0576111a0615dea565b115b1561219f5760408051808201909152601e81527f54686973207061727469636970616e7420616c72656164792065786973740000602082015260019750955090935091506125c09050565b600160238a815481106121b4576121b4615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156121e4576121e4615dbe565b1480156121f357506021546002145b156122275760018282604051806060016040528060288152602001615f1d60289139919096509650965096505050506125c0565b600160238a8154811061223c5761223c615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561226c5761226c615dbe565b1480156122c6575060006022600060238c8154811061228d5761228d615dea565b60009182526020808320600792909202909101600101546201000090046001600160a01b0316835282019290925260400190205460ff16115b156122fa5760018282604051806060016040528060308152602001615eed60309139919096509650965096505050506125c0565b60235489106123495760408051808201909152601781527f50726f706f73616c20646f6573206e6f74206578697374000000000000000000602082015260019750955090935091506125c09050565b6023898154811061235c5761235c615dea565b600091825260209091206007909102016001015460ff166002146123b657604080518082019091526013815272159bdd1a5b99c81a185cc8199a5b9a5cda1959606a1b602082015260019750955090935091506125c09050565b602389815481106123c9576123c9615dea565b90600052602060002090600702016000015442111580156124145750602154602380548b9081106123fc576123fc615dea565b90600052602060002090600702016005018054905014155b1561245857604080518082019091526016815275159bdd1a5b99c81a5cc81b9bdd08199a5b9a5cda195960521b602082015260019750955090935091506125c09050565b600360238a8154811061246d5761246d615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561249d5761249d615dbe565b1480156124cd5750602389815481106124b8576124b8615dea565b90600052602060002090600702016004015447105b1561250a5760408051808201909152600f81526e4c6f77204554482062616c616e636560881b602082015260019750955090935091506125c09050565b6023898154811061251d5761251d615dea565b600091825260209091206005600790920201015460215461253e9190615c6f565b60238a8154811061255157612551615dea565b9060005260206000209060070201600501805490501161259a5760018282604051806060016040528060318152602001615e9660319139919096509650965096505050506125c0565b6040805180820190915260028152616f6b60f01b60208201526000975095509093509150505b92959194509250565b60006001600160a01b0382166126345760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108f7565b506001600160a01b03166000908152600e602052604090205490565b60048181548110611a6557600080fd5b600254600a8054909160ff1690811061267b5761267b615dea565b9060005260206000209060070201600001546000146126f15760405162461bcd60e51b815260206004820152602c60248201527f4e6f7420616c6c20746f6b656e73207765726520736f6c6420696e207468652060448201526b61637475616c20706861736560a01b60648201526084016108f7565b600254600a805460009260ff1690811061270d5761270d615dea565b9060005260206000209060070201600101546001600160401b0381111561273657612736615e00565b60405190808252806020026020018201604052801561275f578160200160208202803683370190505b50600254600a8054929350600092909160ff1690811061278157612781615dea565b9060005260206000209060070201600101546001600160401b038111156127aa576127aa615e00565b6040519080825280602002602001820160405280156127d3578160200160208202803683370190505b50905060005b600254600a8054909160ff169081106127f4576127f4615dea565b9060005260206000209060070201600101548161ffff161015612a4c57600254600a80546128839260ff1690811061282e5761282e615dea565b6000918252602090912060046007909202010154600254600a8054909160ff1690811061285d5761285d615dea565b90600052602060002090600702016004018361ffff1681548110610c3b57610c3b615dea565b838261ffff168151811061289957612899615dea565b6020908102919091010152600254600a8054909160ff169081106128bf576128bf615dea565b9060005260206000209060070201600401838261ffff16815181106128e6576128e6615dea565b6020026020010151815481106128fe576128fe615dea565b9060005260206000200160009054906101000a90046001600160a01b0316828261ffff168151811061293257612932615dea565b6001600160a01b0390921660209283029190910190910152600254600a8054909160ff1690811061296557612965615dea565b9060005260206000209060070201600501838261ffff168151811061298c5761298c615dea565b602090810291909101810151825460018101845560009384529190922001558151829061ffff83169081106129c3576129c3615dea565b60200260200101516001600160a01b03166108fc600a600260009054906101000a900460ff1660ff16815481106129fc576129fc615dea565b9060005260206000209060070201600301549081150290604051600060405180830381858888f19350505050158015612a39573d6000803e3d6000fd5b5080612a4481615d21565b9150506127d9565b50600254600a80547fe4b8f6054f46c8448ffef3fc98fe56acc937804bf21e8d59bb721d668a87f87c9260ff1691849183908110612a8c57612a8c615dea565b90600052602060002090600702016003015485604051612aaf9493929190615b6d565b60405180910390a16002805460ff16906000612aca83615d5e565b91906101000a81548160ff021916908360ff160217905550505050565b6000546001600160a01b03163314612b415760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e206973206f6e6c7920666f72206f776e657200000000000060448201526064016108f7565b602555565b6060600c80546107ff90615ce6565b6001600160a01b038216331415612bae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108f7565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612c24338361436e565b612c405760405162461bcd60e51b81526004016108f790615a10565b6025543414612c615760405162461bcd60e51b81526004016108f790615937565b60008281526007602052604090205415612c8d5760405162461bcd60e51b81526004016108f790615994565b612c9984848484614a8a565b6040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508382600081518110612cf257612cf2615dea565b602002602001018181525050600081600081518110612d1357612d13615dea565b6020026020010181815250507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b9828260255488604051612d569493929190615759565b60405180910390a16001600160a01b0385166000908152600e6020526040902054612dc657600480546001600160a01b038716600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b612dcf33614605565b612dd83361488c565b505050505050565b600254600a80546000926060928492839260ff16908110612e0357612e03615dea565b90600052602060002090600702016002015485612e209190615c3c565b600254600a8054929350600092909160ff16908110612e4157612e41615dea565b90600052602060002090600702016002015486612e5e9190615d7e565b905081612ea7575060408051808201909152601d81527f4e6f7420656e6f7567682077656920746f20627579206120746f6b656e00000060208201526001945092509050612fb3565b8015612eef575060408051808201909152601f81527f506c656173652073656e6420657861637420616d6f756e74206f66207765690060208201526001945092509050612fb3565b600254600a8054849260ff16908110612f0a57612f0a615dea565b9060005260206000209060070201600001541015612f4c57600182604051806060016040528060218152602001615e5160219139909450945094505050612fb3565b612aaf60035410612f905750604080518082019091526014815273105b1b081d1bdad95b9cc81c1d5c98da185cd95960621b60208201526001945092509050612fb3565b506040805180820190915260028152616f6b60f01b602082015260009450925090505b9193909250565b60608082602380549050116130115760405162461bcd60e51b815260206004820152601b60248201527f50726f706f73616c20617420696e646578206e6f74206578697374000000000060448201526064016108f7565b6023838154811061302457613024615dea565b90600052602060002090600702016005016023848154811061304857613048615dea565b9060005260206000209060070201600601818054806020026020016040519081016040528092919081815260200182805480156130ae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613090575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561311e57602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116130ef5790505b5050505050905091509150915091565b60006060600061313d84614a1e565b90508061318057505060408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019150611a4e565b60235485106131bd575050604080518082019091526012815271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b602082015260019150611a4e565b602385815481106131d0576131d0615dea565b600091825260209091206007909102016001015460ff16600214613221575050604080518082019091526011815270141c9bdc1bdcd85b08199a5b9a5cda1959607a1b602082015260019150611a4e565b6023858154811061323457613234615dea565b9060005260206000209060070201600001544210613284575050604080518082019091526016815275151a5b5948199bdc881d9bdd1a5b99c81a5cc81bdd5d60521b602082015260019150611a4e565b60005b806023878154811061329b5761329b615dea565b906000526020600020906007020160050180549050111561335d57846001600160a01b0316602387815481106132d3576132d3615dea565b906000526020600020906007020160050182815481106132f5576132f5615dea565b6000918252602090912001546001600160a01b0316141561334b57600160405180604001604052806015815260200174165bdd48185c9948185b1c9958591e481d9bdd1959605a1b815250935093505050611a4e565b8061335581615d43565b915050613287565b50506040805180820190915260028152616f6b60f01b602082015260009590945092505050565b600080600080606080600060608089602380549050116133e65760405162461bcd60e51b815260206004820152601b60248201527f50726f706f73616c20617420696e646578206e6f74206578697374000000000060448201526064016108f7565b600060238b815481106133fb576133fb615dea565b60009182526020918290206040805161012081018252600790930290910180548352600181015460ff808216958501959095529293909291840191610100900416600381111561344d5761344d615dbe565b600381111561345e5761345e615dbe565b815260018201546201000090046001600160a01b031660208083019190915260028301805460408051828502810185018252828152940193928301828280156134e457602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116134b55790505b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561354657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613528575b5050505050815260200160048201548152602001600582018054806020026020016040519081016040528092919081815260200182805480156135b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613594575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561362857602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116135f95790505b5050505050815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b6000818152600d60205260409020546060906001600160a01b03166137005760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108f7565b600061371760408051602081019091526000815290565b905060008151116137375760405180602001604052806000815250613762565b8061374184614ac3565b604051602001613752929190615681565b6040516020818303038152906040525b9392505050565b600080613779878787873361166e565b915091508115819061379e5760405162461bcd60e51b81526004016108f791906158d2565b5060006137ae426203f480615bff565b90506060806023604051806101200160405280858152602001600260ff1681526020018c60038111156137e3576137e3615dbe565b81526001600160a01b038c1660208083019190915260408083018d9052606083018c9052608083018b905260a0830187905260c0909201859052835460018181018655600095865294829020845160079092020190815590830151938101805460ff90951660ff19861681178255928401519394919392909161ffff19161761010083600381111561387757613877615dbe565b021790555060608201516001820180546001600160a01b03909216620100000275ffffffffffffffffffffffffffffffffffffffff000019909216919091179055608082015180516138d3916002840191602090910190614ea2565b5060a082015180516138ef916003840191602090910190614f48565b5060c0820151600482015560e08201518051613915916005840191602090910190614f48565b506101008201518051613932916006840191602090910190614ea2565b5050507f534f1d8d2c3b462b484917bfaed9564a69bfc7f31710cd9f5071d8881d5c78d0838b8b8b8b8b600160238054905061396e9190615c6f565b6040516139819796959493929190615a61565b60405180910390a150505050505050505050565b6000806139a2843361312e565b91509150811581906139c75760405162461bcd60e51b81526004016108f791906158d2565b50602384815481106139db576139db615dea565b60009182526020808320600560079093020191909101805460018101825590835291200180546001600160a01b031916331790556023805485908110613a2357613a23615dea565b6000918252602080832060066007909302019190910180546001810182559083529181902090820401805460ff808716601f9094166101000a93840293021916919091179055602380547f7546dd2efc4351c25332cd15fddaed6a7e1b7721e7c183dc54c9b037d1b0faf9919086908110613aa057613aa0615dea565b906000526020600020906007020160010160019054906101000a900460ff16853386604051613ad2949392919061589d565b60405180910390a150505050565b600080613aec34612de0565b92505091508115613b595760405162461bcd60e51b815260206004820152603160248201527f4572726f722c20757365206d6574686f64206265666f7265427579546f6b656e604482015270732875696e7420776569416d6f756e742960781b60648201526084016108f7565b600354336000908152600e6020526040812054613bb2576004805433600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b60005b83811015613e5b57613bd43382600354613bcf9190615bff565b614bc0565b600254600a805466470de4df8200009260ff16908110613bf657613bf6615dea565b906000526020600020906007020160060154600154613c159190615bff565b613c1f9190615c6f565b600155600254600a8054909160ff16908110613c3d57613c3d615dea565b60009182526020808320600460079093020191909101805460018101825590835291200180546001600160a01b03191633908117909155613c7d90614605565b60025460009060149060ff1660138110613c9957613c99615dea565b602081049091015460ff601f9092166101000a9004161115613e0d5760025460009060149060ff1660138110613cd157613cd1615dea565b6020810490910154600254600a805460ff601f9095166101000a90930484169390929116908110613d0457613d04615dea565b9060005260206000209060070201600001541115613d3857600254600354613d3391339160ff90911690614bda565b613d3b565b60015b90508060ff1660011415613e0b5760025460149060ff1660138110613d6257613d62615dea565b6020918282040191900681819054906101000a900460ff1680929190613d8790615cc9565b91906101000a81548160ff021916908360ff16021790555050600682600354613db09190615bff565b8154600181018355600092835260209092209091015560028054600a8054909160ff16908110613de257613de2615dea565b906000526020600020906007020160020154613dfe9190615c3c565b613e089084615bff565b92505b505b600254600a8054909160ff16908110613e2857613e28615dea565b600091825260208220600790910201805491613e4383615cb2565b91905055508080613e5390615d43565b915050613bb5565b508015613ee057604051339082156108fc029083906000818181858888f19350505050158015613e8f573d6000803e3d6000fd5b506002546040517f316d5a922909f37668417ae03463664989482813f3b95858ae640c7ca63d4e6791613ecc916006918591339160ff169061579f565b60405180910390a1613ee060066000614f9d565b8260036000828254613ef29190615bff565b90915550503360009081526008602052604081208054859290613f16908490615bff565b9091555050600254600a805460ff9092169182908110613f3857613f38615dea565b90600052602060002090600702016000015460001415613f5a57613f5a612660565b600254600a80547f4d22b4faa55c2fc8e1b466707df1233bd3f7909d91e69e09147c222e5e53b35492849260ff909116918791899133919085908110613fa257613fa2615dea565b6000918252602091829020600260079092020101546040805160ff988916815297909616918701919091529385019290925260608401526001600160a01b0316608083015260a082015260c00161165f565b60006060818080805b87518110156140b2576007600089838151811061401c5761401c615dea565b602002602001015181526020019081526020016000205460001415614066576001826040518060600160405280602b8152602001615f67602b91399095509550955050505061412b565b6007600089838151811061407c5761407c615dea565b60200260200101518152602001908152602001600020548361409e9190615bff565b9250806140aa81615d43565b915050613ffd565b506140be82602d615c50565b90506140cc6103e882615c3c565b90506140d88183615bff565b861461410857600181604051806060016040528060248152602001615e726024913990945094509450505061412b565b6040805180820190915260028152616f6b60f01b60208201526000955093509150505b9250925092565b600061413e8383611957565b50905080156141db5760405162461bcd60e51b815260206004820152605960248201527f4572726f722c20757365206d6574686f64206265666f726553657453656c6c6960448201527f6e675072696365732875696e743235365b5d206d656d6f727920746f6b656e4960648201527f64732c2075696e745b5d206d656d6f7279207072696365732900000000000000608482015260a4016108f7565b60005b8351811015614244578281815181106141f9576141f9615dea565b60200260200101516007600086848151811061421757614217615dea565b6020026020010151815260200190815260200160002081905550808061423c90615d43565b9150506141de565b507f2fd3c0dd04a6e30e43089f7b3b553f81e5b06ee918fdcd343dec51463b13b3a38383336040516142789392919061571a565b60405180910390a1505050565b6000818152600f6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906142ba82611efd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600980546000918261430483615d43565b91905055508244428460095460405160200161434b9493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b6040516020818303038152906040528051906020012060001c6137629190615d7e565b6000818152600d60205260408120546001600160a01b03166143e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108f7565b60006143f283611efd565b9050806001600160a01b0316846001600160a01b0316148061442d5750836001600160a01b031661442284610882565b6001600160a01b0316145b8061445d57506001600160a01b0380821660009081526010602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661447882611efd565b6001600160a01b0316146144e05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108f7565b6001600160a01b0382166145425760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108f7565b61454d600082614285565b6001600160a01b0383166000908152600e60205260408120805460019290614576908490615c6f565b90915550506001600160a01b0382166000908152600e602052604081208054600192906145a4908490615bff565b90915550506000818152600d602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000614610826125c9565b9050600b60115410801561465657506012601154600c811061463457614634615dea565b601091828204019190066002029054906101000a900461ffff1661ffff168110155b1561478e5760006103e86013601154600b811061467557614675615dea565b601091828204019190066002029054906101000a900461ffff1661ffff166001546146a09190615c50565b6146aa9190615c3c565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156146e3573d6000803e3d6000fd5b5080600160008282546146f69190615c6f565b925050819055507f14912e9ca162a9b9427e329877fdbc973d680907a773e517f38924661f2779d66012601154600c811061473357614733615dea565b60108104919091015460408051600f9093166002026101000a90910461ffff1682526001600160a01b0386166020830152810183905260600160405180910390a16011805490600061478483615d43565b9190505550505050565b601154600b1480156147d257506012601154600c81106147b0576147b0615dea565b601091828204019190066002029054906101000a900461ffff1661ffff168110155b15614888576001546040516001600160a01b0384169180156108fc02916000818181858888f1935050505015801561480e573d6000803e3d6000fd5b5060015460408051612aaf81526001600160a01b038516602082015280820192909252517f14912e9ca162a9b9427e329877fdbc973d680907a773e517f38924661f2779d69181900360600190a16001805490600061486d8380615c6f565b90915550506011805490600061488283615d43565b91905055505b5050565b6001600160a01b0381166000908152600e6020526040902054614a1b576001600160a01b038116600090815260056020526040902054600454158015906149025750816001600160a01b0316600482815481106148eb576148eb615dea565b6000918252602090912001546001600160a01b0316145b156148885760045461491690600190615c6f565b8110156149e6576004805461492d90600190615c6f565b8154811061493d5761493d615dea565b600091825260209091200154600480546001600160a01b03909216918390811061496957614969615dea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060056000600460016004805490506149b09190615c6f565b815481106149c0576149c0615dea565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b60048054806149f7576149f7615dd4565b600082815260209020810160001990810180546001600160a01b0319169055019055505b50565b6000805b602154811015614a8157826001600160a01b031660218281548110614a4957614a49615dea565b6000918252602090912001546001600160a01b03161415614a6f57613762816001615bff565b80614a7981615d43565b915050614a22565b50600092915050565b614a95848484614465565b614aa184848484614c4b565b614abd5760405162461bcd60e51b81526004016108f7906158e5565b50505050565b606081614ae75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614b115780614afb81615d43565b9150614b0a9050600a83615c3c565b9150614aeb565b6000816001600160401b03811115614b2b57614b2b615e00565b6040519080825280601f01601f191660200182016040528015614b55576020820181803683370190505b5090505b841561445d57614b6a600183615c6f565b9150614b77600a86615d7e565b614b82906030615bff565b60f81b818381518110614b9757614b97615dea565b60200101906001600160f81b031916908160001a905350614bb9600a86615c3c565b9450614b59565b614888828260405180602001604052806000815250614d58565b604080514460208201524291810191909152606084811b6bffffffffffffffffffffffff19169082015260f883901b6001600160f81b0319166074820152607581018290526000906002906095016040516020818303038152906040528051906020012060001c61445d9190615d7e565b60006001600160a01b0384163b15614d4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614c8f9033908990889088906004016156b0565b602060405180830381600087803b158015614ca957600080fd5b505af1925050508015614cd9575060408051601f3d908101601f19168201909252614cd6918101906153ef565b60015b614d33573d808015614d07576040519150601f19603f3d011682016040523d82523d6000602084013e614d0c565b606091505b508051614d2b5760405162461bcd60e51b81526004016108f7906158e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061445d565b506001949350505050565b614d628383614d8b565b614d6f6000848484614c4b565b610a2d5760405162461bcd60e51b81526004016108f7906158e5565b6001600160a01b038216614de15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108f7565b6000818152600d60205260409020546001600160a01b031615614e465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f7565b6001600160a01b0382166000908152600e60205260408120805460019290614e6f908490615bff565b90915550506000908152600d6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b82805482825590600052602060002090601f01602090048101928215614f385791602002820160005b83821115614f0957835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302614ecb565b8015614f365782816101000a81549060ff0219169055600101602081600001049283019260010302614f09565b505b50614f44929150614fb7565b5090565b828054828255906000526020600020908101928215614f38579160200282015b82811115614f3857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f68565b5080546000825590600052602060002090810190614a1b91905b5b80821115614f445760008155600101614fb8565b80356001600160a01b0381168114614fe357600080fd5b919050565b600082601f830112614ff957600080fd5b8135602061500e61500983615bdc565b615bac565b80838252828201915082860187848660051b890101111561502e57600080fd5b60005b858110156150545761504282614fcc565b84529284019290840190600101615031565b5090979650505050505050565b600082601f83011261507257600080fd5b8135602061508261500983615bdc565b80838252828201915082860187848660051b89010111156150a257600080fd5b60005b85811015615054578135845292840192908401906001016150a5565b600082601f8301126150d257600080fd5b813560206150e261500983615bdc565b80838252828201915082860187848660051b890101111561510257600080fd5b60005b858110156150545761511682615137565b84529284019290840190600101615105565b803560048110614fe357600080fd5b803560ff81168114614fe357600080fd5b60006020828403121561515a57600080fd5b61376282614fcc565b6000806040838503121561517657600080fd5b61517f83614fcc565b915061518d60208401614fcc565b90509250929050565b6000806000606084860312156151ab57600080fd5b6151b484614fcc565b92506151c260208501614fcc565b9150604084013590509250925092565b600080600080608085870312156151e857600080fd5b6151f185614fcc565b93506020615200818701614fcc565b93506040860135925060608601356001600160401b038082111561522357600080fd5b818801915088601f83011261523757600080fd5b81358181111561524957615249615e00565b61525b601f8201601f19168501615bac565b9150808252898482850101111561527157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156152a457600080fd5b6152ad83614fcc565b9150602083013580151581146152c257600080fd5b809150509250929050565b600080604083850312156152e057600080fd5b6152e983614fcc565b946020939093013593505050565b60006020828403121561530957600080fd5b81356001600160401b0381111561531f57600080fd5b61445d84828501615061565b6000806040838503121561533e57600080fd5b82356001600160401b038082111561535557600080fd5b61536186838701615061565b9350602085013591508082111561537757600080fd5b5061538485828601615061565b9150509250929050565b600080604083850312156153a157600080fd5b82356001600160401b038111156153b757600080fd5b6153c385828601615061565b95602094909401359450505050565b6000602082840312156153e457600080fd5b813561376281615e16565b60006020828403121561540157600080fd5b815161376281615e16565b600080600080600060a0868803121561542457600080fd5b61542d86615128565b945061543b60208701614fcc565b935060408601356001600160401b038082111561545757600080fd5b61546389838a016150c1565b9450606088013591508082111561547957600080fd5b5061548688828901614fe8565b92505061549560808701614fcc565b90509295509295909350565b600080600080600060a086880312156154b957600080fd5b6154c286615128565b94506154d060208701614fcc565b935060408601356001600160401b03808211156154ec57600080fd5b6154f889838a016150c1565b9450606088013591508082111561550e57600080fd5b5061551b88828901614fe8565b95989497509295608001359392505050565b60006020828403121561553f57600080fd5b5035919050565b6000806040838503121561555957600080fd5b8235915061518d60208401614fcc565b6000806040838503121561557c57600080fd5b8235915061518d60208401615137565b600081518084526020808501945080840160005b838110156155c55781516001600160a01b0316875295820195908201906001016155a0565b509495945050505050565b600081518084526020808501945080840160005b838110156155c5578151875295820195908201906001016155e4565b600081518084526020808501945080840160005b838110156155c557815160ff1687529582019590820190600101615614565b6000815180845261564b816020860160208601615c86565b601f01601f19169290920160200192915050565b6004811061567d57634e487b7160e01b600052602160045260246000fd5b9052565b60008351615693818460208801615c86565b8351908301906156a7818360208801615c86565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526156e26080830184615633565b9695505050505050565b6040815260006156ff604083018561558c565b82810360208401526157118185615600565b95945050505050565b60608152600061572d60608301866155d0565b828103602084015261573f81866155d0565b9150506001600160a01b0383166040830152949350505050565b60808152600061576c60808301876155d0565b828103602084015261577e81876155d0565b9150508360408301526001600160a01b038316606083015295945050505050565b6000608082016080835280875480835260a08501915088600052602092508260002060005b828110156157e0578154845292840192600191820191016157c4565b50505090830195909552506001600160a01b0392909216604083015260ff16606090910152919050565b821515815260406020820152600061445d6040830184615633565b83151581526060602082015260006158406060830185615633565b9050826040830152949350505050565b841515815260806020820152600061586b6080830186615633565b6040830194909452506060015292915050565b6060810161588c828661565f565b921515602082015260400152919050565b608081016158ab828761565f565b8460208301526001600160a01b038416604083015260ff8316606083015295945050505050565b6020815260006137626020830184615633565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252603f908201527f4152543a206e6f74207061796564207472616e73666572206665652e20506c6560408201527f61736520757365206d6574686f64206765745472616e73666572466565282900606082015260800190565b60208082526056908201527f4152543a20746f6b656e2069732073657420746f2073656c6c2e20506c65617360408201527f6520757365206d6574686f642073657453656c6c696e6750726963657328292060608201527530b7321039b2ba10383934b1b2903a37903d32b9379760511b608082015260a00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b878152615a71602082018861565f565b6001600160a01b038616604082015260e060608201526000615a9660e0830187615600565b8281036080840152615aa8818761558c565b60a0840195909552505060c0015295945050505050565b60006101208b835260ff8b166020840152615add604084018b61565f565b6001600160a01b0389166060840152806080840152615afe81840189615600565b905082810360a0840152615b12818861558c565b90508560c084015282810360e0840152615b2c818661558c565b9050828103610100840152615b418185615600565b9c9b505050505050505050505050565b60ff84168152606060208201526000615840606083018561558c565b60ff85168152608060208201526000615b89608083018661558c565b8460408401528281036060840152615ba181856155d0565b979650505050505050565b604051601f8201601f191681016001600160401b0381118282101715615bd457615bd4615e00565b604052919050565b60006001600160401b03821115615bf557615bf5615e00565b5060051b60200190565b60008219821115615c1257615c12615d92565b500190565b600060ff821660ff84168060ff03821115615c3457615c34615d92565b019392505050565b600082615c4b57615c4b615da8565b500490565b6000816000190483118215151615615c6a57615c6a615d92565b500290565b600082821015615c8157615c81615d92565b500390565b60005b83811015615ca1578181015183820152602001615c89565b83811115614abd5750506000910152565b600081615cc157615cc1615d92565b506000190190565b600060ff821680615cdc57615cdc615d92565b6000190192915050565b600181811c90821680615cfa57607f821691505b60208210811415615d1b57634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415615d3957615d39615d92565b6001019392505050565b6000600019821415615d5757615d57615d92565b5060010190565b600060ff821660ff811415615d7557615d75615d92565b60010192915050565b600082615d8d57615d8d615da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114614a1b57600080fdfe596f7520617265206e6f74206f776e6572206f662073656c656374656420746f6b656e734e6f7420656e6f75676820746f6b656e7320696e2061637475616c207068617365596f75206172652073656e64696e672077726f6e6720616d6f756e74206f66204554482e436f756e74206f6620766f746564207061727469636970616e7473206d757374206265206d6f7265207468616e203530255468652073756d206f66207468652070657263656e7461676573206d75737420626520313030546865207061727469636970616e7420746f2064656c657465206d7573742068617665207a65726f2070657263656e744d696e696d616c20636f756e74206f6620766f746564207061727469636970616e747320697320324d696e696d616c20636f756e74206f66207061727469636970616e747320697320324f6e65206f66207468652073656c656374656420746f6b656e73206973206e6f7420666f722073616c652e8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19ba26469706673582212203bd8912cc7d192ab7ee7110988a1dbb2581040ba94a2db423281cd2e6505f45f64736f6c63430008070033c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2abc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aac65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2ac

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806370a082311161012e578063bfd6e79f116100ab578063d035e72f1161006f578063d035e72f146106ed578063d0febe4c1461070d578063ddea572e14610715578063e985e9c514610735578063ed25f58e1461077e57600080fd5b8063bfd6e79f14610638578063c433050714610658578063c7f758a814610678578063c87b56dd146106ad578063cca88839146106cd57600080fd5b80639a17d8c1116100f25780639a17d8c114610595578063a22cb465146105aa578063b1d734a6146105ca578063b88d4fde146105f6578063bb11033e1461060957600080fd5b806370a082311461050b5780637a3b1e861461052b5780638e048c391461054b5780638f02bb5b1461056057806395d89b411461058057600080fd5b806333ddc5b0116101bc57806342842e0e1161018057806342842e0e1461048057806344c7c867146104935780635691095d146104a85780636352211e146104bb5780636ca19679146104db57600080fd5b806333ddc5b0146103cd57806335c1d349146103ed578063370158ea1461040d5780633875fb01146104485780634158506a1461046b57600080fd5b80631fca6408116102035780631fca64081461032a57806323b872dd1461033f5780632739327814610352578063276ee8761461037257806331b5fb2d1461039f57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da578063124d532e146102fc57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b5061026b6102663660046153d2565b61079e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107f0565b60405161027791906158d2565b3480156102ae57600080fd5b506102c26102bd36600461552d565b610882565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046152cd565b61091c565b005b34801561030857600080fd5b5061031c610317366004615148565b610a32565b604051908152602001610277565b34801561033657600080fd5b506102fa610ab9565b6102fa61034d366004615196565b610e3b565b34801561035e57600080fd5b506102fa61036d36600461552d565b610fff565b34801561037e57600080fd5b5061031c61038d366004615148565b60056020526000908152604090205481565b3480156103ab57600080fd5b506103bf6103ba36600461540c565b61166e565b60405161027792919061580a565b3480156103d957600080fd5b506103bf6103e836600461532b565b611957565b3480156103f957600080fd5b506102c261040836600461552d565b611a55565b34801561041957600080fd5b506002546003546001546040805160ff9094168452602084019290925290820152476060820152608001610277565b34801561045457600080fd5b5061045d611a7f565b6040516102779291906156ec565b34801561047757600080fd5b5060215461031c565b6102fa61048e366004615196565b611bbd565b34801561049f57600080fd5b5060235461031c565b6102fa6104b63660046152f7565b611bd8565b3480156104c757600080fd5b506102c26104d636600461552d565b611efd565b3480156104e757600080fd5b506104fb6104f6366004615546565b611f74565b6040516102779493929190615850565b34801561051757600080fd5b5061031c610526366004615148565b6125c9565b34801561053757600080fd5b506102c261054636600461552d565b612650565b34801561055757600080fd5b506102fa612660565b34801561056c57600080fd5b506102fa61057b36600461552d565b612ae7565b34801561058c57600080fd5b50610295612b46565b3480156105a157600080fd5b5060255461031c565b3480156105b657600080fd5b506102fa6105c5366004615291565b612b55565b3480156105d657600080fd5b506015546105e49060ff1681565b60405160ff9091168152602001610277565b6102fa6106043660046151d2565b612c1a565b34801561061557600080fd5b5061062961062436600461552d565b612de0565b60405161027793929190615825565b34801561064457600080fd5b5061045d61065336600461552d565b612fba565b34801561066457600080fd5b506103bf610673366004615546565b61312e565b34801561068457600080fd5b5061069861069336600461552d565b613384565b60405161027799989796959493929190615abf565b3480156106b957600080fd5b506102956106c836600461552d565b613681565b3480156106d957600080fd5b506102fa6106e83660046154a1565b613769565b3480156106f957600080fd5b506102fa610708366004615569565b613995565b6102fa613ae0565b34801561072157600080fd5b5061062961073036600461538e565b613ff4565b34801561074157600080fd5b5061026b610750366004615163565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b34801561078a57600080fd5b506102fa61079936600461532b565b614132565b60006001600160e01b031982166380ac58cd60e01b14806107cf57506001600160e01b03198216635b5e139f60e01b145b806107ea57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600b80546107ff90615ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90615ce6565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b5050505050905090565b6000818152600d60205260408120546001600160a01b03166109005760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600f60205260409020546001600160a01b031690565b600061092782611efd565b9050806001600160a01b0316836001600160a01b031614156109955760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108f7565b336001600160a01b03821614806109b157506109b18133610750565b610a235760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108f7565b610a2d8383614285565b505050565b60006001600160a01b038216610a9d5760405162461bcd60e51b815260206004820152602a60248201527f49544f4b454e3a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108f7565b506001600160a01b031660009081526008602052604090205490565b601554600a60ff90911610610b085760405162461bcd60e51b81526020600482015260156024820152744e6f207072697a657320666f7220686f646c65727360581b60448201526064016108f7565b6000546001600160a01b03163314610b625760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e206973206f6e6c7920666f72206f776e657200000000000060448201526064016108f7565b600454600090606411610b76576064610b7a565b6004545b90506000816001600160401b03811115610b9657610b96615e00565b604051908082528060200260200182016040528015610bbf578160200160208202803683370190505b50601554909150600090620186a09060169060ff16600a8110610be457610be4615dea565b0154600154610bf39190615c50565b610bfd9190615c3c565b905060008080805b868160ff161015610dc357600a91505b60048054610c55918991610c2b90600290615c3c565b81548110610c3b57610c3b615dea565b6000918252602090912001546001600160a01b03166142f3565b935060048481548110610c6a57610c6a615dea565b6000918252602090912001546015546001600160a01b039091169350610c949060ff166001615c17565b6001600160a01b038416600090815260208052604090205460ff9081169116148015610cce5750600182610cc781615cc9565b935060ff16115b610c1557601554610ce39060ff166001615c17565b6001600160a01b03841660009081526020805260409020805460ff191660ff929092169190911790556004805485908110610d2057610d20615dea565b9060005260206000200160009054906101000a90046001600160a01b0316868260ff1681518110610d5357610d53615dea565b6001600160a01b0392831660209182029290920101526040519084169086156108fc029087906000818181858888f19350505050158015610d98573d6000803e3d6000fd5b508460016000828254610dab9190615c6f565b90915550819050610dbb81615d5e565b915050610c05565b506015546040517fcf247b6ff63cebb133bd487e77ff23d65dd43f8c573189bf3c46c8fc747f15a891610dff9160ff9091169088908890615b51565b60405180910390a16015805460ff16906000610e1a83615d5e565b91906101000a81548160ff021916908360ff16021790555050505050505050565b610e45338261436e565b610e615760405162461bcd60e51b81526004016108f790615a10565b6025543414610e825760405162461bcd60e51b81526004016108f790615937565b60008181526007602052604090205415610eae5760405162461bcd60e51b81526004016108f790615994565b610eb9838383614465565b6040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508282600081518110610f1257610f12615dea565b602002602001018181525050600081600081518110610f3357610f33615dea565b6020026020010181815250507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b9828260255487604051610f769493929190615759565b60405180910390a16001600160a01b0384166000908152600e6020526040902054610fe657600480546001600160a01b038616600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b610fef33614605565b610ff83361488c565b5050505050565b60008060008061100f8533611f74565b9350935093509350831583906110385760405162461bcd60e51b81526004016108f791906158d2565b5080821161104757600061104a565b60015b6023868154811061105d5761105d615dea565b906000526020600020906007020160010160006101000a81548160ff021916908360ff160217905550808211156115f9576000602386815481106110a3576110a3615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156110d3576110d3615dbe565b141561113b576021602386815481106110ee576110ee615dea565b600091825260208083206001600790930201820154845492830185559383529091200180546001600160a01b0319166001600160a01b0362010000909304929092169190911790556115f9565b60016023868154811061115057611150615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561118057611180615dbe565b141561128b57600060016111ca602388815481106111a0576111a0615dea565b906000526020600020906007020160010160029054906101000a90046001600160a01b0316614a1e565b6111d49190615c6f565b60218054919250906111e890600190615c6f565b815481106111f8576111f8615dea565b600091825260209091200154602180546001600160a01b03909216918390811061122457611224615dea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550602180548061126357611263615dd4565b600082815260209020810160001990810180546001600160a01b0319169055019055506115f9565b6002602386815481106112a0576112a0615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156112d0576112d0615dbe565b14156113e55760005b80602387815481106112ed576112ed615dea565b90600052602060002090600702016003018054905011156113df576023868154811061131b5761131b615dea565b9060005260206000209060070201600201818154811061133d5761133d615dea565b90600052602060002090602091828204019190069054906101000a900460ff16602260006023898154811061137457611374615dea565b9060005260206000209060070201600301848154811061139657611396615dea565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191660ff92909216919091179055806113d781615d43565b9150506112d9565b506115f9565b6003602386815481106113fa576113fa615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561142a5761142a615dbe565b14156115f95760006023868154811061144557611445615dea565b60009182526020822060046007909202010154915081905b6021548110156115f55760215461147690600190615c6f565b81101561158e576021818154811061149057611490615dea565b6000918252602082200154602180546001600160a01b03909216926108fc9260229290869081106114c3576114c3615dea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff166114f6606487615c3c565b6115009190615c50565b6040518115909202916000818181858888f19350505050158015611528573d6000803e3d6000fd5b50602260006021838154811061154057611540615dea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611573606485615c3c565b61157d9190615c50565b6115879083615c6f565b91506115e3565b602181815481106115a1576115a1615dea565b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f193505050501580156115e1573d6000803e3d6000fd5b505b806115ed81615d43565b91505061145d565b5050505b7fb94cf879824333a2486c43eeccd7c16331e33fe78334ae370d0013f74adbbb756023868154811061162d5761162d615dea565b906000526020600020906007020160010160019054906101000a900460ff168284118760405161165f9392919061587e565b60405180910390a15050505050565b6000606061167b83614a1e565b6116ba57505060408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019061194d565b60028760038111156116ce576116ce615dbe565b101561181a5760006116df87614a1e565b905060008860038111156116f5576116f5615dbe565b14801561170157508015155b1561174557505060408051808201909152601e81527f54686973207061727469636970616e7420616c7265616479206578697374000060208201526001915061194d565b600188600381111561175957611759615dbe565b1415611818576001600160a01b03871660009081526022602052604090205460ff16156117a5576001604051806060016040528060308152602001615eed60309139925092505061194d565b806117e957505060408051808201909152601f81527f54686973206973206e6f74207061727469636970616e7420616464726573730060208201526001915061194d565b602154600210611818576001604051806060016040528060228152602001615f4560229139925092505061194d565b505b600287600381111561182e5761182e615dbe565b141561192e576021548551146118745750506040805180820190915260158152740aee4dedcce40e0cae4c6cadce8e640d8cadccee8d605b1b602082015260019061194d565b6021548451146118b55750506040805180820190915260168152750aee4dedcce40c2c8c8e4cae6e6cae640d8cadccee8d60531b602082015260019061194d565b6000805b80875111156118fb578681815181106118d4576118d4615dea565b6020026020010151826118e79190615c17565b9150806118f381615d43565b9150506118b9565b508060ff1660641461192c576001604051806060016040528060268152602001615ec760269139925092505061194d565b505b50506040805180820190915260028152616f6b60f01b60208201526000905b9550959350505050565b6000606082518451146119a257505060408051808201909152601781527f4e6f742073616d652073697a65206f66206172726179730000000000000000006020820152600190611a4e565b60005b8451811015611a2e57336001600160a01b0316600d60008784815181106119ce576119ce615dea565b6020908102919091018101518252810191909152604001600020546001600160a01b031614611a1c576001604051806060016040528060248152602001615e2d602491399250925050611a4e565b80611a2681615d43565b9150506119a5565b50506040805180820190915260028152616f6b60f01b6020820152600091505b9250929050565b60218181548110611a6557600080fd5b6000918252602090912001546001600160a01b0316905081565b60608060006021805490506001600160401b03811115611aa157611aa1615e00565b604051908082528060200260200182016040528015611aca578160200160208202803683370190505b50905060005b602154811015611b54576022600060218381548110611af157611af1615dea565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825160ff90911690839083908110611b3057611b30615dea565b60ff9092166020928302919091019091015280611b4c81615d43565b915050611ad0565b5060218181805480602002602001604051908101604052809291908181526020018280548015611bad57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b8f575b5050505050915092509250509091565b610a2d83838360405180602001604052806000815250612c1a565b600080611be58334613ff4565b92505091508115611c7b5760405162461bcd60e51b815260206004820152605460248201527f4572726f722c20757365206d6574686f64206265666f72654275794f6666657260448201527f6564546f6b656e732875696e743235365b5d206d656d6f727920746f6b656e4960648201527364732c2075696e742073656e64696e674554482960601b608482015260a4016108f7565b336000908152600e6020526040902054611cd1576004805433600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b600083516001600160401b03811115611cec57611cec615e00565b604051908082528060200260200182016040528015611d15578160200160208202803683370190505b50905060005b8451811015611e8c576000600d6000878481518110611d3c57611d3c615dea565b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03169050806001600160a01b03166108fc60076000898681518110611d8b57611d8b615dea565b60200260200101518152602001908152602001600020549081150290604051600060405180830381858888f19350505050158015611dcd573d6000803e3d6000fd5b50611df28133888581518110611de557611de5615dea565b6020026020010151614465565b611dfb8161488c565b60076000878481518110611e1157611e11615dea565b6020026020010151815260200190815260200160002054838381518110611e3a57611e3a615dea565b602002602001018181525050600060076000888581518110611e5e57611e5e615dea565b6020026020010151815260200190815260200160002081905550508080611e8490615d43565b915050611d1b565b507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b984828433604051611ec29493929190615759565b60405180910390a160e1611ed7836064615c50565b611ee19190615c3c565b60016000828254611ef29190615bff565b909155505050505050565b6000818152600d60205260408120546001600160a01b0316806107ea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108f7565b600060606000806000611f8686614a1e565b905060008060005b8060238b81548110611fa257611fa2615dea565b90600052602060002090600702016005018054905011156120a45760238a81548110611fd057611fd0615dea565b90600052602060002090600702016006018181548110611ff257611ff2615dea565b90600052602060002090602091828204019190069054906101000a900460ff1660ff166001141561202b578261202781615d43565b9350505b60238a8154811061203e5761203e615dea565b9060005260206000209060070201600601818154811061206057612060615dea565b60009182526020918290209181049091015460ff601f9092166101000a900416612092578161208e81615d43565b9250505b8061209c81615d43565b915050611f8e565b50826120ed5760408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019750955090935091506125c09050565b600060238a8154811061210257612102615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561213257612132615dbe565b1480156121545750600061215260238b815481106111a0576111a0615dea565b115b1561219f5760408051808201909152601e81527f54686973207061727469636970616e7420616c72656164792065786973740000602082015260019750955090935091506125c09050565b600160238a815481106121b4576121b4615dea565b906000526020600020906007020160010160019054906101000a900460ff1660038111156121e4576121e4615dbe565b1480156121f357506021546002145b156122275760018282604051806060016040528060288152602001615f1d60289139919096509650965096505050506125c0565b600160238a8154811061223c5761223c615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561226c5761226c615dbe565b1480156122c6575060006022600060238c8154811061228d5761228d615dea565b60009182526020808320600792909202909101600101546201000090046001600160a01b0316835282019290925260400190205460ff16115b156122fa5760018282604051806060016040528060308152602001615eed60309139919096509650965096505050506125c0565b60235489106123495760408051808201909152601781527f50726f706f73616c20646f6573206e6f74206578697374000000000000000000602082015260019750955090935091506125c09050565b6023898154811061235c5761235c615dea565b600091825260209091206007909102016001015460ff166002146123b657604080518082019091526013815272159bdd1a5b99c81a185cc8199a5b9a5cda1959606a1b602082015260019750955090935091506125c09050565b602389815481106123c9576123c9615dea565b90600052602060002090600702016000015442111580156124145750602154602380548b9081106123fc576123fc615dea565b90600052602060002090600702016005018054905014155b1561245857604080518082019091526016815275159bdd1a5b99c81a5cc81b9bdd08199a5b9a5cda195960521b602082015260019750955090935091506125c09050565b600360238a8154811061246d5761246d615dea565b906000526020600020906007020160010160019054906101000a900460ff16600381111561249d5761249d615dbe565b1480156124cd5750602389815481106124b8576124b8615dea565b90600052602060002090600702016004015447105b1561250a5760408051808201909152600f81526e4c6f77204554482062616c616e636560881b602082015260019750955090935091506125c09050565b6023898154811061251d5761251d615dea565b600091825260209091206005600790920201015460215461253e9190615c6f565b60238a8154811061255157612551615dea565b9060005260206000209060070201600501805490501161259a5760018282604051806060016040528060318152602001615e9660319139919096509650965096505050506125c0565b6040805180820190915260028152616f6b60f01b60208201526000975095509093509150505b92959194509250565b60006001600160a01b0382166126345760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108f7565b506001600160a01b03166000908152600e602052604090205490565b60048181548110611a6557600080fd5b600254600a8054909160ff1690811061267b5761267b615dea565b9060005260206000209060070201600001546000146126f15760405162461bcd60e51b815260206004820152602c60248201527f4e6f7420616c6c20746f6b656e73207765726520736f6c6420696e207468652060448201526b61637475616c20706861736560a01b60648201526084016108f7565b600254600a805460009260ff1690811061270d5761270d615dea565b9060005260206000209060070201600101546001600160401b0381111561273657612736615e00565b60405190808252806020026020018201604052801561275f578160200160208202803683370190505b50600254600a8054929350600092909160ff1690811061278157612781615dea565b9060005260206000209060070201600101546001600160401b038111156127aa576127aa615e00565b6040519080825280602002602001820160405280156127d3578160200160208202803683370190505b50905060005b600254600a8054909160ff169081106127f4576127f4615dea565b9060005260206000209060070201600101548161ffff161015612a4c57600254600a80546128839260ff1690811061282e5761282e615dea565b6000918252602090912060046007909202010154600254600a8054909160ff1690811061285d5761285d615dea565b90600052602060002090600702016004018361ffff1681548110610c3b57610c3b615dea565b838261ffff168151811061289957612899615dea565b6020908102919091010152600254600a8054909160ff169081106128bf576128bf615dea565b9060005260206000209060070201600401838261ffff16815181106128e6576128e6615dea565b6020026020010151815481106128fe576128fe615dea565b9060005260206000200160009054906101000a90046001600160a01b0316828261ffff168151811061293257612932615dea565b6001600160a01b0390921660209283029190910190910152600254600a8054909160ff1690811061296557612965615dea565b9060005260206000209060070201600501838261ffff168151811061298c5761298c615dea565b602090810291909101810151825460018101845560009384529190922001558151829061ffff83169081106129c3576129c3615dea565b60200260200101516001600160a01b03166108fc600a600260009054906101000a900460ff1660ff16815481106129fc576129fc615dea565b9060005260206000209060070201600301549081150290604051600060405180830381858888f19350505050158015612a39573d6000803e3d6000fd5b5080612a4481615d21565b9150506127d9565b50600254600a80547fe4b8f6054f46c8448ffef3fc98fe56acc937804bf21e8d59bb721d668a87f87c9260ff1691849183908110612a8c57612a8c615dea565b90600052602060002090600702016003015485604051612aaf9493929190615b6d565b60405180910390a16002805460ff16906000612aca83615d5e565b91906101000a81548160ff021916908360ff160217905550505050565b6000546001600160a01b03163314612b415760405162461bcd60e51b815260206004820152601a60248201527f46756e6374696f6e206973206f6e6c7920666f72206f776e657200000000000060448201526064016108f7565b602555565b6060600c80546107ff90615ce6565b6001600160a01b038216331415612bae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108f7565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612c24338361436e565b612c405760405162461bcd60e51b81526004016108f790615a10565b6025543414612c615760405162461bcd60e51b81526004016108f790615937565b60008281526007602052604090205415612c8d5760405162461bcd60e51b81526004016108f790615994565b612c9984848484614a8a565b6040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508382600081518110612cf257612cf2615dea565b602002602001018181525050600081600081518110612d1357612d13615dea565b6020026020010181815250507fc7d447b71b4ced98028fea93fe1803823e41fd66387f9cf0f2d1ad63ab90f5b9828260255488604051612d569493929190615759565b60405180910390a16001600160a01b0385166000908152600e6020526040902054612dc657600480546001600160a01b038716600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b612dcf33614605565b612dd83361488c565b505050505050565b600254600a80546000926060928492839260ff16908110612e0357612e03615dea565b90600052602060002090600702016002015485612e209190615c3c565b600254600a8054929350600092909160ff16908110612e4157612e41615dea565b90600052602060002090600702016002015486612e5e9190615d7e565b905081612ea7575060408051808201909152601d81527f4e6f7420656e6f7567682077656920746f20627579206120746f6b656e00000060208201526001945092509050612fb3565b8015612eef575060408051808201909152601f81527f506c656173652073656e6420657861637420616d6f756e74206f66207765690060208201526001945092509050612fb3565b600254600a8054849260ff16908110612f0a57612f0a615dea565b9060005260206000209060070201600001541015612f4c57600182604051806060016040528060218152602001615e5160219139909450945094505050612fb3565b612aaf60035410612f905750604080518082019091526014815273105b1b081d1bdad95b9cc81c1d5c98da185cd95960621b60208201526001945092509050612fb3565b506040805180820190915260028152616f6b60f01b602082015260009450925090505b9193909250565b60608082602380549050116130115760405162461bcd60e51b815260206004820152601b60248201527f50726f706f73616c20617420696e646578206e6f74206578697374000000000060448201526064016108f7565b6023838154811061302457613024615dea565b90600052602060002090600702016005016023848154811061304857613048615dea565b9060005260206000209060070201600601818054806020026020016040519081016040528092919081815260200182805480156130ae57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613090575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561311e57602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116130ef5790505b5050505050905091509150915091565b60006060600061313d84614a1e565b90508061318057505060408051808201909152601a815279165bdd48185c99481b9bdd081a5b881c185c9d1a58da5c185b9d60321b602082015260019150611a4e565b60235485106131bd575050604080518082019091526012815271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b602082015260019150611a4e565b602385815481106131d0576131d0615dea565b600091825260209091206007909102016001015460ff16600214613221575050604080518082019091526011815270141c9bdc1bdcd85b08199a5b9a5cda1959607a1b602082015260019150611a4e565b6023858154811061323457613234615dea565b9060005260206000209060070201600001544210613284575050604080518082019091526016815275151a5b5948199bdc881d9bdd1a5b99c81a5cc81bdd5d60521b602082015260019150611a4e565b60005b806023878154811061329b5761329b615dea565b906000526020600020906007020160050180549050111561335d57846001600160a01b0316602387815481106132d3576132d3615dea565b906000526020600020906007020160050182815481106132f5576132f5615dea565b6000918252602090912001546001600160a01b0316141561334b57600160405180604001604052806015815260200174165bdd48185c9948185b1c9958591e481d9bdd1959605a1b815250935093505050611a4e565b8061335581615d43565b915050613287565b50506040805180820190915260028152616f6b60f01b602082015260009590945092505050565b600080600080606080600060608089602380549050116133e65760405162461bcd60e51b815260206004820152601b60248201527f50726f706f73616c20617420696e646578206e6f74206578697374000000000060448201526064016108f7565b600060238b815481106133fb576133fb615dea565b60009182526020918290206040805161012081018252600790930290910180548352600181015460ff808216958501959095529293909291840191610100900416600381111561344d5761344d615dbe565b600381111561345e5761345e615dbe565b815260018201546201000090046001600160a01b031660208083019190915260028301805460408051828502810185018252828152940193928301828280156134e457602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116134b55790505b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561354657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613528575b5050505050815260200160048201548152602001600582018054806020026020016040519081016040528092919081815260200182805480156135b257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613594575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561362857602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116135f95790505b5050505050815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b6000818152600d60205260409020546060906001600160a01b03166137005760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108f7565b600061371760408051602081019091526000815290565b905060008151116137375760405180602001604052806000815250613762565b8061374184614ac3565b604051602001613752929190615681565b6040516020818303038152906040525b9392505050565b600080613779878787873361166e565b915091508115819061379e5760405162461bcd60e51b81526004016108f791906158d2565b5060006137ae426203f480615bff565b90506060806023604051806101200160405280858152602001600260ff1681526020018c60038111156137e3576137e3615dbe565b81526001600160a01b038c1660208083019190915260408083018d9052606083018c9052608083018b905260a0830187905260c0909201859052835460018181018655600095865294829020845160079092020190815590830151938101805460ff90951660ff19861681178255928401519394919392909161ffff19161761010083600381111561387757613877615dbe565b021790555060608201516001820180546001600160a01b03909216620100000275ffffffffffffffffffffffffffffffffffffffff000019909216919091179055608082015180516138d3916002840191602090910190614ea2565b5060a082015180516138ef916003840191602090910190614f48565b5060c0820151600482015560e08201518051613915916005840191602090910190614f48565b506101008201518051613932916006840191602090910190614ea2565b5050507f534f1d8d2c3b462b484917bfaed9564a69bfc7f31710cd9f5071d8881d5c78d0838b8b8b8b8b600160238054905061396e9190615c6f565b6040516139819796959493929190615a61565b60405180910390a150505050505050505050565b6000806139a2843361312e565b91509150811581906139c75760405162461bcd60e51b81526004016108f791906158d2565b50602384815481106139db576139db615dea565b60009182526020808320600560079093020191909101805460018101825590835291200180546001600160a01b031916331790556023805485908110613a2357613a23615dea565b6000918252602080832060066007909302019190910180546001810182559083529181902090820401805460ff808716601f9094166101000a93840293021916919091179055602380547f7546dd2efc4351c25332cd15fddaed6a7e1b7721e7c183dc54c9b037d1b0faf9919086908110613aa057613aa0615dea565b906000526020600020906007020160010160019054906101000a900460ff16853386604051613ad2949392919061589d565b60405180910390a150505050565b600080613aec34612de0565b92505091508115613b595760405162461bcd60e51b815260206004820152603160248201527f4572726f722c20757365206d6574686f64206265666f7265427579546f6b656e604482015270732875696e7420776569416d6f756e742960781b60648201526084016108f7565b600354336000908152600e6020526040812054613bb2576004805433600081815260056020526040812083905560018301845592909252600080516020615f928339815191520180546001600160a01b03191690911790555b60005b83811015613e5b57613bd43382600354613bcf9190615bff565b614bc0565b600254600a805466470de4df8200009260ff16908110613bf657613bf6615dea565b906000526020600020906007020160060154600154613c159190615bff565b613c1f9190615c6f565b600155600254600a8054909160ff16908110613c3d57613c3d615dea565b60009182526020808320600460079093020191909101805460018101825590835291200180546001600160a01b03191633908117909155613c7d90614605565b60025460009060149060ff1660138110613c9957613c99615dea565b602081049091015460ff601f9092166101000a9004161115613e0d5760025460009060149060ff1660138110613cd157613cd1615dea565b6020810490910154600254600a805460ff601f9095166101000a90930484169390929116908110613d0457613d04615dea565b9060005260206000209060070201600001541115613d3857600254600354613d3391339160ff90911690614bda565b613d3b565b60015b90508060ff1660011415613e0b5760025460149060ff1660138110613d6257613d62615dea565b6020918282040191900681819054906101000a900460ff1680929190613d8790615cc9565b91906101000a81548160ff021916908360ff16021790555050600682600354613db09190615bff565b8154600181018355600092835260209092209091015560028054600a8054909160ff16908110613de257613de2615dea565b906000526020600020906007020160020154613dfe9190615c3c565b613e089084615bff565b92505b505b600254600a8054909160ff16908110613e2857613e28615dea565b600091825260208220600790910201805491613e4383615cb2565b91905055508080613e5390615d43565b915050613bb5565b508015613ee057604051339082156108fc029083906000818181858888f19350505050158015613e8f573d6000803e3d6000fd5b506002546040517f316d5a922909f37668417ae03463664989482813f3b95858ae640c7ca63d4e6791613ecc916006918591339160ff169061579f565b60405180910390a1613ee060066000614f9d565b8260036000828254613ef29190615bff565b90915550503360009081526008602052604081208054859290613f16908490615bff565b9091555050600254600a805460ff9092169182908110613f3857613f38615dea565b90600052602060002090600702016000015460001415613f5a57613f5a612660565b600254600a80547f4d22b4faa55c2fc8e1b466707df1233bd3f7909d91e69e09147c222e5e53b35492849260ff909116918791899133919085908110613fa257613fa2615dea565b6000918252602091829020600260079092020101546040805160ff988916815297909616918701919091529385019290925260608401526001600160a01b0316608083015260a082015260c00161165f565b60006060818080805b87518110156140b2576007600089838151811061401c5761401c615dea565b602002602001015181526020019081526020016000205460001415614066576001826040518060600160405280602b8152602001615f67602b91399095509550955050505061412b565b6007600089838151811061407c5761407c615dea565b60200260200101518152602001908152602001600020548361409e9190615bff565b9250806140aa81615d43565b915050613ffd565b506140be82602d615c50565b90506140cc6103e882615c3c565b90506140d88183615bff565b861461410857600181604051806060016040528060248152602001615e726024913990945094509450505061412b565b6040805180820190915260028152616f6b60f01b60208201526000955093509150505b9250925092565b600061413e8383611957565b50905080156141db5760405162461bcd60e51b815260206004820152605960248201527f4572726f722c20757365206d6574686f64206265666f726553657453656c6c6960448201527f6e675072696365732875696e743235365b5d206d656d6f727920746f6b656e4960648201527f64732c2075696e745b5d206d656d6f7279207072696365732900000000000000608482015260a4016108f7565b60005b8351811015614244578281815181106141f9576141f9615dea565b60200260200101516007600086848151811061421757614217615dea565b6020026020010151815260200190815260200160002081905550808061423c90615d43565b9150506141de565b507f2fd3c0dd04a6e30e43089f7b3b553f81e5b06ee918fdcd343dec51463b13b3a38383336040516142789392919061571a565b60405180910390a1505050565b6000818152600f6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906142ba82611efd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600980546000918261430483615d43565b91905055508244428460095460405160200161434b9493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b6040516020818303038152906040528051906020012060001c6137629190615d7e565b6000818152600d60205260408120546001600160a01b03166143e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108f7565b60006143f283611efd565b9050806001600160a01b0316846001600160a01b0316148061442d5750836001600160a01b031661442284610882565b6001600160a01b0316145b8061445d57506001600160a01b0380821660009081526010602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661447882611efd565b6001600160a01b0316146144e05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108f7565b6001600160a01b0382166145425760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108f7565b61454d600082614285565b6001600160a01b0383166000908152600e60205260408120805460019290614576908490615c6f565b90915550506001600160a01b0382166000908152600e602052604081208054600192906145a4908490615bff565b90915550506000818152600d602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000614610826125c9565b9050600b60115410801561465657506012601154600c811061463457614634615dea565b601091828204019190066002029054906101000a900461ffff1661ffff168110155b1561478e5760006103e86013601154600b811061467557614675615dea565b601091828204019190066002029054906101000a900461ffff1661ffff166001546146a09190615c50565b6146aa9190615c3c565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156146e3573d6000803e3d6000fd5b5080600160008282546146f69190615c6f565b925050819055507f14912e9ca162a9b9427e329877fdbc973d680907a773e517f38924661f2779d66012601154600c811061473357614733615dea565b60108104919091015460408051600f9093166002026101000a90910461ffff1682526001600160a01b0386166020830152810183905260600160405180910390a16011805490600061478483615d43565b9190505550505050565b601154600b1480156147d257506012601154600c81106147b0576147b0615dea565b601091828204019190066002029054906101000a900461ffff1661ffff168110155b15614888576001546040516001600160a01b0384169180156108fc02916000818181858888f1935050505015801561480e573d6000803e3d6000fd5b5060015460408051612aaf81526001600160a01b038516602082015280820192909252517f14912e9ca162a9b9427e329877fdbc973d680907a773e517f38924661f2779d69181900360600190a16001805490600061486d8380615c6f565b90915550506011805490600061488283615d43565b91905055505b5050565b6001600160a01b0381166000908152600e6020526040902054614a1b576001600160a01b038116600090815260056020526040902054600454158015906149025750816001600160a01b0316600482815481106148eb576148eb615dea565b6000918252602090912001546001600160a01b0316145b156148885760045461491690600190615c6f565b8110156149e6576004805461492d90600190615c6f565b8154811061493d5761493d615dea565b600091825260209091200154600480546001600160a01b03909216918390811061496957614969615dea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060056000600460016004805490506149b09190615c6f565b815481106149c0576149c0615dea565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b60048054806149f7576149f7615dd4565b600082815260209020810160001990810180546001600160a01b0319169055019055505b50565b6000805b602154811015614a8157826001600160a01b031660218281548110614a4957614a49615dea565b6000918252602090912001546001600160a01b03161415614a6f57613762816001615bff565b80614a7981615d43565b915050614a22565b50600092915050565b614a95848484614465565b614aa184848484614c4b565b614abd5760405162461bcd60e51b81526004016108f7906158e5565b50505050565b606081614ae75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614b115780614afb81615d43565b9150614b0a9050600a83615c3c565b9150614aeb565b6000816001600160401b03811115614b2b57614b2b615e00565b6040519080825280601f01601f191660200182016040528015614b55576020820181803683370190505b5090505b841561445d57614b6a600183615c6f565b9150614b77600a86615d7e565b614b82906030615bff565b60f81b818381518110614b9757614b97615dea565b60200101906001600160f81b031916908160001a905350614bb9600a86615c3c565b9450614b59565b614888828260405180602001604052806000815250614d58565b604080514460208201524291810191909152606084811b6bffffffffffffffffffffffff19169082015260f883901b6001600160f81b0319166074820152607581018290526000906002906095016040516020818303038152906040528051906020012060001c61445d9190615d7e565b60006001600160a01b0384163b15614d4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614c8f9033908990889088906004016156b0565b602060405180830381600087803b158015614ca957600080fd5b505af1925050508015614cd9575060408051601f3d908101601f19168201909252614cd6918101906153ef565b60015b614d33573d808015614d07576040519150601f19603f3d011682016040523d82523d6000602084013e614d0c565b606091505b508051614d2b5760405162461bcd60e51b81526004016108f7906158e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061445d565b506001949350505050565b614d628383614d8b565b614d6f6000848484614c4b565b610a2d5760405162461bcd60e51b81526004016108f7906158e5565b6001600160a01b038216614de15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108f7565b6000818152600d60205260409020546001600160a01b031615614e465760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108f7565b6001600160a01b0382166000908152600e60205260408120805460019290614e6f908490615bff565b90915550506000908152600d6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b82805482825590600052602060002090601f01602090048101928215614f385791602002820160005b83821115614f0957835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302614ecb565b8015614f365782816101000a81549060ff0219169055600101602081600001049283019260010302614f09565b505b50614f44929150614fb7565b5090565b828054828255906000526020600020908101928215614f38579160200282015b82811115614f3857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614f68565b5080546000825590600052602060002090810190614a1b91905b5b80821115614f445760008155600101614fb8565b80356001600160a01b0381168114614fe357600080fd5b919050565b600082601f830112614ff957600080fd5b8135602061500e61500983615bdc565b615bac565b80838252828201915082860187848660051b890101111561502e57600080fd5b60005b858110156150545761504282614fcc565b84529284019290840190600101615031565b5090979650505050505050565b600082601f83011261507257600080fd5b8135602061508261500983615bdc565b80838252828201915082860187848660051b89010111156150a257600080fd5b60005b85811015615054578135845292840192908401906001016150a5565b600082601f8301126150d257600080fd5b813560206150e261500983615bdc565b80838252828201915082860187848660051b890101111561510257600080fd5b60005b858110156150545761511682615137565b84529284019290840190600101615105565b803560048110614fe357600080fd5b803560ff81168114614fe357600080fd5b60006020828403121561515a57600080fd5b61376282614fcc565b6000806040838503121561517657600080fd5b61517f83614fcc565b915061518d60208401614fcc565b90509250929050565b6000806000606084860312156151ab57600080fd5b6151b484614fcc565b92506151c260208501614fcc565b9150604084013590509250925092565b600080600080608085870312156151e857600080fd5b6151f185614fcc565b93506020615200818701614fcc565b93506040860135925060608601356001600160401b038082111561522357600080fd5b818801915088601f83011261523757600080fd5b81358181111561524957615249615e00565b61525b601f8201601f19168501615bac565b9150808252898482850101111561527157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156152a457600080fd5b6152ad83614fcc565b9150602083013580151581146152c257600080fd5b809150509250929050565b600080604083850312156152e057600080fd5b6152e983614fcc565b946020939093013593505050565b60006020828403121561530957600080fd5b81356001600160401b0381111561531f57600080fd5b61445d84828501615061565b6000806040838503121561533e57600080fd5b82356001600160401b038082111561535557600080fd5b61536186838701615061565b9350602085013591508082111561537757600080fd5b5061538485828601615061565b9150509250929050565b600080604083850312156153a157600080fd5b82356001600160401b038111156153b757600080fd5b6153c385828601615061565b95602094909401359450505050565b6000602082840312156153e457600080fd5b813561376281615e16565b60006020828403121561540157600080fd5b815161376281615e16565b600080600080600060a0868803121561542457600080fd5b61542d86615128565b945061543b60208701614fcc565b935060408601356001600160401b038082111561545757600080fd5b61546389838a016150c1565b9450606088013591508082111561547957600080fd5b5061548688828901614fe8565b92505061549560808701614fcc565b90509295509295909350565b600080600080600060a086880312156154b957600080fd5b6154c286615128565b94506154d060208701614fcc565b935060408601356001600160401b03808211156154ec57600080fd5b6154f889838a016150c1565b9450606088013591508082111561550e57600080fd5b5061551b88828901614fe8565b95989497509295608001359392505050565b60006020828403121561553f57600080fd5b5035919050565b6000806040838503121561555957600080fd5b8235915061518d60208401614fcc565b6000806040838503121561557c57600080fd5b8235915061518d60208401615137565b600081518084526020808501945080840160005b838110156155c55781516001600160a01b0316875295820195908201906001016155a0565b509495945050505050565b600081518084526020808501945080840160005b838110156155c5578151875295820195908201906001016155e4565b600081518084526020808501945080840160005b838110156155c557815160ff1687529582019590820190600101615614565b6000815180845261564b816020860160208601615c86565b601f01601f19169290920160200192915050565b6004811061567d57634e487b7160e01b600052602160045260246000fd5b9052565b60008351615693818460208801615c86565b8351908301906156a7818360208801615c86565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526156e26080830184615633565b9695505050505050565b6040815260006156ff604083018561558c565b82810360208401526157118185615600565b95945050505050565b60608152600061572d60608301866155d0565b828103602084015261573f81866155d0565b9150506001600160a01b0383166040830152949350505050565b60808152600061576c60808301876155d0565b828103602084015261577e81876155d0565b9150508360408301526001600160a01b038316606083015295945050505050565b6000608082016080835280875480835260a08501915088600052602092508260002060005b828110156157e0578154845292840192600191820191016157c4565b50505090830195909552506001600160a01b0392909216604083015260ff16606090910152919050565b821515815260406020820152600061445d6040830184615633565b83151581526060602082015260006158406060830185615633565b9050826040830152949350505050565b841515815260806020820152600061586b6080830186615633565b6040830194909452506060015292915050565b6060810161588c828661565f565b921515602082015260400152919050565b608081016158ab828761565f565b8460208301526001600160a01b038416604083015260ff8316606083015295945050505050565b6020815260006137626020830184615633565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252603f908201527f4152543a206e6f74207061796564207472616e73666572206665652e20506c6560408201527f61736520757365206d6574686f64206765745472616e73666572466565282900606082015260800190565b60208082526056908201527f4152543a20746f6b656e2069732073657420746f2073656c6c2e20506c65617360408201527f6520757365206d6574686f642073657453656c6c696e6750726963657328292060608201527530b7321039b2ba10383934b1b2903a37903d32b9379760511b608082015260a00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b878152615a71602082018861565f565b6001600160a01b038616604082015260e060608201526000615a9660e0830187615600565b8281036080840152615aa8818761558c565b60a0840195909552505060c0015295945050505050565b60006101208b835260ff8b166020840152615add604084018b61565f565b6001600160a01b0389166060840152806080840152615afe81840189615600565b905082810360a0840152615b12818861558c565b90508560c084015282810360e0840152615b2c818661558c565b9050828103610100840152615b418185615600565b9c9b505050505050505050505050565b60ff84168152606060208201526000615840606083018561558c565b60ff85168152608060208201526000615b89608083018661558c565b8460408401528281036060840152615ba181856155d0565b979650505050505050565b604051601f8201601f191681016001600160401b0381118282101715615bd457615bd4615e00565b604052919050565b60006001600160401b03821115615bf557615bf5615e00565b5060051b60200190565b60008219821115615c1257615c12615d92565b500190565b600060ff821660ff84168060ff03821115615c3457615c34615d92565b019392505050565b600082615c4b57615c4b615da8565b500490565b6000816000190483118215151615615c6a57615c6a615d92565b500290565b600082821015615c8157615c81615d92565b500390565b60005b83811015615ca1578181015183820152602001615c89565b83811115614abd5750506000910152565b600081615cc157615cc1615d92565b506000190190565b600060ff821680615cdc57615cdc615d92565b6000190192915050565b600181811c90821680615cfa57607f821691505b60208210811415615d1b57634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415615d3957615d39615d92565b6001019392505050565b6000600019821415615d5757615d57615d92565b5060010190565b600060ff821660ff811415615d7557615d75615d92565b60010192915050565b600082615d8d57615d8d615da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114614a1b57600080fdfe596f7520617265206e6f74206f776e6572206f662073656c656374656420746f6b656e734e6f7420656e6f75676820746f6b656e7320696e2061637475616c207068617365596f75206172652073656e64696e672077726f6e6720616d6f756e74206f66204554482e436f756e74206f6620766f746564207061727469636970616e7473206d757374206265206d6f7265207468616e203530255468652073756d206f66207468652070657263656e7461676573206d75737420626520313030546865207061727469636970616e7420746f2064656c657465206d7573742068617665207a65726f2070657263656e744d696e696d616c20636f756e74206f6620766f746564207061727469636970616e747320697320324d696e696d616c20636f756e74206f66207061727469636970616e747320697320324f6e65206f66207468652073656c656374656420746f6b656e73206973206e6f7420666f722073616c652e8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19ba26469706673582212203bd8912cc7d192ab7ee7110988a1dbb2581040ba94a2db423281cd2e6505f45f64736f6c63430008070033

Deployed Bytecode Sourcemap

52008:6113:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17836:305;;;;;;;;;;-1:-1:-1;17836:305:0;;;;;:::i;:::-;;:::i;:::-;;;16088:14:1;;16081:22;16063:41;;16051:2;16036:18;17836:305:0;;;;;;;;18781:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20340:221::-;;;;;;;;;;-1:-1:-1;20340:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12689:55:1;;;12671:74;;12659:2;12644:18;20340:221:0;12525:226:1;19863:411:0;;;;;;;;;;-1:-1:-1;19863:411:0;;;;;:::i;:::-;;:::i;:::-;;33871:233;;;;;;;;;;-1:-1:-1;33871:233:0;;;;;:::i;:::-;;:::i;:::-;;;29099:25:1;;;29087:2;29072:18;33871:233:0;28953:177:1;36536:1127:0;;;;;;;;;;;;;:::i;52772:1010::-;;;;;;:::i;:::-;;:::i;48372:2040::-;;;;;;;;;;-1:-1:-1;48372:2040:0;;;;;:::i;:::-;;:::i;30306:44::-;;;;;;;;;;-1:-1:-1;30306:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;42389:1584;;;;;;;;;;-1:-1:-1;42389:1584:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;54806:497::-;;;;;;;;;;-1:-1:-1;54806:497:0;;;;;:::i;:::-;;:::i;41885:29::-;;;;;;;;;;-1:-1:-1;41885:29:0;;;;;:::i;:::-;;:::i;33652:207::-;;;;;;;;;;-1:-1:-1;33781:11:0;;33794:17;;33781:11;33813:14;33652:207;;;33781:11;;;;30272:25:1;;30328:2;30313:18;;30306:34;;;;30356:18;;;30349:34;33829:21:0;30414:2:1;30399:18;;30392:34;30259:3;30244:19;33652:207:0;30041:391:1;51405:350:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;51290:103::-;;;;;;;;;;-1:-1:-1;51366:12:0;:19;51290:103;;21647:192;;;;;;:::i;:::-;;:::i;51185:97::-;;;;;;;;;;-1:-1:-1;51258:9:0;:16;51185:97;;56515:1043;;;;;;:::i;:::-;;:::i;18475:239::-;;;;;;;;;;-1:-1:-1;18475:239:0;;;;;:::i;:::-;;:::i;46014:2346::-;;;;;;;;;;-1:-1:-1;46014:2346:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;18205:208::-;;;;;;;;;;-1:-1:-1;18205:208:0;;;;;:::i;:::-;;:::i;30275:24::-;;;;;;;;;;-1:-1:-1;30275:24:0;;;;;:::i;:::-;;:::i;34232:828::-;;;;;;;;;;;;;:::i;52508:146::-;;;;;;;;;;-1:-1:-1;52508:146:0;;;;;:::i;:::-;;:::i;18950:104::-;;;;;;;;;;;;;:::i;52666:94::-;;;;;;;;;;-1:-1:-1;52741:11:0;;52666:94;;20633:295;;;;;;;;;;-1:-1:-1;20633:295:0;;;;;:::i;:::-;;:::i;35597:39::-;;;;;;;;;;-1:-1:-1;35597:39:0;;;;;;;;;;;31946:4:1;31934:17;;;31916:36;;31904:2;31889:18;35597:39:0;31774:184:1;53794:1000:0;;;;;;:::i;:::-;;:::i;38037:668::-;;;;;;;;;;-1:-1:-1;38037:668:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;50420:244::-;;;;;;;;;;-1:-1:-1;50420:244:0;;;;;:::i;:::-;;:::i;44742:852::-;;;;;;;;;;-1:-1:-1;44742:852:0;;;;;:::i;:::-;;:::i;50676:501::-;;;;;;;;;;-1:-1:-1;50676:501:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;19125:334::-;;;;;;;;;;-1:-1:-1;19125:334:0;;;;;:::i;:::-;;:::i;43985:745::-;;;;;;;;;;-1:-1:-1;43985:745:0;;;;;:::i;:::-;;:::i;45602:404::-;;;;;;;;;;-1:-1:-1;45602:404:0;;;;;:::i;:::-;;:::i;38729:1848::-;;;:::i;55802:701::-;;;;;;;;;;-1:-1:-1;55802:701:0;;;;;:::i;:::-;;:::i;20999:164::-;;;;;;;;;;-1:-1:-1;20999:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;21120:25:0;;;21096:4;21120:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20999:164;55315:475;;;;;;;;;;-1:-1:-1;55315:475:0;;;;;:::i;:::-;;:::i;17836:305::-;17938:4;-1:-1:-1;;;;;;17975:40:0;;-1:-1:-1;;;17975:40:0;;:105;;-1:-1:-1;;;;;;;18032:48:0;;-1:-1:-1;;;18032:48:0;17975:105;:158;;;-1:-1:-1;;;;;;;;;;16804:40:0;;;18097:36;17955:178;17836:305;-1:-1:-1;;17836:305:0:o;18781:100::-;18835:13;18868:5;18861:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18781:100;:::o;20340:221::-;20416:7;23844:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23844:16:0;20436:73;;;;-1:-1:-1;;;20436:73:0;;24666:2:1;20436:73:0;;;24648:21:1;24705:2;24685:18;;;24678:30;24744:34;24724:18;;;24717:62;-1:-1:-1;;;24795:18:1;;;24788:42;24847:19;;20436:73:0;;;;;;;;;-1:-1:-1;20529:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;20529:24:0;;20340:221::o;19863:411::-;19944:13;19960:23;19975:7;19960:14;:23::i;:::-;19944:39;;20008:5;-1:-1:-1;;;;;20002:11:0;:2;-1:-1:-1;;;;;20002:11:0;;;19994:57;;;;-1:-1:-1;;;19994:57:0;;26821:2:1;19994:57:0;;;26803:21:1;26860:2;26840:18;;;26833:30;26899:34;26879:18;;;26872:62;-1:-1:-1;;;26950:18:1;;;26943:31;26991:19;;19994:57:0;26619:397:1;19994:57:0;14503:10;-1:-1:-1;;;;;20086:21:0;;;;:62;;-1:-1:-1;20111:37:0;20128:5;14503:10;20999:164;:::i;20111:37::-;20064:168;;;;-1:-1:-1;;;20064:168:0;;22566:2:1;20064:168:0;;;22548:21:1;22605:2;22585:18;;;22578:30;22644:34;22624:18;;;22617:62;22715:26;22695:18;;;22688:54;22759:19;;20064:168:0;22364:420:1;20064:168:0;20245:21;20254:2;20258:7;20245:8;:21::i;:::-;19933:341;19863:411;;:::o;33871:233::-;33947:12;-1:-1:-1;;;;;33979:26:0;;33971:81;;;;-1:-1:-1;;;33971:81:0;;27223:2:1;33971:81:0;;;27205:21:1;27262:2;27242:18;;;27235:30;27301:34;27281:18;;;27274:62;-1:-1:-1;;;27352:18:1;;;27345:40;27402:19;;33971:81:0;27021:406:1;33971:81:0;-1:-1:-1;;;;;;34070:26:0;;;;;:12;:26;;;;;;;33871:233::o;36536:1127::-;36585:22;;36610:20;36585:22;;;;:45;36577:79;;;;-1:-1:-1;;;36577:79:0;;20117:2:1;36577:79:0;;;20099:21:1;20156:2;20136:18;;;20129:30;-1:-1:-1;;;20175:18:1;;;20168:51;20236:18;;36577:79:0;19915:345:1;36577:79:0;36675:5;;-1:-1:-1;;;;;36675:5:0;36684:10;36675:19;36667:58;;;;-1:-1:-1;;;36667:58:0;;28052:2:1;36667:58:0;;;28034:21:1;28091:2;28071:18;;;28064:30;28130:28;28110:18;;;28103:56;28176:18;;36667:58:0;27850:350:1;36667:58:0;36758:7;:14;36736:19;;36775:3;-1:-1:-1;36758:43:0;;36798:3;36758:43;;;36781:7;:14;36758:43;36736:65;;36812:24;36853:14;-1:-1:-1;;;;;36839:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36839:29:0;-1:-1:-1;36923:22:0;;36812:56;;-1:-1:-1;36879:10:0;;36949:6;;36909:13;;36923:22;;36909:37;;;;;;;:::i;:::-;;;36892:14;;:54;;;;:::i;:::-;:63;;;;:::i;:::-;36879:76;-1:-1:-1;36966:10:0;;;;37049:496;37070:14;37066:1;:18;;;37049:496;;;37118:2;37105:15;;37135:215;37189:7;37197:14;;37165:51;;37173:14;;37197:16;;37212:1;;37197:16;:::i;:::-;37189:25;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;37189:25:0;37165:6;:51::i;:::-;37157:59;;37244:7;37252:5;37244:14;;;;;;;;:::i;:::-;;;;;;;;;;;37302:22;;-1:-1:-1;;;;;37244:14:0;;;;-1:-1:-1;37302:26:0;;:22;;37244:14;37302:26;:::i;:::-;-1:-1:-1;;;;;37282:16:0;;;;;;:8;:16;;;;;;:46;:16;;;:46;;;:66;;;;-1:-1:-1;37347:1:0;37332:12;;;;:::i;:::-;;;:16;;;37282:66;37135:215;;37383:22;;:24;;:22;;;:24;:::i;:::-;-1:-1:-1;;;;;37364:16:0;;;;;;:8;:16;;;;;:43;;-1:-1:-1;;37364:43:0;;;;;;;;;;;;37435:7;:14;;37443:5;;37435:14;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37435:14:0;37422:7;37430:1;37422:10;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37422:27:0;;;:10;;;;;;;;;:27;37464:31;;:24;;;;:31;;;;;37489:5;;37464:31;;;;37489:5;37464:24;:31;;;;;;;;;;;;;;;;;;;;;37528:5;37510:14;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;37086:3:0;;-1:-1:-1;37086:3:0;;;:::i;:::-;;;;37049:496;;;-1:-1:-1;37581:22:0;;37570:50;;;;;;37581:22;;;;;37605:7;;37614:5;;37570:50;:::i;:::-;;;;;;;;37631:22;:24;;;;;:22;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36566:1097;;;;;;36536:1127::o;52772:1010::-;52967:41;14503:10;53000:7;52967:18;:41::i;:::-;52959:103;;;;-1:-1:-1;;;52959:103:0;;;;;;;:::i;:::-;53094:11;;53081:9;:24;53073:100;;;;-1:-1:-1;;;53073:100:0;;;;;;;:::i;:::-;53192:21;;;;:12;:21;;;;;;:26;53184:125;;;;-1:-1:-1;;;53184:125:0;;;;;;;:::i;:::-;53320:28;53330:4;53336:2;53340:7;53320:9;:28::i;:::-;53384:13;;;53395:1;53384:13;;;;;;;;;53361:20;;53384:13;;;;;;;;;-1:-1:-1;;53431:13:0;;;53442:1;53431:13;;;;;;;;;53361:36;;-1:-1:-1;53408:20:0;;53431:13;-1:-1:-1;53431:13:0;;;;;;;;;;;-1:-1:-1;53431:13:0;53408:36;;53467:7;53455:6;53462:1;53455:9;;;;;;;;:::i;:::-;;;;;;:19;;;;;53497:1;53485:6;53492:1;53485:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;53514:43;53525:6;53533;53541:11;;53554:2;53514:43;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;53581:13:0;;;;;;:9;:13;;;;;;53578:113;;53634:7;:14;;-1:-1:-1;;;;;53615:16:0;;;;;;:12;:16;;;;;:33;;;53663:16;;;;;;;;;-1:-1:-1;;;;;;;;;;;53663:16:0;;;-1:-1:-1;;;;;;53663:16:0;;;;;;53578:113;53703:37;53728:10;53703:16;:37::i;:::-;53751:23;53763:10;53751:11;:23::i;:::-;52895:887;;52772:1010;;;:::o;48372:2040::-;48435:10;48447:21;48470:13;48485:12;48501:47;48522:13;48537:10;48501:20;:47::i;:::-;48434:114;;;;;;;;48569:5;48568:6;48576:7;48559:25;;;;;-1:-1:-1;;;48559:25:0;;;;;;;;:::i;:::-;;48642:7;48631:8;:18;:25;;48655:1;48631:25;;;48651:1;48631:25;48597:9;48607:13;48597:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;:59;;;;;;;;;;;;;;;;;;48683:7;48672:8;:18;48669:1636;;;48748:20;48709:9;48719:13;48709:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:59;;;;;;;;:::i;:::-;;48706:1588;;;48807:12;48825:9;48835:13;48825:24;;;;;;;;:::i;:::-;;;;;;;;;:38;:24;;;;;:38;;;48807:57;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48807:57:0;-1:-1:-1;;;;;48825:38:0;;;;;;;;48807:57;;;;;;48706:1588;;;48943:23;48904:9;48914:13;48904:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:62;;;;;;;;:::i;:::-;;48900:1394;;;49009:10;49085:1;49022:60;49043:9;49053:13;49043:24;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;;;;;49043:38:0;49022:20;:60::i;:::-;:64;;;;:::i;:::-;49127:12;49140:19;;49009:77;;-1:-1:-1;49127:12:0;49140:21;;49160:1;;49140:21;:::i;:::-;49127:35;;;;;;;;:::i;:::-;;;;;;;;;;;49105:12;:19;;-1:-1:-1;;;;;49127:35:0;;;;49118:5;;49105:19;;;;;;:::i;:::-;;;;;;;;;:57;;;;;-1:-1:-1;;;;;49105:57:0;;;;;-1:-1:-1;;;;;49105:57:0;;;;;;49223:12;:18;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;49223:18:0;;;;;-1:-1:-1;;;;;;49223:18:0;;;;;;-1:-1:-1;48900:1394:0;;;49334:22;49295:9;49305:13;49295:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:61;;;;;;;;:::i;:::-;;49291:1003;;;49380:6;49376:206;49436:1;49392:9;49402:13;49392:24;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;:41;;;;:45;49376:206;;;49526:9;49536:13;49526:24;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;49560:1;49526:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;49466:18;:57;49485:9;49495:13;49485:24;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;49520:1;49485:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;49485:37:0;49466:57;;;;;;;;;;;;:96;;-1:-1:-1;;49466:96:0;;;;;;;;;;;;49439:3;;;;:::i;:::-;;;;49376:206;;;;49291:1003;;;49659:23;49620:9;49630:13;49620:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:62;;;;;;;;:::i;:::-;;49616:678;;;49719:14;49736:9;49746:13;49736:24;;;;;;;;:::i;:::-;;;;;;;;:31;:24;;;;;:31;;;-1:-1:-1;49736:31:0;;49829:433;49845:12;:19;:23;-1:-1:-1;49829:433:0;;;49904:12;:19;:21;;49924:1;;49904:21;:::i;:::-;49900:1;:25;49897:345;;;49961:12;49974:1;49961:15;;;;;;;;:::i;:::-;;;;;;;;;;50020:12;:15;;-1:-1:-1;;;;;49961:15:0;;;;49953:84;;50001:18;;50020:12;50033:1;;50020:15;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50020:15:0;50001:35;;;;;;;;;;;;;;;49987:13;49997:3;49987:9;:13;:::i;:::-;:49;;;;:::i;:::-;49953:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50089:18;:35;50108:12;50121:1;50108:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50108:15:0;50089:35;;;;;;;;;;;;;;;50075:13;50085:3;50075:9;:13;:::i;:::-;:49;;;;:::i;:::-;50064:60;;;;:::i;:::-;;;49897:345;;;50208:12;50221:1;50208:15;;;;;;;;:::i;:::-;;;;;;;;;;50200:42;;-1:-1:-1;;;;;50208:15:0;;;;50200:42;;;;;50234:7;;50200:42;50208:15;50200:42;50234:7;50208:15;50200:42;;;;;;;;;;;;;;;;;;;;;49897:345;49870:3;;;;:::i;:::-;;;;49829:433;;;;49684:610;;49616:678;50320:84;50333:9;50343:13;50333:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;50381:7;50370:8;:18;50390:13;50320:84;;;;;;;;:::i;:::-;;;;;;;;48423:1989;;;;48372:2040;:::o;42389:1584::-;42566:4;42572:13;42603:36;42624:14;42603:20;:36::i;:::-;42600:101;;-1:-1:-1;;42659:42:0;;;;;;;;;;;;-1:-1:-1;;;42659:42:0;;;;42666:4;;42659:42;;42600:101;42749:1;42734:11;42729:17;;;;;;;;:::i;:::-;:21;42726:674;;;42767:10;42780:36;42801:14;42780:20;:36::i;:::-;42767:49;-1:-1:-1;42849:20:0;42834:11;:35;;;;;;;;:::i;:::-;;:49;;;;-1:-1:-1;42873:10:0;;;42834:49;42831:117;;;-1:-1:-1;;42902:46:0;;;;;;;;;;;;;;;;;42909:4;;-1:-1:-1;42902:46:0;;42831:117;42981:23;42966:11;:38;;;;;;;;:::i;:::-;;42963:426;;;-1:-1:-1;;;;;43027:34:0;;43064:1;43027:34;;;:18;:34;;;;;;;;:38;43024:128;;43095:4;43088:64;;;;;;;;;;;;;;;;;;;;;;;;43024:128;43174:10;43171:83;;-1:-1:-1;;43207:47:0;;;;;;;;;;;;;;;;;43214:4;;-1:-1:-1;43207:47:0;;43171:83;43276:12;:19;43299:1;-1:-1:-1;43273:100:0;;43330:4;43323:50;;;;;;;;;;;;;;;;;;;;;;;;43273:100;42752:648;42726:674;43428:22;43413:11;:37;;;;;;;;:::i;:::-;;43410:526;;;43489:12;:19;43469:16;;:39;43466:98;;-1:-1:-1;;43527:37:0;;;;;;;;;;;;-1:-1:-1;;;43527:37:0;;;;43534:4;;43527:37;;43466:98;43603:12;:19;43582:17;;:40;43579:100;;-1:-1:-1;;43641:38:0;;;;;;;;;;;;-1:-1:-1;;;43641:38:0;;;;43648:4;;43641:38;;43579:100;43694:11;43728:6;43724:98;43759:1;43740:9;:16;:20;43724:98;;;43794:9;43804:1;43794:12;;;;;;;;:::i;:::-;;;;;;;43785:21;;;;;:::i;:::-;;-1:-1:-1;43762:3:0;;;;:::i;:::-;;;;43724:98;;;;43839:5;:12;;43848:3;43839:12;43836:88;;43877:4;43870:54;;;;;;;;;;;;;;;;;;;;;;;;43836:88;43451:485;43410:526;-1:-1:-1;;43946:19:0;;;;;;;;;;;;-1:-1:-1;;;43946:19:0;;;;43953:5;;42389:1584;;;;;;;;;:::o;54806:497::-;54908:10;54920:25;54979:6;:13;54960:8;:15;:32;54957:90;;-1:-1:-1;;55007:40:0;;;;;;;;;;;;;;;;;55015:4;;55007:40;;54957:90;55072:9;55068:196;55091:8;:15;55087:1;:19;55068:196;;;55154:10;-1:-1:-1;;;;;55130:34:0;:7;:20;55138:8;55147:1;55138:11;;;;;;;;:::i;:::-;;;;;;;;;;;;55130:20;;;;;;;;;;-1:-1:-1;55130:20:0;;-1:-1:-1;;;;;55130:20:0;:34;55127:126;;55192:4;55184:53;;;;;;;;;;;;;;;;;;;;;;;;55127:126;55108:3;;;;:::i;:::-;;;;55068:196;;;-1:-1:-1;;55276:19:0;;;;;;;;;;;;-1:-1:-1;;;55276:19:0;;;;55283:5;;-1:-1:-1;54806:497:0;;;;;;:::o;41885:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41885:29:0;;-1:-1:-1;41885:29:0;:::o;51405:350::-;51456:37;51495:23;51531:18;51564:12;:19;;;;-1:-1:-1;;;;;51552:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51552:32:0;;51531:53;;51599:6;51595:116;51611:12;:19;:23;-1:-1:-1;51595:116:0;;;51664:18;:35;51683:12;51696:1;51683:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;51683:15:0;51664:35;;;;;;;;;;;;;51655:6;;51664:35;;;;;51655:3;;51659:1;;51655:6;;;;;;:::i;:::-;:44;;;;:6;;;;;;;;;;;:44;51636:3;;;;:::i;:::-;;;;51595:116;;;;51729:12;51743:3;51721:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51721:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51405:350;;:::o;21647:192::-;21792:39;21809:4;21815:2;21819:7;21792:39;;;;;;;;;;;;:16;:39::i;56515:1043::-;56595:10;56608:11;56623:43;56646:8;56656:9;56623:22;:43::i;:::-;56594:72;;;;;56686:5;56685:6;56677:103;;;;-1:-1:-1;;;56677:103:0;;23812:2:1;56677:103:0;;;23794:21:1;23851:2;23831:18;;;23824:30;23890:34;23870:18;;;23863:62;23961:34;23941:18;;;23934:62;-1:-1:-1;;;24012:19:1;;;24005:51;24073:19;;56677:103:0;23610:488:1;56677:103:0;56814:10;56804:21;;;;:9;:21;;;;;;56801:137;;56873:7;:14;;56859:10;56846:24;;;;:12;:24;;;;;:41;;;56902:24;;;;;;;;;-1:-1:-1;;;;;;;;;;;56902:24:0;;;-1:-1:-1;;;;;;56902:24:0;;;;;;56801:137;56958:25;56997:8;:15;-1:-1:-1;;;;;56986:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56986:27:0;;56958:55;;57028:9;57024:417;57047:8;:15;57043:1;:19;57024:417;;;57083:24;57118:7;:20;57126:8;57135:1;57126:11;;;;;;;;:::i;:::-;;;;;;;57118:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57118:20:0;57083:56;;57155:8;-1:-1:-1;;;;;57155:17:0;:44;57173:12;:25;57186:8;57195:1;57186:11;;;;;;;;:::i;:::-;;;;;;;57173:25;;;;;;;;;;;;57155:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57215;57225:8;57235:10;57247:8;57256:1;57247:11;;;;;;;;:::i;:::-;;;;;;;57215:9;:44::i;:::-;57290:21;57302:8;57290:11;:21::i;:::-;57359:12;:25;57372:8;57381:1;57372:11;;;;;;;;:::i;:::-;;;;;;;57359:25;;;;;;;;;;;;57342:11;57354:1;57342:14;;;;;;;;:::i;:::-;;;;;;:42;;;;;57428:1;57400:12;:25;57413:8;57422:1;57413:11;;;;;;;;:::i;:::-;;;;;;;57400:25;;;;;;;;;;;:29;;;;57068:373;57064:3;;;;;:::i;:::-;;;;57024:417;;;;57456:50;57467:8;57477:11;57490:3;57495:10;57456:50;;;;;;;;;:::i;:::-;;;;;;;;57547:3;57535:9;:3;57541;57535:9;:::i;:::-;:15;;;;:::i;:::-;57517:14;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;56515:1043:0:o;18475:239::-;18547:7;18583:16;;;:7;:16;;;;;;-1:-1:-1;;;;;18583:16:0;18618:19;18610:73;;;;-1:-1:-1;;;18610:73:0;;23402:2:1;18610:73:0;;;23384:21:1;23441:2;23421:18;;;23414:30;23480:34;23460:18;;;23453:62;-1:-1:-1;;;23531:18:1;;;23524:39;23580:19;;18610:73:0;23200:405:1;46014:2346:0;46114:10;46126:21;46149:13;46164:12;46189:10;46202:35;46223:13;46202:20;:35::i;:::-;46189:48;;46248:14;46277:13;46319:6;46315:247;46372:1;46331:9;46341:13;46331:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:38;;;;:42;46315:247;;;46397:9;46407:13;46397:24;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;46428:1;46397:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;46434:1;46397:38;46394:71;;;46454:11;;;;:::i;:::-;;;;46394:71;46483:9;46493:13;46483:24;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;46514:1;46483:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;46480:70;;46540:10;;;;:::i;:::-;;;;46480:70;46375:3;;;;:::i;:::-;;;;46315:247;;;-1:-1:-1;46577:10:0;46574:91;;46602:63;;;;;;;;;;;;-1:-1:-1;;;46602:63:0;;;;46609:4;;-1:-1:-1;46602:63:0;-1:-1:-1;46645:9:0;;-1:-1:-1;46656:8:0;-1:-1:-1;46602:63:0;;-1:-1:-1;46602:63:0;46574:91;46718:20;46679:9;46689:13;46679:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:59;;;;;;;;:::i;:::-;;:127;;;;;46805:1;46742:60;46763:9;46773:13;46763:24;;;;;;;;:::i;46742:60::-;:64;46679:127;46676:212;;;46821:67;;;;;;;;;;;;;;;;;46828:4;;-1:-1:-1;46821:67:0;-1:-1:-1;46868:9:0;;-1:-1:-1;46879:8:0;-1:-1:-1;46821:67:0;;-1:-1:-1;46821:67:0;46676:212;46941:23;46902:9;46912:13;46902:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:62;;;;;;;;:::i;:::-;;:90;;;;-1:-1:-1;46968:12:0;:19;46991:1;46968:24;46902:90;46899:185;;;47014:4;47064:9;47075:8;47007:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46899:185;47137:23;47098:9;47108:13;47098:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:62;;;;;;;;:::i;:::-;;:128;;;;;47225:1;47164:18;:58;47183:9;47193:13;47183:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:38;;;;;;-1:-1:-1;;;;;47183:38:0;47164:58;;;;;;;;;;;;;;;:62;47098:128;47095:231;;;47248:4;47306:9;47317:8;47241:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47095:231;47340:9;:16;:33;-1:-1:-1;47337:111:0;;47388:60;;;;;;;;;;;;;;;;;47395:4;;-1:-1:-1;47388:60:0;-1:-1:-1;47428:9:0;;-1:-1:-1;47439:8:0;-1:-1:-1;47388:60:0;;-1:-1:-1;47388:60:0;47337:111;47462:9;47472:13;47462:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;47497:1;47462:36;47459:110;;47513:56;;;;;;;;;;;;-1:-1:-1;;;47513:56:0;;;;47520:4;;-1:-1:-1;47513:56:0;-1:-1:-1;47549:9:0;;-1:-1:-1;47560:8:0;-1:-1:-1;47513:56:0;;-1:-1:-1;47513:56:0;47459:110;47602:9;47612:13;47602:24;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;47583:15;:51;;:116;;;;-1:-1:-1;47680:12:0;:19;47638:9;:24;;47648:13;;47638:24;;;;;;:::i;:::-;;;;;;;;;;;:31;;:38;;;;:61;;47583:116;47580:193;;;47714:59;;;;;;;;;;;;-1:-1:-1;;;47714:59:0;;;;47721:4;;-1:-1:-1;47714:59:0;-1:-1:-1;47753:9:0;;-1:-1:-1;47764:8:0;-1:-1:-1;47714:59:0;;-1:-1:-1;47714:59:0;47580:193;47885:23;47846:9;47856:13;47846:24;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;:62;;;;;;;;:::i;:::-;;:121;;;;;47936:9;47946:13;47936:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;47912:21;:55;47846:121;47843:191;;;47982:52;;;;;;;;;;;;-1:-1:-1;;;47982:52:0;;;;47989:4;;-1:-1:-1;47982:52:0;-1:-1:-1;48014:9:0;;-1:-1:-1;48025:8:0;-1:-1:-1;47982:52:0;;-1:-1:-1;47982:52:0;47843:191;48126:9;48136:13;48126:24;;;;;;;;:::i;:::-;;;;;;;;;:31;:24;;;;;:31;:38;48104:12;:19;:60;;48126:38;48104:60;:::i;:::-;48062:9;48072:13;48062:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:38;;;;:102;48059:242;;48222:4;48281:9;48292:8;48215:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48059:242;48312:40;;;;;;;;;;;;-1:-1:-1;;;48312:40:0;;;;48319:5;;-1:-1:-1;48312:40:0;-1:-1:-1;48332:9:0;;-1:-1:-1;48343:8:0;-1:-1:-1;;46014:2346:0;;;;;;;;:::o;18205:208::-;18277:7;-1:-1:-1;;;;;18305:19:0;;18297:74;;;;-1:-1:-1;;;18297:74:0;;22991:2:1;18297:74:0;;;22973:21:1;23030:2;23010:18;;;23003:30;23069:34;23049:18;;;23042:62;-1:-1:-1;;;23120:18:1;;;23113:40;23170:19;;18297:74:0;22789:406:1;18297:74:0;-1:-1:-1;;;;;;18389:16:0;;;;;:9;:16;;;;;;;18205:208::o;30275:24::-;;;;;;;;;;;;34232:828;34285:11;;34278:6;:19;;:6;;34285:11;;;34278:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;34314:1;34278:37;34270:94;;;;-1:-1:-1;;;34270:94:0;;18928:2:1;34270:94:0;;;18910:21:1;18967:2;18947:18;;;18940:30;19006:34;18986:18;;;18979:62;-1:-1:-1;;;19057:18:1;;;19050:42;19109:19;;34270:94:0;18726:408:1;34270:94:0;34423:11;;34416:6;:19;;34375:27;;34423:11;;;34416:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;-1:-1:-1;;;;;34405:44:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34405:44:0;-1:-1:-1;34508:11:0;;34501:6;:19;;34375:74;;-1:-1:-1;34460:24:0;;34501:6;;34508:11;;;34501:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;-1:-1:-1;;;;;34487:47:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34487:47:0;;34460:74;;34559:8;34555:386;34584:11;;34577:6;:19;;:6;;34584:11;;;34577:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;34573:1;:36;;;34555:386;;;34664:11;;34657:6;:19;;34649:73;;34664:11;;;34657:19;;;;;;:::i;:::-;;;;;;;;;:26;:19;;;;;:26;:33;34699:11;;34692:6;:19;;:6;;34699:11;;;34692:19;;;;;;:::i;:::-;;;;;;;;;;;:26;;34719:1;34692:29;;;;;;;;;;:::i;34649:73::-;34630:13;34644:1;34630:16;;;;;;;;;;:::i;:::-;;;;;;;;;;:92;34757:11;;34750:6;:19;;:6;;34757:11;;;34750:19;;;;;;:::i;:::-;;;;;;;;;;;:26;;34777:13;34791:1;34777:16;;;;;;;;;;:::i;:::-;;;;;;;34750:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34750:44:0;34737:7;34745:1;34737:10;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34737:57:0;;;:10;;;;;;;;;;;:57;34816:11;;34809:6;:19;;:6;;34816:11;;;34809:19;;;;;;:::i;:::-;;;;;;;;;;;:27;;34842:13;34856:1;34842:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;;34809:50;;;;;;;-1:-1:-1;34809:50:0;;;;;;;;;34882:10;;:7;;:10;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34874:28:0;:55;34903:6;34910:11;;;;;;;;;;;34903:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;34874:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34611:3:0;;;;:::i;:::-;;;;34555:386;;;-1:-1:-1;34965:11:0;;34987:6;:19;;34956:72;;34965:11;;;34978:7;;34965:11;;34987:19;;;;;;:::i;:::-;;;;;;;;;;;:25;;;35014:13;34956:72;;;;;;;;;:::i;:::-;;;;;;;;35039:11;:13;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;34259:801;;34232:828::o;52508:146::-;52568:5;;-1:-1:-1;;;;;52568:5:0;52577:10;52568:19;52560:58;;;;-1:-1:-1;;;52560:58:0;;28052:2:1;52560:58:0;;;28034:21:1;28091:2;28071:18;;;28064:30;28130:28;28110:18;;;28103:56;28176:18;;52560:58:0;27850:350:1;52560:58:0;52629:11;:17;52508:146::o;18950:104::-;19006:13;19039:7;19032:14;;;;;:::i;20633:295::-;-1:-1:-1;;;;;20736:24:0;;14503:10;20736:24;;20728:62;;;;-1:-1:-1;;;20728:62:0;;20872:2:1;20728:62:0;;;20854:21:1;20911:2;20891:18;;;20884:30;20950:27;20930:18;;;20923:55;20995:18;;20728:62:0;20670:349:1;20728:62:0;14503:10;20803:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20803:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;20803:53:0;;;;;;;;;;20872:48;;16063:41:1;;;20803:42:0;;14503:10;20872:48;;16036:18:1;20872:48:0;;;;;;;20633:295;;:::o;53794:1000::-;53976:41;14503:10;54009:7;53976:18;:41::i;:::-;53968:103;;;;-1:-1:-1;;;53968:103:0;;;;;;;:::i;:::-;54103:11;;54090:9;:24;54082:100;;;;-1:-1:-1;;;54082:100:0;;;;;;;:::i;:::-;54201:21;;;;:12;:21;;;;;;:26;54193:125;;;;-1:-1:-1;;;54193:125:0;;;;;;;:::i;:::-;54329:39;54343:4;54349:2;54353:7;54362:5;54329:13;:39::i;:::-;54404:13;;;54415:1;54404:13;;;;;;;;;54381:20;;54404:13;;;;;;;;;-1:-1:-1;;54451:13:0;;;54462:1;54451:13;;;;;;;;;54381:36;;-1:-1:-1;54428:20:0;;54451:13;-1:-1:-1;54451:13:0;;;;;;;;;;;-1:-1:-1;54451:13:0;54428:36;;54487:7;54475:6;54482:1;54475:9;;;;;;;;:::i;:::-;;;;;;:19;;;;;54517:1;54505:6;54512:1;54505:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;54534:43;54545:6;54553;54561:11;;54574:2;54534:43;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;54593:13:0;;;;;;:9;:13;;;;;;54590:113;;54646:7;:14;;-1:-1:-1;;;;;54627:16:0;;;;;;:12;:16;;;;;:33;;;54675:16;;;;;;;;;-1:-1:-1;;;;;;;;;;;54675:16:0;;;-1:-1:-1;;;;;;54675:16:0;;;;;;54590:113;54715:37;54740:10;54715:16;:37::i;:::-;54763:23;54775:10;54763:11;:23::i;:::-;53957:837;;53794:1000;;;;:::o;38037:668::-;38169:11;;38162:6;:19;;38099:4;;38105:13;;38099:4;;;;38169:11;;;38162:19;;;;;;:::i;:::-;;;;;;;;;;;:25;;;38150:9;:37;;;;:::i;:::-;38229:11;;38222:6;:19;;38136:51;;-1:-1:-1;38198:9:0;;38222:6;;38229:11;;;38222:19;;;;;;:::i;:::-;;;;;;;;;;;:25;;;38210:9;:37;;;;:::i;:::-;38198:49;-1:-1:-1;38261:11:0;38258:82;;-1:-1:-1;38287:53:0;;;;;;;;;;;;;;;;;38295:4;;-1:-1:-1;38287:53:0;-1:-1:-1;38333:6:0;-1:-1:-1;38287:53:0;;38258:82;38354:8;;38351:81;;-1:-1:-1;38377:55:0;;;;;;;;;;;;;;;;;38385:4;;-1:-1:-1;38377:55:0;-1:-1:-1;38425:6:0;-1:-1:-1;38377:55:0;;38351:81;38453:11;;38446:6;:19;;38481:6;;38453:11;;;38446:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:41;38443:116;;;38510:4;38552:6;38502:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;38443:116;38594:5;38573:17;;:26;38570:88;;-1:-1:-1;38614:44:0;;;;;;;;;;;;-1:-1:-1;;;38614:44:0;;;;38622:4;;-1:-1:-1;38614:44:0;-1:-1:-1;38651:6:0;-1:-1:-1;38614:44:0;;38570:88;-1:-1:-1;38671:26:0;;;;;;;;;;;;-1:-1:-1;;;38671:26:0;;;;38678:5;;-1:-1:-1;38671:26:0;-1:-1:-1;38690:6:0;-1:-1:-1;38037:668:0;;;;;;:::o;50420:244::-;50480:16;50498:14;50552:5;50533:9;:16;;;;:24;50525:64;;;;-1:-1:-1;;;50525:64:0;;28407:2:1;50525:64:0;;;28389:21:1;28446:2;28426:18;;;28419:30;28485:29;28465:18;;;28458:57;28532:18;;50525:64:0;28205:351:1;50525:64:0;50608:9;50618:5;50608:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;50633:9;50643:5;50633:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;50600:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50600:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50420:244;;;:::o;44742:852::-;44836:10;44848:25;44886:10;44899:35;44920:13;44899:20;:35::i;:::-;44886:48;-1:-1:-1;44948:10:0;44945:70;;-1:-1:-1;;44973:42:0;;;;;;;;;;;;-1:-1:-1;;;44973:42:0;;;;44980:4;;-1:-1:-1;44973:42:0;;44945:70;45029:9;:16;:33;-1:-1:-1;45026:85:0;;-1:-1:-1;;45077:34:0;;;;;;;;;;;;-1:-1:-1;;;45077:34:0;;;;45084:4;;-1:-1:-1;45077:34:0;;45026:85;45125:9;45135:13;45125:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;45160:1;45125:36;45122:87;;-1:-1:-1;;45176:33:0;;;;;;;;;;;;-1:-1:-1;;;45176:33:0;;;;45183:4;;-1:-1:-1;45176:33:0;;45122:87;45242:9;45252:13;45242:24;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;45223:15;:51;45220:107;;-1:-1:-1;;45289:38:0;;;;;;;;;;;;-1:-1:-1;;;45289:38:0;;;;45296:4;;-1:-1:-1;45289:38:0;;45220:107;45344:6;45340:217;45397:1;45356:9;45366:13;45356:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:38;;;;:42;45340:217;;;45460:13;-1:-1:-1;;;;;45422:51:0;:9;45432:13;45422:24;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;45454:1;45422:34;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;45422:34:0;:51;45419:127;;;45500:4;45493:37;;;;;;;;;;;;;-1:-1:-1;;;45493:37:0;;;;;;;;;;;45419:127;45400:3;;;;:::i;:::-;;;;45340:217;;;-1:-1:-1;;45567:19:0;;;;;;;;;;;;-1:-1:-1;;;45567:19:0;;;;45574:5;;45567:19;;-1:-1:-1;44742:852:0;-1:-1:-1;;;44742:852:0:o;50676:501::-;50730:12;50744;50758:21;50781;50810:23;50835:26;50863:11;50876:23;50901:20;50961:5;50942:9;:16;;;;:24;50934:64;;;;-1:-1:-1;;;50934:64:0;;28407:2:1;50934:64:0;;;28389:21:1;28446:2;28426:18;;;28419:30;28485:29;28465:18;;;28458:57;28532:18;;50934:64:0;28205:351:1;50934:64:0;51009:17;51029:9;51039:5;51029:16;;;;;;;;:::i;:::-;;;;;;;;;;51009:36;;;;;;;;51029:16;;;;;;;51009:36;;;;;;;;;;;;;;;;;;;;;51029:16;;51009:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;51009:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51009:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51009:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51064:1;:9;;;51075:1;:8;;;51085:1;:12;;;51099:1;:15;;;51116:1;:10;;;51128:1;:11;;;51141:1;:8;;;51151:1;:8;;;51161:1;:7;;;51056:113;;;;;;;;;;;;;;;;;;;50676:501;;;;;;;;;;;:::o;19125:334::-;23820:4;23844:16;;;:7;:16;;;;;;19198:13;;-1:-1:-1;;;;;23844:16:0;19224:76;;;;-1:-1:-1;;;19224:76:0;;26405:2:1;19224:76:0;;;26387:21:1;26444:2;26424:18;;;26417:30;26483:34;26463:18;;;26456:62;-1:-1:-1;;;26534:18:1;;;26527:45;26589:19;;19224:76:0;26203:411:1;19224:76:0;19313:21;19337:10;19784:9;;;;;;;;;-1:-1:-1;19784:9:0;;;19707:94;19337:10;19313:34;;19389:1;19371:7;19365:21;:25;:86;;;;;;;;;;;;;;;;;19417:7;19426:18;:7;:16;:18::i;:::-;19400:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19365:86;19358:93;19125:334;-1:-1:-1;;;19125:334:0:o;43985:745::-;44146:10;44158:21;44183:84;44204:11;44217:14;44233:9;44244:10;44256;44183:20;:84::i;:::-;44145:122;;;;44288:5;44287:6;44295:7;44278:25;;;;;-1:-1:-1;;;44278:25:0;;;;;;;;:::i;:::-;-1:-1:-1;44316:9:0;44328:32;:15;44347:12;44328:32;:::i;:::-;44316:44;;44385:28;44424:25;44460:9;44489:104;;;;;;;;44498:4;44489:104;;;;44504:1;44489:104;;;;;;44508:11;44489:104;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;44489:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44460:144;;;;;;;;-1:-1:-1;44460:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44460:144:0;;;;;;;;;;;;;;;;;-1:-1:-1;;44460:144:0;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;44460:144:0;;;;;;;;;-1:-1:-1;;;;;44460:144:0;;;;;-1:-1:-1;;44460:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44460:144:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44460:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44460:144:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;44620:102;44636:4;44642:11;44655:14;44671:9;44682:10;44694:7;44720:1;44703:9;:16;;;;:18;;;;:::i;:::-;44620:102;;;;;;;;;;;;:::i;:::-;;;;;;;;44134:596;;;;;43985:745;;;;;:::o;45602:404::-;45677:10;45689:21;45714:47;45735:13;45750:10;45714:20;:47::i;:::-;45676:85;;;;45782:5;45781:6;45789:7;45772:25;;;;;-1:-1:-1;;;45772:25:0;;;;;;;;:::i;:::-;;45808:9;45818:13;45808:24;;;;;;;;:::i;:::-;;;;;;;;;:31;:24;;;;;:31;;;;:48;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45808:48:0;45845:10;45808:48;;;45867:9;:24;;45877:13;;45867:24;;;;;;:::i;:::-;;;;;;;;;:30;:24;;;;;:30;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45929:9;:24;;45924:74;;45929:9;45939:13;;45929:24;;;;;;:::i;:::-;;;;;;;;;;;:35;;;;;;;;;;;;45966:13;45981:10;45993:4;45924:74;;;;;;;;;:::i;:::-;;;;;;;;45665:341;;45602:404;;:::o;38729:1848::-;38777:10;38791:11;38806:26;38822:9;38806:15;:26::i;:::-;38776:56;;;;;38862:5;38861:6;38853:68;;;;-1:-1:-1;;;38853:68:0;;25987:2:1;38853:68:0;;;25969:21:1;26026:2;26006:18;;;25999:30;26065:34;26045:18;;;26038:62;-1:-1:-1;;;26116:18:1;;;26109:47;26173:19;;38853:68:0;25785:413:1;38853:68:0;38957:17;;39040:10;38936:18;39030:21;;;:9;:21;;;;;;39027:137;;39099:7;:14;;39085:10;39072:24;;;;:12;:24;;;;;:41;;;39128:24;;;;;;;;;-1:-1:-1;;;;;;;;;;;39128:24:0;;;-1:-1:-1;;;;;;39128:24:0;;;;;;39027:137;39188:6;39184:813;39204:6;39200:1;:10;39184:813;;;39231:43;39241:10;39272:1;39254:17;;:19;;;;:::i;:::-;39231:9;:43::i;:::-;39331:11;;39324:6;:19;;39359:17;;39331:11;;;39324:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;39307:14;;:49;;;;:::i;:::-;:69;;;;:::i;:::-;39290:14;:86;39398:11;;39391:6;:19;;:6;;39398:11;;;39391:19;;;;;;:::i;:::-;;;;;;;;;:26;:19;;;;;:26;;;;:43;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39391:43:0;39423:10;39391:43;;;;;;39451:37;;:16;:37::i;:::-;39521:11;;39536:1;;39508:12;;39521:11;;39508:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:29;39505:432;;;39621:11;;39558;;39608:12;;39621:11;;39608:25;;;;;;;:::i;:::-;;;;;;;;39579:11;;39572:6;:19;;39608:25;;;;;;;;;;;;;39572:6;;39579:11;;;39572:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:61;;:120;;39661:11;;39674:17;;39639:53;;39649:10;;39661:11;;;;;39639:9;:53::i;:::-;39572:120;;;39635:1;39572:120;39558:134;;39714:5;:10;;39723:1;39714:10;39711:211;;;39761:11;;39748:12;;39761:11;;39748:25;;;;;;;:::i;:::-;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;39798:10;39832:1;39814:17;;:19;;;;:::i;:::-;39798:36;;;;;;;-1:-1:-1;39798:36:0;;;;;;;;;;;39901:1;39880:11;;39873:6;:19;;:6;;39880:11;;;39873:19;;;;;;:::i;:::-;;;;;;;;;;;:25;;;:29;;;;:::i;:::-;39857:45;;;;:::i;:::-;;;39711:211;39538:399;39505:432;39958:11;;39951:6;:19;;:6;;39958:11;;;39951:19;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;;;:::i;:::-;;;;;;39212:3;;;;;:::i;:::-;;;;39184:813;;;-1:-1:-1;40020:16:0;;40017:202;;40052:42;;40060:10;;40052:42;;;;;40081:12;;40052:42;;;;40081:12;40060:10;40052:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40163:11:0;;40114:61;;;;;;40125:10;;40137:12;;40151:10;;40163:11;;;40114:61;:::i;:::-;;;;;;;;40190:17;40197:10;;40190:17;:::i;:::-;40260:6;40239:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;40290:10:0;40277:24;;;;:12;:24;;;;;:34;;40305:6;;40277:24;:34;;40305:6;;40277:34;:::i;:::-;;;;-1:-1:-1;;40341:11:0;;40370:6;:19;;40341:11;;;;;;;40370:19;;;;;;:::i;:::-;;;;;;;;;;;:32;;;40406:1;40370:37;40367:78;;;40423:10;:8;:10::i;:::-;40495:11;;40543:6;:19;;40470:99;;40485:8;;40495:11;;;;;40508:13;;40523:6;;40531:10;;40543:6;40495:11;;40543:19;;;;;;:::i;:::-;;;;;;;;;;:25;:19;;;;;:25;;40470:99;;;33308:4:1;33296:17;;;33278:36;;33350:17;;;;33330:18;;;33323:45;;;;33384:18;;;33377:34;;;;33442:2;33427:18;;33420:34;-1:-1:-1;;;;;33491:55:1;33485:3;33470:19;;33463:84;33578:3;33563:19;;33556:35;33265:3;33250:19;40470:99:0;32999:598:1;55802:701:0;55899:10;55911:25;55899:10;;;;56008:255;56031:8;:15;56027:1;:19;56008:255;;;56070:12;:25;56083:8;56092:1;56083:11;;;;;;;;:::i;:::-;;;;;;;56070:25;;;;;;;;;;;;56099:1;56070:30;56067:135;;;56128:4;56181;56120:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56067:135;56226:12;:25;56239:8;56248:1;56239:11;;;;;;;;:::i;:::-;;;;;;;56226:25;;;;;;;;;;;;56216:35;;;;;:::i;:::-;;-1:-1:-1;56048:3:0;;;;:::i;:::-;;;;56008:255;;;-1:-1:-1;56280:11:0;:6;56289:2;56280:11;:::i;:::-;56273:18;-1:-1:-1;56309:11:0;56316:4;56273:18;56309:11;:::i;:::-;56302:18;-1:-1:-1;56358:13:0;56302:18;56358:6;:13;:::i;:::-;56344:10;:27;56341:104;;56394:4;56440;56386:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;56341:104;56470:25;;;;;;;;;;;;-1:-1:-1;;;56470:25:0;;;;56477:5;;-1:-1:-1;56470:25:0;-1:-1:-1;56490:4:0;-1:-1:-1;;55802:701:0;;;;;;:::o;55315:475::-;55409:10;55426:40;55449:8;55459:6;55426:22;:40::i;:::-;55408:58;;;55496:5;55495:6;55487:108;;;;-1:-1:-1;;;55487:108:0;;25079:2:1;55487:108:0;;;25061:21:1;25118:2;25098:18;;;25091:30;25157:34;25137:18;;;25130:62;25228:34;25208:18;;;25201:62;25300:27;25279:19;;;25272:56;25345:19;;55487:108:0;24877:493:1;55487:108:0;55620:9;55616:108;55639:8;:15;55635:1;:19;55616:108;;;55703:6;55710:1;55703:9;;;;;;;;:::i;:::-;;;;;;;55675:12;:25;55688:8;55697:1;55688:11;;;;;;;;:::i;:::-;;;;;;;55675:25;;;;;;;;;;;:37;;;;55656:3;;;;;:::i;:::-;;;;55616:108;;;;55739:43;55753:8;55763:6;55771:10;55739:43;;;;;;;;:::i;:::-;;;;;;;;55397:393;55315:475;;:::o;27755:174::-;27830:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;27830:29:0;-1:-1:-1;;;;;27830:29:0;;;;;;;;:24;;27884:23;27830:24;27884:14;:23::i;:::-;-1:-1:-1;;;;;27875:46:0;;;;;;;;;;;27755:174;;:::o;30713:212::-;30796:5;:7;;30779:4;;;30796:7;;;:::i;:::-;;;;;;30905:12;30853:16;30871:15;30888:4;30894:5;;30836:64;;;;;;;;;;11787:19:1;;;11831:2;11822:12;;11815:28;;;;11881:2;11877:15;-1:-1:-1;;11873:53:1;11868:2;11859:12;;11852:75;11952:2;11943:12;;11936:28;11989:3;11980:13;;11574:425;30836:64:0;;;;;;;;;;;;;30826:75;;;;;;30821:81;;:96;;;;:::i;24049:348::-;24142:4;23844:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23844:16:0;24159:73;;;;-1:-1:-1;;;24159:73:0;;22153:2:1;24159:73:0;;;22135:21:1;22192:2;22172:18;;;22165:30;22231:34;22211:18;;;22204:62;-1:-1:-1;;;22282:18:1;;;22275:42;22334:19;;24159:73:0;21951:408:1;24159:73:0;24243:13;24259:23;24274:7;24259:14;:23::i;:::-;24243:39;;24312:5;-1:-1:-1;;;;;24301:16:0;:7;-1:-1:-1;;;;;24301:16:0;;:51;;;;24345:7;-1:-1:-1;;;;;24321:31:0;:20;24333:7;24321:11;:20::i;:::-;-1:-1:-1;;;;;24321:31:0;;24301:51;:87;;;-1:-1:-1;;;;;;21120:25:0;;;21096:4;21120:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;24356:32;24293:96;24049:348;-1:-1:-1;;;;24049:348:0:o;27059:578::-;27218:4;-1:-1:-1;;;;;27191:31:0;:23;27206:7;27191:14;:23::i;:::-;-1:-1:-1;;;;;27191:31:0;;27183:85;;;;-1:-1:-1;;;27183:85:0;;25577:2:1;27183:85:0;;;25559:21:1;25616:2;25596:18;;;25589:30;25655:34;25635:18;;;25628:62;-1:-1:-1;;;25706:18:1;;;25699:39;25755:19;;27183:85:0;25375:405:1;27183:85:0;-1:-1:-1;;;;;27287:16:0;;27279:65;;;;-1:-1:-1;;;27279:65:0;;20467:2:1;27279:65:0;;;20449:21:1;20506:2;20486:18;;;20479:30;20545:34;20525:18;;;20518:62;-1:-1:-1;;;20596:18:1;;;20589:34;20640:19;;27279:65:0;20265:400:1;27279:65:0;27461:29;27478:1;27482:7;27461:8;:29::i;:::-;-1:-1:-1;;;;;27503:15:0;;;;;;:9;:15;;;;;:20;;27522:1;;27503:15;:20;;27522:1;;27503:20;:::i;:::-;;;;-1:-1:-1;;;;;;;27534:13:0;;;;;;:9;:13;;;;;:18;;27551:1;;27534:13;:18;;27551:1;;27534:18;:::i;:::-;;;;-1:-1:-1;;27563:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27563:21:0;-1:-1:-1;;;;;27563:21:0;;;;;;;;;27602:27;;27563:16;;27602:27;;;;;;;27059:578;;;:::o;35719:758::-;35796:14;35813:24;35823:13;35813:9;:24::i;:::-;35796:41;;35866:2;35851:12;;:17;:58;;;;;35882:13;35896:12;;35882:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35872:37;;:6;:37;;35851:58;35848:622;;;35925:10;35982:4;35955:10;35966:12;;35955:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35938:41;;:14;;:41;;;;:::i;:::-;:48;;;;:::i;:::-;36001:29;;35925:61;;-1:-1:-1;;;;;;36001:22:0;;;:29;;;;;35925:61;;36001:29;;;;35925:61;36001:22;:29;;;;;;;;;;;;;;;;;;;;;36063:5;36045:14;;:23;;;;;;;:::i;:::-;;;;;;;;36088:62;36100:13;36114:12;;36100:27;;;;;;;:::i;:::-;;;;;;;;;36088:62;;;36100:27;;;;;;;;;;;;;18318:38:1;;-1:-1:-1;;;;;18392:55:1;;18387:2;18372:18;;18365:83;18464:18;;18457:34;;;18306:2;18291:18;36088:62:0;;;;;;;36165:12;:14;;;:12;:14;;;:::i;:::-;;;;;;35910:281;35785:692;35719:758;:::o;35848:622::-;36200:12;;36216:2;36200:18;:59;;;;;36232:13;36246:12;;36232:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36222:37;;:6;:37;;36200:59;36197:273;;;36298:14;;36275:38;;-1:-1:-1;;;;;36275:22:0;;;:38;;;;;;;;;36298:14;36275:22;:38;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36367:14:0;;36333:49;;;36345:5;18318:38:1;;-1:-1:-1;;;;;18392:55:1;;18387:2;18372:18;;18365:83;18464:18;;;18457:34;;;;36333:49:0;;;;;;18306:2:1;36333:49:0;;;36415:14;;;;36397;:32;36415:14;;36397:32;:::i;:::-;;;;-1:-1:-1;;36444:12:0;:14;;;:12;:14;;;:::i;:::-;;;;;;36197:273;35785:692;35719:758;:::o;57570:463::-;-1:-1:-1;;;;;57630:17:0;;;;;;:9;:17;;;;;;57627:399;;-1:-1:-1;;;;;57681:20:0;;57668:10;57681:20;;;:12;:20;;;;;;57719:7;:14;:18;;;;:46;;;57759:6;-1:-1:-1;;;;;57741:24:0;:7;57749:5;57741:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57741:14:0;:24;57719:46;57716:299;;;57796:7;:14;:16;;57811:1;;57796:16;:::i;:::-;57788:5;:24;57785:183;;;57853:7;57861:14;;:16;;57876:1;;57861:16;:::i;:::-;57853:25;;;;;;;;:::i;:::-;;;;;;;;;;;57836:7;:14;;-1:-1:-1;;;;;57853:25:0;;;;57844:5;;57836:14;;;;;;:::i;:::-;;;;;;;;;:42;;;;;-1:-1:-1;;;;;57836:42:0;;;;;-1:-1:-1;;;;;57836:42:0;;;;;;57943:5;57901:12;:39;57914:7;57937:1;57922:7;:14;;;;:16;;;;:::i;:::-;57914:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;57914:25:0;57901:39;;;;;;;;;;;;:47;57785:183;57986:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;57986:13:0;;;;;-1:-1:-1;;;;;;57986:13:0;;;;;;57653:373;57627:399;57570:463;:::o;51767:232::-;51833:4;;51850:123;51866:12;:19;:23;-1:-1:-1;51850:123:0;;;51932:4;-1:-1:-1;;;;;51913:23:0;:12;51926:1;51913:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;51913:15:0;:23;51910:51;;;51958:3;:1;51960;51958:3;:::i;51910:51::-;51891:3;;;;:::i;:::-;;;;51850:123;;;-1:-1:-1;51990:1:0;;51767:232;-1:-1:-1;;51767:232:0:o;23127:315::-;23284:28;23294:4;23300:2;23304:7;23284:9;:28::i;:::-;23331:48;23354:4;23360:2;23364:7;23373:5;23331:22;:48::i;:::-;23323:111;;;;-1:-1:-1;;;23323:111:0;;;;;;;:::i;:::-;23127:315;;;;:::o;14827:723::-;14883:13;15104:10;15100:53;;-1:-1:-1;;15131:10:0;;;;;;;;;;;;-1:-1:-1;;;15131:10:0;;;;;14827:723::o;15100:53::-;15178:5;15163:12;15219:78;15226:9;;15219:78;;15252:8;;;;:::i;:::-;;-1:-1:-1;15275:10:0;;-1:-1:-1;15283:2:0;15275:10;;:::i;:::-;;;15219:78;;;15307:19;15339:6;-1:-1:-1;;;;;15329:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15329:17:0;;15307:39;;15357:154;15364:10;;15357:154;;15391:11;15401:1;15391:11;;:::i;:::-;;-1:-1:-1;15460:10:0;15468:2;15460:5;:10;:::i;:::-;15447:24;;:2;:24;:::i;:::-;15434:39;;15417:6;15424;15417:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15417:56:0;;;;;;;;-1:-1:-1;15488:11:0;15497:2;15488:11;;:::i;:::-;;;15357:154;;24739:110;24815:26;24825:2;24829:7;24815:26;;;;;;;;;;;;:9;:26::i;40589:223::-;40722:75;;;40739:16;40722:75;;;12241:19:1;40757:15:0;12276:12:1;;;12269:28;;;;12335:2;12331:15;;;-1:-1:-1;;12327:53:1;12313:12;;;12306:75;12437:3;12415:16;;;-1:-1:-1;;;;;;12411:36:1;12397:12;;;12390:58;12464:12;;;12457:28;;;-1:-1:-1;;40802:1:0;;12501:13:1;;40722:75:0;;;;;;;;;;;;40712:86;;;;;;40704:95;;:99;;;;:::i;28494:803::-;28649:4;-1:-1:-1;;;;;28670:13:0;;7597:20;7645:8;28666:624;;28706:72;;-1:-1:-1;;;28706:72:0;;-1:-1:-1;;;;;28706:36:0;;;;;:72;;14503:10;;28757:4;;28763:7;;28772:5;;28706:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28706:72:0;;;;;;;;-1:-1:-1;;28706:72:0;;;;;;;;;;;;:::i;:::-;;;28702:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28952:13:0;;28948:272;;28995:60;;-1:-1:-1;;;28995:60:0;;;;;;;:::i;28948:272::-;29170:6;29164:13;29155:6;29151:2;29147:15;29140:38;28702:533;-1:-1:-1;;;;;;28829:55:0;-1:-1:-1;;;28829:55:0;;-1:-1:-1;28822:62:0;;28666:624;-1:-1:-1;29274:4:0;28494:803;;;;;;:::o;25076:321::-;25206:18;25212:2;25216:7;25206:5;:18::i;:::-;25257:54;25288:1;25292:2;25296:7;25305:5;25257:22;:54::i;:::-;25235:154;;;;-1:-1:-1;;;25235:154:0;;;;;;;:::i;25733:400::-;-1:-1:-1;;;;;25813:16:0;;25805:61;;;;-1:-1:-1;;;25805:61:0;;24305:2:1;25805:61:0;;;24287:21:1;;;24324:18;;;24317:30;24383:34;24363:18;;;24356:62;24435:18;;25805:61:0;24103:356:1;25805:61:0;23820:4;23844:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23844:16:0;:30;25877:58;;;;-1:-1:-1;;;25877:58:0;;19760:2:1;25877:58:0;;;19742:21:1;19799:2;19779:18;;;19772:30;19838;19818:18;;;19811:58;19886:18;;25877:58:0;19558:352:1;25877:58:0;-1:-1:-1;;;;;26006:13:0;;;;;;:9;:13;;;;;:18;;26023:1;;26006:13;:18;;26023:1;;26006:18;:::i;:::-;;;;-1:-1:-1;;26035:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;26035:21:0;-1:-1:-1;;;;;26035:21:0;;;;;;;;;;25733:400::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:679::-;269:5;322:3;315:4;307:6;303:17;299:27;289:55;;340:1;337;330:12;289:55;376:6;363:20;402:4;426:60;442:43;482:2;442:43;:::i;:::-;426:60;:::i;:::-;508:3;532:2;527:3;520:15;560:2;555:3;551:12;544:19;;595:2;587:6;583:15;647:3;642:2;636;633:1;629:10;621:6;617:23;613:32;610:41;607:61;;;664:1;661;654:12;607:61;686:1;696:169;710:2;707:1;704:9;696:169;;;767:23;786:3;767:23;:::i;:::-;755:36;;811:12;;;;843;;;;728:1;721:9;696:169;;;-1:-1:-1;883:5:1;;215:679;-1:-1:-1;;;;;;;215:679:1:o;899:673::-;953:5;1006:3;999:4;991:6;987:17;983:27;973:55;;1024:1;1021;1014:12;973:55;1060:6;1047:20;1086:4;1110:60;1126:43;1166:2;1126:43;:::i;1110:60::-;1192:3;1216:2;1211:3;1204:15;1244:2;1239:3;1235:12;1228:19;;1279:2;1271:6;1267:15;1331:3;1326:2;1320;1317:1;1313:10;1305:6;1301:23;1297:32;1294:41;1291:61;;;1348:1;1345;1338:12;1291:61;1370:1;1380:163;1394:2;1391:1;1388:9;1380:163;;;1451:17;;1439:30;;1489:12;;;;1521;;;;1412:1;1405:9;1380:163;;1577:675;1629:5;1682:3;1675:4;1667:6;1663:17;1659:27;1649:55;;1700:1;1697;1690:12;1649:55;1736:6;1723:20;1762:4;1786:60;1802:43;1842:2;1802:43;:::i;1786:60::-;1868:3;1892:2;1887:3;1880:15;1920:2;1915:3;1911:12;1904:19;;1955:2;1947:6;1943:15;2007:3;2002:2;1996;1993:1;1989:10;1981:6;1977:23;1973:32;1970:41;1967:61;;;2024:1;2021;2014:12;1967:61;2046:1;2056:167;2070:2;2067:1;2064:9;2056:167;;;2127:21;2144:3;2127:21;:::i;:::-;2115:34;;2169:12;;;;2201;;;;2088:1;2081:9;2056:167;;2257:151;2333:20;;2382:1;2372:12;;2362:40;;2398:1;2395;2388:12;2413:156;2479:20;;2539:4;2528:16;;2518:27;;2508:55;;2559:1;2556;2549:12;2574:186;2633:6;2686:2;2674:9;2665:7;2661:23;2657:32;2654:52;;;2702:1;2699;2692:12;2654:52;2725:29;2744:9;2725:29;:::i;2765:260::-;2833:6;2841;2894:2;2882:9;2873:7;2869:23;2865:32;2862:52;;;2910:1;2907;2900:12;2862:52;2933:29;2952:9;2933:29;:::i;:::-;2923:39;;2981:38;3015:2;3004:9;3000:18;2981:38;:::i;:::-;2971:48;;2765:260;;;;;:::o;3030:328::-;3107:6;3115;3123;3176:2;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3215:29;3234:9;3215:29;:::i;:::-;3205:39;;3263:38;3297:2;3286:9;3282:18;3263:38;:::i;:::-;3253:48;;3348:2;3337:9;3333:18;3320:32;3310:42;;3030:328;;;;;:::o;3363:980::-;3458:6;3466;3474;3482;3535:3;3523:9;3514:7;3510:23;3506:33;3503:53;;;3552:1;3549;3542:12;3503:53;3575:29;3594:9;3575:29;:::i;:::-;3565:39;;3623:2;3644:38;3678:2;3667:9;3663:18;3644:38;:::i;:::-;3634:48;;3729:2;3718:9;3714:18;3701:32;3691:42;;3784:2;3773:9;3769:18;3756:32;-1:-1:-1;;;;;3848:2:1;3840:6;3837:14;3834:34;;;3864:1;3861;3854:12;3834:34;3902:6;3891:9;3887:22;3877:32;;3947:7;3940:4;3936:2;3932:13;3928:27;3918:55;;3969:1;3966;3959:12;3918:55;4005:2;3992:16;4027:2;4023;4020:10;4017:36;;;4033:18;;:::i;:::-;4075:53;4118:2;4099:13;;-1:-1:-1;;4095:27:1;4091:36;;4075:53;:::i;:::-;4062:66;;4151:2;4144:5;4137:17;4191:7;4186:2;4181;4177;4173:11;4169:20;4166:33;4163:53;;;4212:1;4209;4202:12;4163:53;4267:2;4262;4258;4254:11;4249:2;4242:5;4238:14;4225:45;4311:1;4306:2;4301;4294:5;4290:14;4286:23;4279:34;;4332:5;4322:15;;;;;3363:980;;;;;;;:::o;4348:347::-;4413:6;4421;4474:2;4462:9;4453:7;4449:23;4445:32;4442:52;;;4490:1;4487;4480:12;4442:52;4513:29;4532:9;4513:29;:::i;:::-;4503:39;;4592:2;4581:9;4577:18;4564:32;4639:5;4632:13;4625:21;4618:5;4615:32;4605:60;;4661:1;4658;4651:12;4605:60;4684:5;4674:15;;;4348:347;;;;;:::o;4700:254::-;4768:6;4776;4829:2;4817:9;4808:7;4804:23;4800:32;4797:52;;;4845:1;4842;4835:12;4797:52;4868:29;4887:9;4868:29;:::i;:::-;4858:39;4944:2;4929:18;;;;4916:32;;-1:-1:-1;;;4700:254:1:o;4959:348::-;5043:6;5096:2;5084:9;5075:7;5071:23;5067:32;5064:52;;;5112:1;5109;5102:12;5064:52;5152:9;5139:23;-1:-1:-1;;;;;5177:6:1;5174:30;5171:50;;;5217:1;5214;5207:12;5171:50;5240:61;5293:7;5284:6;5273:9;5269:22;5240:61;:::i;5312:595::-;5430:6;5438;5491:2;5479:9;5470:7;5466:23;5462:32;5459:52;;;5507:1;5504;5497:12;5459:52;5547:9;5534:23;-1:-1:-1;;;;;5617:2:1;5609:6;5606:14;5603:34;;;5633:1;5630;5623:12;5603:34;5656:61;5709:7;5700:6;5689:9;5685:22;5656:61;:::i;:::-;5646:71;;5770:2;5759:9;5755:18;5742:32;5726:48;;5799:2;5789:8;5786:16;5783:36;;;5815:1;5812;5805:12;5783:36;;5838:63;5893:7;5882:8;5871:9;5867:24;5838:63;:::i;:::-;5828:73;;;5312:595;;;;;:::o;5912:416::-;6005:6;6013;6066:2;6054:9;6045:7;6041:23;6037:32;6034:52;;;6082:1;6079;6072:12;6034:52;6122:9;6109:23;-1:-1:-1;;;;;6147:6:1;6144:30;6141:50;;;6187:1;6184;6177:12;6141:50;6210:61;6263:7;6254:6;6243:9;6239:22;6210:61;:::i;:::-;6200:71;6318:2;6303:18;;;;6290:32;;-1:-1:-1;;;;5912:416:1:o;6333:245::-;6391:6;6444:2;6432:9;6423:7;6419:23;6415:32;6412:52;;;6460:1;6457;6450:12;6412:52;6499:9;6486:23;6518:30;6542:5;6518:30;:::i;6583:249::-;6652:6;6705:2;6693:9;6684:7;6680:23;6676:32;6673:52;;;6721:1;6718;6711:12;6673:52;6753:9;6747:16;6772:30;6796:5;6772:30;:::i;6837:838::-;6995:6;7003;7011;7019;7027;7080:3;7068:9;7059:7;7055:23;7051:33;7048:53;;;7097:1;7094;7087:12;7048:53;7120:37;7147:9;7120:37;:::i;:::-;7110:47;;7176:38;7210:2;7199:9;7195:18;7176:38;:::i;:::-;7166:48;;7265:2;7254:9;7250:18;7237:32;-1:-1:-1;;;;;7329:2:1;7321:6;7318:14;7315:34;;;7345:1;7342;7335:12;7315:34;7368:59;7419:7;7410:6;7399:9;7395:22;7368:59;:::i;:::-;7358:69;;7480:2;7469:9;7465:18;7452:32;7436:48;;7509:2;7499:8;7496:16;7493:36;;;7525:1;7522;7515:12;7493:36;;7548:63;7603:7;7592:8;7581:9;7577:24;7548:63;:::i;:::-;7538:73;;;7630:39;7664:3;7653:9;7649:19;7630:39;:::i;:::-;7620:49;;6837:838;;;;;;;;:::o;7680:832::-;7838:6;7846;7854;7862;7870;7923:3;7911:9;7902:7;7898:23;7894:33;7891:53;;;7940:1;7937;7930:12;7891:53;7963:37;7990:9;7963:37;:::i;:::-;7953:47;;8019:38;8053:2;8042:9;8038:18;8019:38;:::i;:::-;8009:48;;8108:2;8097:9;8093:18;8080:32;-1:-1:-1;;;;;8172:2:1;8164:6;8161:14;8158:34;;;8188:1;8185;8178:12;8158:34;8211:59;8262:7;8253:6;8242:9;8238:22;8211:59;:::i;:::-;8201:69;;8323:2;8312:9;8308:18;8295:32;8279:48;;8352:2;8342:8;8339:16;8336:36;;;8368:1;8365;8358:12;8336:36;;8391:63;8446:7;8435:8;8424:9;8420:24;8391:63;:::i;:::-;7680:832;;;;-1:-1:-1;7680:832:1;;8501:3;8486:19;8473:33;;7680:832;-1:-1:-1;;;7680:832:1:o;8517:180::-;8576:6;8629:2;8617:9;8608:7;8604:23;8600:32;8597:52;;;8645:1;8642;8635:12;8597:52;-1:-1:-1;8668:23:1;;8517:180;-1:-1:-1;8517:180:1:o;8702:254::-;8770:6;8778;8831:2;8819:9;8810:7;8806:23;8802:32;8799:52;;;8847:1;8844;8837:12;8799:52;8883:9;8870:23;8860:33;;8912:38;8946:2;8935:9;8931:18;8912:38;:::i;8961:250::-;9027:6;9035;9088:2;9076:9;9067:7;9063:23;9059:32;9056:52;;;9104:1;9101;9094:12;9056:52;9140:9;9127:23;9117:33;;9169:36;9201:2;9190:9;9186:18;9169:36;:::i;9216:484::-;9269:3;9307:5;9301:12;9334:6;9329:3;9322:19;9360:4;9389:2;9384:3;9380:12;9373:19;;9426:2;9419:5;9415:14;9447:1;9457:218;9471:6;9468:1;9465:13;9457:218;;;9536:13;;-1:-1:-1;;;;;9532:62:1;9520:75;;9615:12;;;;9650:15;;;;9493:1;9486:9;9457:218;;;-1:-1:-1;9691:3:1;;9216:484;-1:-1:-1;;;;;9216:484:1:o;9705:435::-;9758:3;9796:5;9790:12;9823:6;9818:3;9811:19;9849:4;9878:2;9873:3;9869:12;9862:19;;9915:2;9908:5;9904:14;9936:1;9946:169;9960:6;9957:1;9954:13;9946:169;;;10021:13;;10009:26;;10055:12;;;;10090:15;;;;9982:1;9975:9;9946:169;;10145:444;10196:3;10234:5;10228:12;10261:6;10256:3;10249:19;10287:4;10316:2;10311:3;10307:12;10300:19;;10353:2;10346:5;10342:14;10374:1;10384:180;10398:6;10395:1;10392:13;10384:180;;;10463:13;;10478:4;10459:24;10447:37;;10504:12;;;;10539:15;;;;10420:1;10413:9;10384:180;;10594:257;10635:3;10673:5;10667:12;10700:6;10695:3;10688:19;10716:63;10772:6;10765:4;10760:3;10756:14;10749:4;10742:5;10738:16;10716:63;:::i;:::-;10833:2;10812:15;-1:-1:-1;;10808:29:1;10799:39;;;;10840:4;10795:50;;10594:257;-1:-1:-1;;10594:257:1:o;10856:238::-;10938:1;10931:5;10928:12;10918:143;;10983:10;10978:3;10974:20;10971:1;10964:31;11018:4;11015:1;11008:15;11046:4;11043:1;11036:15;10918:143;11070:18;;10856:238::o;11099:470::-;11278:3;11316:6;11310:13;11332:53;11378:6;11373:3;11366:4;11358:6;11354:17;11332:53;:::i;:::-;11448:13;;11407:16;;;;11470:57;11448:13;11407:16;11504:4;11492:17;;11470:57;:::i;:::-;11543:20;;11099:470;-1:-1:-1;;;;11099:470:1:o;12756:511::-;12950:4;-1:-1:-1;;;;;13060:2:1;13052:6;13048:15;13037:9;13030:34;13112:2;13104:6;13100:15;13095:2;13084:9;13080:18;13073:43;;13152:6;13147:2;13136:9;13132:18;13125:34;13195:3;13190:2;13179:9;13175:18;13168:31;13216:45;13256:3;13245:9;13241:19;13233:6;13216:45;:::i;:::-;13208:53;12756:511;-1:-1:-1;;;;;;12756:511:1:o;13272:459::-;13525:2;13514:9;13507:21;13488:4;13551:56;13603:2;13592:9;13588:18;13580:6;13551:56;:::i;:::-;13655:9;13647:6;13643:22;13638:2;13627:9;13623:18;13616:50;13683:42;13718:6;13710;13683:42;:::i;:::-;13675:50;13272:459;-1:-1:-1;;;;;13272:459:1:o;13736:585::-;14021:2;14010:9;14003:21;13984:4;14047:56;14099:2;14088:9;14084:18;14076:6;14047:56;:::i;:::-;14151:9;14143:6;14139:22;14134:2;14123:9;14119:18;14112:50;14179:44;14216:6;14208;14179:44;:::i;:::-;14171:52;;;-1:-1:-1;;;;;14263:6:1;14259:55;14254:2;14243:9;14239:18;14232:83;13736:585;;;;;;:::o;14326:658::-;14639:3;14628:9;14621:22;14602:4;14666:57;14718:3;14707:9;14703:19;14695:6;14666:57;:::i;:::-;14771:9;14763:6;14759:22;14754:2;14743:9;14739:18;14732:50;14799:44;14836:6;14828;14799:44;:::i;:::-;14791:52;;;14879:6;14874:2;14863:9;14859:18;14852:34;-1:-1:-1;;;;;14926:6:1;14922:55;14917:2;14906:9;14902:18;14895:83;14326:658;;;;;;;:::o;14989:929::-;15208:4;15256:3;15245:9;15241:19;15287:3;15276:9;15269:22;15311:6;15346;15340:13;15377:6;15369;15362:22;15415:3;15404:9;15400:19;15393:26;;15438:6;15435:1;15428:17;15464:4;15454:14;;15504:2;15501:1;15491:16;15525:1;15535:168;15549:6;15546:1;15543:13;15535:168;;;15610:13;;15598:26;;15644:12;;;;15691:1;15679:14;;;;15564:9;15535:168;;;-1:-1:-1;;;15739:18:1;;;15732:34;;;;-1:-1:-1;;;;;;15802:55:1;;;;15797:2;15782:18;;15775:83;15906:4;15894:17;15889:2;15874:18;;;15867:45;15720:3;14989:929;-1:-1:-1;14989:929:1:o;16115:300::-;16300:6;16293:14;16286:22;16275:9;16268:41;16345:2;16340;16329:9;16325:18;16318:30;16249:4;16365:44;16405:2;16394:9;16390:18;16382:6;16365:44;:::i;16420:371::-;16633:6;16626:14;16619:22;16608:9;16601:41;16678:2;16673;16662:9;16658:18;16651:30;16582:4;16698:44;16738:2;16727:9;16723:18;16715:6;16698:44;:::i;:::-;16690:52;;16778:6;16773:2;16762:9;16758:18;16751:34;16420:371;;;;;;:::o;16796:444::-;17037:6;17030:14;17023:22;17012:9;17005:41;17082:3;17077:2;17066:9;17062:18;17055:31;16986:4;17103:45;17143:3;17132:9;17128:19;17120:6;17103:45;:::i;:::-;17179:2;17164:18;;17157:34;;;;-1:-1:-1;17222:2:1;17207:18;17200:34;17095:53;16796:444;-1:-1:-1;;16796:444:1:o;17245:362::-;17442:2;17427:18;;17454:45;17431:9;17481:6;17454:45;:::i;:::-;17542:14;;17535:22;17530:2;17515:18;;17508:50;17589:2;17574:18;17567:34;17245:362;;-1:-1:-1;17245:362:1:o;17612:480::-;17839:3;17824:19;;17852:45;17828:9;17879:6;17852:45;:::i;:::-;17933:6;17928:2;17917:9;17913:18;17906:34;-1:-1:-1;;;;;17980:6:1;17976:55;17971:2;17960:9;17956:18;17949:83;18080:4;18072:6;18068:17;18063:2;18052:9;18048:18;18041:45;17612:480;;;;;;;:::o;18502:219::-;18651:2;18640:9;18633:21;18614:4;18671:44;18711:2;18700:9;18696:18;18688:6;18671:44;:::i;19139:414::-;19341:2;19323:21;;;19380:2;19360:18;;;19353:30;19419:34;19414:2;19399:18;;19392:62;-1:-1:-1;;;19485:2:1;19470:18;;19463:48;19543:3;19528:19;;19139:414::o;21024:427::-;21226:2;21208:21;;;21265:2;21245:18;;;21238:30;21304:34;21299:2;21284:18;;21277:62;21375:33;21370:2;21355:18;;21348:61;21441:3;21426:19;;21024:427::o;21456:490::-;21658:2;21640:21;;;21697:2;21677:18;;;21670:30;21736:34;21731:2;21716:18;;21709:62;21807:34;21802:2;21787:18;;21780:62;-1:-1:-1;;;21873:3:1;21858:19;;21851:53;21936:3;21921:19;;21456:490::o;27432:413::-;27634:2;27616:21;;;27673:2;27653:18;;;27646:30;27712:34;27707:2;27692:18;;27685:62;-1:-1:-1;;;27778:2:1;27763:18;;27756:47;27835:3;27820:19;;27432:413::o;29135:901::-;29541:6;29530:9;29523:25;29557:54;29607:2;29596:9;29592:18;29584:6;29557:54;:::i;:::-;-1:-1:-1;;;;;29651:6:1;29647:55;29642:2;29631:9;29627:18;29620:83;29739:3;29734:2;29723:9;29719:18;29712:31;29504:4;29766:55;29816:3;29805:9;29801:19;29793:6;29766:55;:::i;:::-;29870:9;29862:6;29858:22;29852:3;29841:9;29837:19;29830:51;29898:44;29935:6;29927;29898:44;:::i;:::-;29973:3;29958:19;;29951:35;;;;-1:-1:-1;;30017:3:1;30002:19;29995:35;29890:52;29135:901;-1:-1:-1;;;;;29135:901:1:o;30437:1332::-;30954:4;30983:3;31013:6;31002:9;30995:25;31068:4;31060:6;31056:17;31051:2;31040:9;31036:18;31029:45;31083:54;31133:2;31122:9;31118:18;31110:6;31083:54;:::i;:::-;-1:-1:-1;;;;;31177:6:1;31173:55;31168:2;31157:9;31153:18;31146:83;31266:2;31260:3;31249:9;31245:19;31238:31;31292:54;31342:2;31331:9;31327:18;31319:6;31292:54;:::i;:::-;31278:68;;31395:9;31387:6;31383:22;31377:3;31366:9;31362:19;31355:51;31429:44;31466:6;31458;31429:44;:::i;:::-;31415:58;;31510:6;31504:3;31493:9;31489:19;31482:35;31566:9;31558:6;31554:22;31548:3;31537:9;31533:19;31526:51;31600:44;31637:6;31629;31600:44;:::i;:::-;31586:58;;31693:9;31685:6;31681:22;31675:3;31664:9;31660:19;31653:51;31721:42;31756:6;31748;31721:42;:::i;:::-;31713:50;30437:1332;-1:-1:-1;;;;;;;;;;;;30437:1332:1:o;31963:410::-;32206:4;32198:6;32194:17;32183:9;32176:36;32248:2;32243;32232:9;32228:18;32221:30;32157:4;32268:56;32320:2;32309:9;32305:18;32297:6;32268:56;:::i;32378:616::-;32699:4;32691:6;32687:17;32676:9;32669:36;32741:3;32736:2;32725:9;32721:18;32714:31;32650:4;32768:57;32820:3;32809:9;32805:19;32797:6;32768:57;:::i;:::-;32861:6;32856:2;32845:9;32841:18;32834:34;32916:9;32908:6;32904:22;32899:2;32888:9;32884:18;32877:50;32944:44;32981:6;32973;32944:44;:::i;:::-;32936:52;32378:616;-1:-1:-1;;;;;;;32378:616:1:o;33602:275::-;33673:2;33667:9;33738:2;33719:13;;-1:-1:-1;;33715:27:1;33703:40;;-1:-1:-1;;;;;33758:34:1;;33794:22;;;33755:62;33752:88;;;33820:18;;:::i;:::-;33856:2;33849:22;33602:275;;-1:-1:-1;33602:275:1:o;33882:183::-;33942:4;-1:-1:-1;;;;;33967:6:1;33964:30;33961:56;;;33997:18;;:::i;:::-;-1:-1:-1;34042:1:1;34038:14;34054:4;34034:25;;33882:183::o;34070:128::-;34110:3;34141:1;34137:6;34134:1;34131:13;34128:39;;;34147:18;;:::i;:::-;-1:-1:-1;34183:9:1;;34070:128::o;34203:204::-;34241:3;34277:4;34274:1;34270:12;34309:4;34306:1;34302:12;34344:3;34338:4;34334:14;34329:3;34326:23;34323:49;;;34352:18;;:::i;:::-;34388:13;;34203:204;-1:-1:-1;;;34203:204:1:o;34412:120::-;34452:1;34478;34468:35;;34483:18;;:::i;:::-;-1:-1:-1;34517:9:1;;34412:120::o;34537:168::-;34577:7;34643:1;34639;34635:6;34631:14;34628:1;34625:21;34620:1;34613:9;34606:17;34602:45;34599:71;;;34650:18;;:::i;:::-;-1:-1:-1;34690:9:1;;34537:168::o;34710:125::-;34750:4;34778:1;34775;34772:8;34769:34;;;34783:18;;:::i;:::-;-1:-1:-1;34820:9:1;;34710:125::o;34840:258::-;34912:1;34922:113;34936:6;34933:1;34930:13;34922:113;;;35012:11;;;35006:18;34993:11;;;34986:39;34958:2;34951:10;34922:113;;;35053:6;35050:1;35047:13;35044:48;;;-1:-1:-1;;35088:1:1;35070:16;;35063:27;34840:258::o;35103:136::-;35142:3;35170:5;35160:39;;35179:18;;:::i;:::-;-1:-1:-1;;;35215:18:1;;35103:136::o;35244:178::-;35281:3;35325:4;35318:5;35314:16;35349:7;35339:41;;35360:18;;:::i;:::-;-1:-1:-1;;35396:20:1;;35244:178;-1:-1:-1;;35244:178:1:o;35427:380::-;35506:1;35502:12;;;;35549;;;35570:61;;35624:4;35616:6;35612:17;35602:27;;35570:61;35677:2;35669:6;35666:14;35646:18;35643:38;35640:161;;;35723:10;35718:3;35714:20;35711:1;35704:31;35758:4;35755:1;35748:15;35786:4;35783:1;35776:15;35640:161;;35427:380;;;:::o;35812:197::-;35850:3;35878:6;35919:2;35912:5;35908:14;35946:2;35937:7;35934:15;35931:41;;;35952:18;;:::i;:::-;36001:1;35988:15;;35812:197;-1:-1:-1;;;35812:197:1:o;36014:135::-;36053:3;-1:-1:-1;;36074:17:1;;36071:43;;;36094:18;;:::i;:::-;-1:-1:-1;36141:1:1;36130:13;;36014:135::o;36154:175::-;36191:3;36235:4;36228:5;36224:16;36264:4;36255:7;36252:17;36249:43;;;36272:18;;:::i;:::-;36321:1;36308:15;;36154:175;-1:-1:-1;;36154:175:1:o;36334:112::-;36366:1;36392;36382:35;;36397:18;;:::i;:::-;-1:-1:-1;36431:9:1;;36334:112::o;36451:127::-;36512:10;36507:3;36503:20;36500:1;36493:31;36543:4;36540:1;36533:15;36567:4;36564:1;36557:15;36583:127;36644:10;36639:3;36635:20;36632:1;36625:31;36675:4;36672:1;36665:15;36699:4;36696:1;36689:15;36715:127;36776:10;36771:3;36767:20;36764:1;36757:31;36807:4;36804:1;36797:15;36831:4;36828:1;36821:15;36847:127;36908:10;36903:3;36899:20;36896:1;36889:31;36939:4;36936:1;36929:15;36963:4;36960:1;36953:15;36979:127;37040:10;37035:3;37031:20;37028:1;37021:31;37071:4;37068:1;37061:15;37095:4;37092:1;37085:15;37111:127;37172:10;37167:3;37163:20;37160:1;37153:31;37203:4;37200:1;37193:15;37227:4;37224:1;37217:15;37243:131;-1:-1:-1;;;;;;37317:32:1;;37307:43;;37297:71;;37364:1;37361;37354:12

Swarm Source

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