ETH Price: $3,305.77 (-3.73%)
Gas: 14 Gwei

Token

Wrapped Etherization (WETHZ)
 

Overview

Max Total Supply

270 WETHZ

Holders

127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 WETHZ
0xf1FbE8a2f7c8096eeF5Ecb1B20103A9316135c85
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Wrapper

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

// File: contracts/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: contracts/openzeppelin-contracts/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/openzeppelin-contracts/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: contracts/openzeppelin-contracts/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: contracts/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/openzeppelin-contracts/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/Wrapper.sol

// contracts/Wrapper.sol

pragma solidity ^0.8.10;


interface Cities {
    function cityNames(uint id) external view returns (bytes8);
}

interface Ethz {
    function players(uint id) external view returns (address etherAddress, string memory name, uint treasury,
      uint capitol, uint numCities, uint numUnits, uint lastTimestamp);
    function numCities() external view returns (uint numCities);
    function getCity(uint cityID) external view returns (uint owner, string memory cityName, bool[5] memory buildings,
      uint[10] memory units, uint[2] memory rowcol, int previousID, int nextID);
    function map(uint row, uint col) external view returns (uint playerID);
    function setOwner(uint cityID, uint owner) external;
    function setName(uint cityID, string calldata name) external;
    function setUnit(uint cityID, uint i, uint unitType) external;
    function setPreviousID(uint cityID, int previousID) external;
    function setNextID(uint cityID, int nextID) external;
    function setRowcol(uint cityID, uint[2] calldata rowcol) external;
    function setMap(uint row, uint col, uint ind) external;
    function setBuilding(uint cityID, uint buildingType) external;
    function pushCity() external;
    function setNumCities(uint nc) external;
}

contract Wrapper is ERC721Enumerable, Ownable {
    
    //0.88 eth
    uint256 public mintAmount = 880000000000000000;
    
    address payable public vault1 = payable(0x32792cC3aeb2e796202Ad830C5184feD849d76dA);
    address payable public vault2 = payable(0x04329C5aE62fe7A4B1e5ee8fD5B99E861934f105);
    address payable public vault3 = payable(0xd73F16f12117a08492097C0C1cD0f10Cf0bBc1e4);
    address payable public vault4 = payable(0x364762CA0e5922Aa64c102EB8F0602ffA9123a0D);

    //list of frontend (ideally ipfs or other decentral storage) URIs
    string[] fe;
    Ethz public base;
    address public baseAddress = address(0xb40d0312BaC389AE0a05053020Aac80c9237358B);
    Cities public cities;
    address public citiesAddress = address(0xcbA79e9e16Ae2C5DFdBCE9ed169a06057B3BD2A1);
    //tokenIds on the map
    uint16[34][34] public nfts;
    //cityIds+1 from base contract on the map
    uint16[34][34] public map;
    //tokenId to row, col
    mapping(uint => uint[2]) public position;
    mapping(uint16 => uint16) public tokenIdToCityId;
    //tokenId to city buildings
    mapping(uint16 => bool[5]) public idToBuildings;
    //tokens per quadrant, for north-west quadrant less are available (289-49=240) as 49 (numCitiesOriginal) already exist
    uint16 tokensPerQuadrant = 289;
    //number of cities already existing in the base contract.
    //WARNING !!! IF CHANGED change initCounters method
    uint16 numCitiesOriginal = 49;
    //tokenId counters for civ types (1st dimension), building types (2nd dimension)
    uint16[4][4] public counters;
    //tokenId counter limits for civ types (1st dimension), building types (2nd dimension)
    uint16[4][4] counterLimits;
    //mapping of 0,1,2,3 (farm, stables, woodworks, metalworks) to original base contract codes
    uint16[] buildingTypes = [1, 4, 2, 3];

    /*uint16 public jG;
    uint16 public uG;
    uint16 public offsetG;*/



    constructor() ERC721("Wrapped Etherization", "WETHZ") {
        //fe.push("ipfs://somehash");
        base = Ethz(baseAddress);
        cities = Cities(citiesAddress);
        _initMap();
        _initIdToBuildings();
        _initCounters();
    }

    function sweep() public {
        require(msg.sender == owner() || msg.sender == vault1 ||
            msg.sender == vault2 || msg.sender == vault3 ||
            msg.sender == vault4);
        
        uint256 balance = address(this).balance;

        vault1.transfer(balance*650/1000);
        vault2.transfer(balance*100/1000);
        vault3.transfer(balance*125/1000);
        //vault4.transfer(balance*125/1000);
        vault4.transfer(address(this).balance);
    }

    //helper method for users to decode the city owner uint in base contract back to the address
    function uint160ToAddress(uint160 x) public pure returns (address) {
        return address(x);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://Qmank3UwrGWAoQbRxRCimKw7kdhgu2utUe1AGRr9zzz3bF/";
        //return "";
    }

    function contractURI() public pure returns (string memory) {
        return "ipfs://Qmdb7xp5YJWdLrVei6vnnhdV5EyrBx5Pdt4VXXoexA5QoW";
        //return "";
    }

    function getFrontend(uint version) public view returns (string memory) {
        return fe[version];
    }

    function getFrontendListLength() public view returns (uint) {
        return fe.length;
    }

    function addFrontend(string calldata uri) public onlyOwner {
        fe.push(uri);
    }

    function getMap() public view returns (uint16[34][34] memory) {
        return map;
    }
    
    function getNfts() public view returns (uint16[34][34] memory) {
        return nfts;
    }

    //if start method was used in the base contract, allow map update in the wrapper
    function setMap(uint16 cityId) public onlyOwner {
        uint[2] memory rowcol;
        (,,,,rowcol,,) = base.getCity(cityId);
        map[rowcol[0]][rowcol[1]] = cityId+1;
    }

    function wrap(uint16 cityId) public {
        uint owner;
        uint[2] memory rowcol;
        address ownerAddress;

        require(cityId < numCitiesOriginal);

        (owner,,,,rowcol,,) = base.getCity(cityId);

        //check if already wrapped
        require(nfts[rowcol[0]][rowcol[1]] == 0);

        (ownerAddress,,,,,,) = base.players(owner);
        //check that the city owner is msg.sender
        require(ownerAddress == msg.sender);

        base.setOwner(cityId, uint256(uint160(msg.sender)));
        (owner,,,,,,) = base.getCity(cityId);
        //check that writing to the base contract succeeded
        require(owner == uint256(uint160(msg.sender)));

        tokenIdToCityId[cityId+1] = cityId;
        position[cityId+1] = rowcol;
        nfts[rowcol[0]][rowcol[1]] = cityId+1;
        _mint(msg.sender, cityId+1);
    }

    
    //for cities built using base contract start method but not in the historic set
    function wrapNew(uint16 cityId) public {
        //token id
        uint16 id;
        //counter row (civ type)
        uint16 i;
        //offset that indexes token counter's 2nd dimension (building type)
        uint16 offset;
        uint owner;
        uint[2] memory rowcol;
        address ownerAddress;

        require(cityId >= numCitiesOriginal);

        (owner,,,,rowcol,,) = base.getCity(cityId);

        //check if already wrapped
        require(nfts[rowcol[0]][rowcol[1]] == 0);

        (ownerAddress,,,,,,) = base.players(owner);
        //check that the city owner is msg.sender
        require(ownerAddress == msg.sender);

        i = _quadrantFromRowCol(rowcol[0], rowcol[1]);
        offset = _randomOffset(i);
        
        id = counters[i][offset];
        counters[i][offset]++;

        base.setOwner(cityId, uint256(uint160(msg.sender)));
        base.setName(cityId, string(abi.encodePacked(cities.cityNames(id))));
        base.setBuilding(cityId, buildingTypes[offset]);
        (owner,,,,,,) = base.getCity(cityId);
        //check that writing to the base contract succeeded
        require(owner == uint256(uint160(msg.sender)));

        idToBuildings[id] = [false, false, false, false, false];
        idToBuildings[id][offset] = true;

        tokenIdToCityId[id] = cityId;
        position[id] = rowcol;
        nfts[rowcol[0]][rowcol[1]] = id;
        map[rowcol[0]][rowcol[1]] = cityId+1;

        _mint(msg.sender, id);

    }
    
    function mint(uint row, uint col)
        public payable returns (uint256)
    {
        //token id
        uint16 id;
        uint cityId;
        //counter row (civ type)
        uint16 i;
        //offset that indexes token counter's 2nd dimension (building type)
        uint16 offset;

        require(msg.value == mintAmount);

        //require that the tile is empty
        require(nfts[row][col] == 0 && map[row][col] == 0);
        require(base.map(row, col) == 0);

        i = _quadrantFromRowCol(row, col);
        offset = _randomOffset(i);
        
        id = counters[i][offset];
        counters[i][offset]++;

        cityId = base.numCities();
        base.pushCity();
        base.setOwner(cityId, uint256(uint160(msg.sender)));
        base.setName(cityId, string(abi.encodePacked(cities.cityNames(id))));
        base.setUnit(cityId, 0, 1);
        base.setRowcol(cityId, [row,col]);
        base.setPreviousID(cityId, -1);
        base.setNextID(cityId, -1);
        base.setMap(row, col, cityId+1);
        base.setBuilding(cityId, buildingTypes[offset]);
        base.setNumCities(cityId+1);
        //check that writing to the base contract was successful
        require(base.numCities() > cityId);

        idToBuildings[id] = [false, false, false, false, false];
        idToBuildings[id][offset] = true;

        tokenIdToCityId[id] = uint16(cityId);
        position[id] = [row, col];
        nfts[row][col] = id;
        map[row][col] = uint16(cityId+1);

        _mint(msg.sender, id);

        return id;
    }

    function _quadrantFromRowCol(uint row, uint col) internal pure returns (uint16) {
        uint16 i;

        if(row >= 0 && col >= 0 && row <= 16 && col <= 16) {
            i = 0;
        } else if(row >= 0 && col >= 17 && row <= 16 && col <= 34) {
            i = 1;
        } else if(row >= 17 && col >= 17 && row <= 34 && col <= 34) {
            i = 2;
        } else if(row >= 17 && col >= 0 && row <= 34 && col <= 16) {
            i = 3;
        } else {
            revert();
        }
        return i;
    }

    //i = counter row (quadrant, ie civ type)
    function _randomOffset(uint16 i) internal view returns (uint16) {
        uint ran;
        //counter column (building type)
        uint16 j;
        //if no more available cities with this building, offset with u to another city-building list
        uint16 u;
        //total offset is (j+u)%4
        uint16 offset;

        /* Randomly generate tokenId */
        //counter column -> random
        ran = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        ran = ran % 100;
        if(ran < 10) {
            //metalworks
            j = 3;
        } else if(ran >= 10 && ran < 30) {
            //woodworks
            j = 2;
        } else if(ran >= 30 && ran < 58) {
            //stables
            j = 1;
        } else if(ran >= 58 && ran < 100) {
            //farm
            j = 0;
        } else {
            revert();
        }
        //if col filled (no more cities with this building type),
        //for loop +1 to +3, modulo 4, to get counter col
        for(u = 0; u <= 3; u++) {
            offset = (j + u) % 4;
            if(counters[i][offset] <= counterLimits[i][offset]) {
                break;
            }
        }
        //all cities taken (no free cities in any building-type counter lists)
        if(u > 3) {
            revert();
        }

        /*jG = j;
        uG = u;
        offsetG = offset;*/

        return offset;
    }

    function _initMap() internal {
        map[10][10] = 1;
        map[10][9] = 2;
        map[11][9] = 3;
        map[9][8] = 4;
        map[10][8] = 5;
        map[11][7] = 6;
        map[9][7] = 7;
        map[8][6] = 8;
        map[8][7] = 9;
        map[7][8] = 10;
        map[6][8] = 11;
        map[5][7] = 12;
        map[7][9] = 13;
        map[11][10] = 14;
        map[8][9] = 15;
        map[6][7] = 16;
        map[7][5] = 17;
        map[8][8] = 18;
        map[8][10] = 19;
        map[7][4] = 20;
        map[11][8] = 21;
        map[11][11] = 22;
        map[6][6] = 23;
        map[6][9] = 24;
        map[7][6] = 25;
        map[12][7] = 26;
        map[13][6] = 27;
        map[10][7] = 28;
        map[13][5] = 29;
        map[12][6] = 30;
        map[12][5] = 31;
        map[13][7] = 32;
        map[5][9] = 33;
        map[5][8] = 34;
        map[8][11] = 35;
        map[7][3] = 36;
        map[9][11] = 37;
        map[5][6] = 38;
        map[4][6] = 39;
        map[8][4] = 40;
        map[13][4] = 41;
        map[14][6] = 42;
        map[7][12] = 43;
        map[6][2] = 44;
        map[5][2] = 45;
        map[6][3] = 46;
        map[7][7] = 47;
        map[4][8] = 48;
        map[6][5] = 49;
    }

    function _initIdToBuildings() internal {
        idToBuildings[1] = [true,true,false,false,true];
        idToBuildings[2] = [false,true,false,false,true];
        idToBuildings[3] = [true,false,false,false,true];
        idToBuildings[4] = [false,false,false,false,true];
        idToBuildings[5] = [false,false,false,false,true];
        idToBuildings[6] = [false,false,false,false,false];
        idToBuildings[7] = [false,false,false,false,false];
        idToBuildings[8] = [false,false,false,false,false];
        idToBuildings[9] = [false,false,false,false,false];
        idToBuildings[10] = [true,false,false,false,true];
        idToBuildings[11] = [false,true,false,true,false];
        idToBuildings[12] = [false,true,false,false,false];
        idToBuildings[13] = [false,false,false,false,false];
        idToBuildings[14] = [true,true,true,false,true];
        idToBuildings[15] = [false,false,false,true,false];
        idToBuildings[16] = [true,false,false,false,true];
        idToBuildings[17] = [false,false,false,false,true];
        idToBuildings[18] = [true,false,false,false,false];
        idToBuildings[19] = [true,true,true,true,true];
        idToBuildings[20] = [true,true,true,true,true];
        idToBuildings[21] = [false,false,false,false,true];
        idToBuildings[22] = [true,true,false,true,true];
        idToBuildings[23] = [true,false,false,false,false];
        idToBuildings[24] = [false,false,true,false,false];
        idToBuildings[25] = [false,false,false,false,false];
        idToBuildings[26] = [false,false,false,false,false];
        idToBuildings[27] = [false,false,false,false,false];
        idToBuildings[28] = [false,false,false,false,false];
        idToBuildings[29] = [false,false,false,false,false];
        idToBuildings[30] = [false,false,false,false,false];
        idToBuildings[31] = [false,false,false,false,false];
        idToBuildings[32] = [false,false,false,false,false];
        idToBuildings[33] = [false,false,true,true,false];
        idToBuildings[34] = [false,true,true,false,true];
        idToBuildings[35] = [true,true,true,true,true];
        idToBuildings[36] = [true,true,true,true,true];
        idToBuildings[37] = [true,true,true,true,true];
        idToBuildings[38] = [false,false,false,false,false];
        idToBuildings[39] = [false,false,true,false,false];
        idToBuildings[40] = [false,false,false,false,false];
        idToBuildings[41] = [false,false,false,false,false];
        idToBuildings[42] = [false,false,false,false,false];
        idToBuildings[43] = [true,false,false,false,false];
        idToBuildings[44] = [false,false,false,false,true];
        idToBuildings[45] = [false,false,false,false,false];
        idToBuildings[46] = [false,false,false,false,false];
        idToBuildings[47] = [false,false,false,false,false];
        idToBuildings[48] = [false,false,false,false,false];
        idToBuildings[49] = [false,false,false,false,false];
    }

    //initialize the tokenId counters based on building rarity % 
    function _initCounters() internal {
        //QUADRANT1
        //1-49 taken
        counters[0][0] = 50;
        counterLimits[0][0] = 147;
        counters[0][1] = 148;
        counterLimits[0][1] = 216;
        counters[0][2] = 217;
        counterLimits[0][2] = 264;
        counters[0][3] = 265;
        counterLimits[0][3] = 289;
        //QUADRANT2
        counters[1][0] = 290;
        counterLimits[1][0] = 410;
        counters[1][1] = 411;
        counterLimits[1][1] = 491;
        counters[1][2] = 492;
        counterLimits[1][2] = 549;
        counters[1][3] = 550;
        counterLimits[1][3] = 578;
        //QUADRANT3
        counters[2][0] = 579;
        counterLimits[2][0] = 699;
        counters[2][1] = 700;
        counterLimits[2][1] = 780;
        counters[2][2] = 781;
        counterLimits[2][2] = 838;
        counters[2][3] = 839;
        counterLimits[2][3] = 867;
        //QUADRANT4
        counters[3][0] = 868;
        counterLimits[3][0] = 988;
        counters[3][1] = 989;
        counterLimits[3][1] = 1069;
        counters[3][2] = 1070;
        counterLimits[3][2] = 1127;
        counters[3][3] = 1128;
        counterLimits[3][3] = 1156;
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        base.setOwner(tokenIdToCityId[uint16(tokenId)], uint256(uint160(to)));
        super._transfer(from, to, tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"addFrontend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"contract Ethz","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cities","outputs":[{"internalType":"contract Cities","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"citiesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"counters","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"version","type":"uint256"}],"name":"getFrontend","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFrontendListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMap","outputs":[{"internalType":"uint16[34][34]","name":"","type":"uint16[34][34]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNfts","outputs":[{"internalType":"uint16[34][34]","name":"","type":"uint16[34][34]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToBuildings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"map","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"row","type":"uint256"},{"internalType":"uint256","name":"col","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nfts","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"position","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"cityId","type":"uint16"}],"name":"setMap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"tokenIdToCityId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"x","type":"uint160"}],"name":"uint160ToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"vault1","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault2","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault3","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault4","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"cityId","type":"uint16"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"cityId","type":"uint16"}],"name":"wrapNew","outputs":[],"stateMutability":"nonpayable","type":"function"}]

670c3663566a580000600b55600c80546001600160a01b03199081167332792cc3aeb2e796202ad830c5184fed849d76da17909155600d805482167304329c5ae62fe7a4b1e5ee8fd5b99e861934f105179055600e8054821673d73f16f12117a08492097c0c1cd0f10cf0bbc1e4179055600f8054821673364762ca0e5922aa64c102eb8f0602ffa9123a0d17905560128054821673b40d0312bac389ae0a05053020aac80c9237358b1790556014805490911673cba79e9e16ae2c5dfdbce9ed169a06057b3bd2a117905560e480546231012163ffffffff1990911617905561010060405260016080908152600460a0819052600260c052600360e0526200010b9160ed9162001860565b503480156200011957600080fd5b50604080518082018252601481527f57726170706564204574686572697a6174696f6e0000000000000000000000006020808301918252835180850190945260058452642ba2aa242d60d91b9084015281519192916200017c916000916200190f565b508051620001929060019060208401906200190f565b505050620001af620001a96200020560201b60201c565b62000209565b601254601180546001600160a01b039283166001600160a01b03199182161790915560145460138054919093169116179055620001eb6200025b565b620001f56200046e565b620001ff620017ae565b62001a65565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60998054609c8054609680546093805460908054608d8054608a8054600160701b600160c01b0319909a167616000e000300150006000000000000000000000000000017909a55609f805460a28054600160701b600160b01b0319909e16740100020005001c000000000000000000000000000017909e5565ffffffffffff60501b19166e1a001e001f0000000000000000000017905569ffff00000000ffffffff60701b19909616762500000000000400070000000000000000000000000000179096556087805463ffff000160401b600160c01b031990941676230013000f00120009000800000028000000000000000017909455600160401b600160801b03199098166e20001b001d002900000000000000001790985560a5805461ffff60601b19166c2a00000000000000000000000017905567ffffffffffff000160201b600160a01b031990941672210022000c0026000000000000002d000000001790945567ffffffff0000000160201b600160a01b0319167218000b0010001700000000002e002c00000000178155600160301b65ffff0000000160a01b0319909316782b00000000000d000a002f00190011001400240000000000001790935565ffff0000ffff60601b199092167030000000270000000000000000000000001790915560319060055b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550565b6040805160a0810182526001808252602080830182905260009383018490526060830184905260808301829052925260e3909152620004d1907fa71a5dc6523a2d0bf383648e732f9cbd05fb5cd75a9c44758106b038b320de369060056200198c565b506040805160a0810182526000808252600160208084018290529383018290526060830182905260808301526002905260e390915262000535907f943c16c606a37eaf2ffde50503ea170bf4838709828ded1135a1486c90b7e0ee9060056200198c565b506040805160a0810182526001808252600060208084018290529383018190526060830181905260808301919091526003905260e39091526200059c907f16856fcf46d514fe62f26b23afa013e951c313a821ce2c3eaba8a78d946060a89060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052600160808301526004905260e390915262000600907f7f84c93ccfe82de4803f900144a81b2660ffe15f75cd8fd5ba5ab2f905ff42ad9060056200198c565b506040805160a08101825260008082526020808301829052928201819052606082018190526001608083015260059081905260e390925262000665917f74e02ac768ba95f31cc7ee85084dac4ca98eb0c0d78fac82a19122bef3da287191906200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526006905260e3909152620006c9907f6c018b601a16f086638c20e65b88024b8e0738f991620eeb5d25da0082d6855a9060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526007905260e39091526200072d907ffc714b7aaa86d083f894a9b9c04fcc6d3a5326923233a8365f5ce62460a991369060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526008905260e390915262000791907f60912091ba2cfac66e10e43d564909f588706b26b1c2cee61a973793316811269060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526009905260e3909152620007f5907f92bffc76e530dc1ac768f3ca18bc73e58512b47196d34be926e4bbb5531d5d749060056200198c565b506040805160a081018252600180825260006020808401829052938301819052606083018190526080830191909152600a905260e39091526200085c907fe2f6c6baae659acb0b62a8b73f953f318876561834b67c6f03abe5d3bb2e54c19060056200198c565b506040805160a081018252600080825260016020808401829052938301829052606083015260808201819052600b905260e3909152620008c0907f211d04354a217436d0a7ade6183ec1576920df6744f873779a238582d47ce9cc9060056200198c565b506040805160a081018252600080825260016020808401919091529282018190526060820181905260808201819052600c905260e390915262000927907f0d3fdd8ab8db2698a53a93c64c333188532ae1b20d839ff4d904ad8a406725029060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052600d905260e39091526200098b907f39f80eeb99164b2061bb2db9150ad34c13581a5cd5259449365f5390118075d59060056200198c565b506040805160a081018252600180825260208083018290529282018190526000606083018190526080830191909152600e905260e3909152620009f2907ff3d465115b8b8834cf1a3207c1af451cc97cd6a7ac07d224f01a5e0a383403459060056200198c565b506040805160a081018252600080825260208083018290529282018190526001606083015260808201819052600f905260e390915262000a56907fe63d68043721453462b2ab1914471aa33063a98e99c12f688f80bef30c3bc8179060056200198c565b506040805160a0810182526001808252600060208084018290529383018190526060830181905260808301919091526010905260e390915262000abd907f11afd47bcb3341e3eda6327648cd117a372958fa6e09ab9c0a16306a45aff6879060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052600160808301526011905260e390915262000b21907ff9d756aa33b4ff1dc49f5aebafd835a68c6dfe3811b9b023d437e67845b9bf3b9060056200198c565b506040805160a081018252600181526000602080830182905292820181905260608201819052608082018190526012905260e390915262000b86907f764386b17e2f046b9f28bdb3dce7d25ae056929ab0cfa9ef163c64990d8589679060056200198c565b506040805160a08101825260018082526020808301829052928201819052606082018190526080820152601360005260e390915262000be9907f9355eb32246b2c0a9cf2260fd72312bdba9209f29e40dee49f555f719a4822899060056200198c565b506040805160a08101825260018082526020808301829052928201819052606082018190526080820152601460005260e390915262000c4c907f2f8053a19baeae52462a938cece126edc12f4fd59dca80450b9258a9e42919e99060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052600160808301526015905260e390915262000cb0907f2a4fc86be93cf943019c32a1f37be8bd8377548e948cf3e2e70cb7b3231bfc049060056200198c565b506040805160a081018252600180825260208083018290526000938301849052606083018290526080830191909152601690925260e390915262000d18907fb73cc3a4d6c7895755163039b76eb8a7f2609b4cab233ffbebdb188fca547f2d9060056200198c565b506040805160a081018252600181526000602080830182905292820181905260608201819052608082018190526017905260e390915262000d7d907f82001648842a1ee9d4e2da64bc2a6e786efcab5f1cb33d994f4e8ef5e41502c59060056200198c565b506040805160a0810182526000808252602080830182905260019383019390935260608201819052608082018190526018905260e390915262000de4907f80a6fe475934373ba63846eab58edb2e29be11cb54f1d4ac6c409df23c8c67089060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526019905260e390915262000e48907f927c5587e4c2f7cafecf28a0256c0c067182600245e6bef00624129d2215ff6e9060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601a905260e390915262000eac907f9a68d56a8b85ecb18848fc6859399f9310885421862d5c2dfb5bc24d9e514f919060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601b905260e390915262000f10907f3072c7cac17b6e35941800da3ee3878ca8d9a9878c0c6f5945c2efe6cc81685f9060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601c905260e390915262000f74907ff04d751661ab3f9339c14a941444e85bf67c2ebec154f91f89813128336b02789060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601d905260e390915262000fd8907f2a5017da524dd7822031ac6dc039834619f34f3812a9d96a716cb8c2be873fed9060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601e905260e39091526200103c907f5c85ccf91f8445c28e07848269033bf3428732ffaad2b93330dfd246f91741819060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052601f905260e3909152620010a0907f7f458ebb93be496d2a48674697070f7b3ecccae30cb01cca06a3d8c95714aa779060056200198c565b506040805160a08101825260008082526020808301829052928201819052606082018190526080820181905282905260e390915262001103907f4248609f0187a8eb309af6b46a42157aa40f08893a891cf2d34a8036c0e59f5a9060056200198c565b506040805160a0810182526000808252602080830182905260019383018490526060830193909352608082018190526021905260e39091526200116a907f560eb0e54da9b98bc57ee94e44f8f572f5c8fdc68e76f8ba0c41ce40940bbe239060056200198c565b506040805160a0810182526000808252600160208084018290529383018190526060830182905260808301526022905260e3909152620011ce907f4258296beb95db1482e351cf8e40986335211f72b51807761de2ca4ede239b669060056200198c565b506040805160a08101825260018082526020808301829052928201819052606082018190526080820152602360005260e390915262001231907f113912be2a3a901aa7a63f0af218aed1186ec67b41b2459f65433a4220f50d9f9060056200198c565b506040805160a08101825260018082526020808301829052928201819052606082018190526080820152602460005260e390915262001294907fc14bd4fffa52b6e8b865370c2eb7c1b763207ce8c221b2482055f68dae00caf69060056200198c565b506040805160a08101825260018082526020808301829052928201819052606082018190526080820152602560005260e3909152620012f7907f749c5300410f70e44e20d3d4336c42021892606fc47bfc74346e71af78e6fe389060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526026905260e39091526200135b907f47273734f944954dba34c32d6ab28a85457eb756a2d92db2e5731fc0c73c623f9060056200198c565b506040805160a0810182526000808252602080830182905260019383019390935260608201819052608082018190526027905260e3909152620013c2907fda8b9c8111004612917ef01185426a329fbb81093c0735341adb63f53ec61d089060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526028905260e390915262001426907f8e602efdc52dec0f4596bcb5882be56ce633de87b433ec99f5dbcfcc3a6b289d9060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526029905260e39091526200148a907f4be8486ac8cc7c6e97c2f446511e19b36aad2771310bea33221a883610cad8169060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052602a905260e3909152620014ee907f187721be7c5eb18b34307658918717950fd0800c108fd22d2ed57d5ae86adf4b9060056200198c565b506040805160a08101825260018152600060208083018290529282018190526060820181905260808201819052602b905260e390915262001553907ff7f382c37163068a662df27d82e49161f5e7f00e3ee460ff8520d2ff44deef589060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260016080830152602c905260e3909152620015b7907fedd80d49b40922f0aa168c0e03ef5445f801f14002da397d249818bd785f6dc99060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052602d905260e39091526200161b907f845f03ca94a8d593567c341d873f9b34156c151773370936eae4e057be7ca62c9060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052602e905260e39091526200167f907fa048545e78b76788c4d846cadb2f19e3e4c77c5be0d3dc2934a32eb6167e15469060056200198c565b506040805160a081018252600080825260208083018290529282018190526060820181905260808201819052602f905260e3909152620016e3907fa1aa874950af0892763603874587cc842f87ef4d283d04ab49b24056506a5d8b9060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526030905260e390915262001747907fa21a1b0253eac7b3b79f3aa3d33d0f7c2cee678440386589ef029f7c21c3066b9060056200198c565b506040805160a0810182526000808252602080830182905292820181905260608201819052608082018190526031905260e3909152620017ab907f7f0975397cdd87d7b876e2212ba483bbe621c399fe5d85f48eacbf0cacecc0e19060056200198c565b50565b60e5805460e980546001600160401b031992831667010900d90094003217909355918116670121010800d800931790915560e6805460ea805491841667022601ec019b0122179092558216670242022501eb019a17905560e7805460eb8054918416670347030d02bc02431790925582166703630346030c02bb17905560e8805460ec805465ffffffffffff1916650467042d03dc1781559216670468042e03dd036417905561048490600362000447565b82805482825590600052602060002090600f01601090048101928215620018fd5791602002820160005b83821115620018cb57835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200188a565b8015620018fb5782816101000a81549061ffff0219169055600201602081600101049283019260010302620018cb565b505b506200190b92915062001a11565b5090565b8280546200191d9062001a28565b90600052602060002090601f016020900481019282620019415760008555620018fd565b82601f106200195c57805160ff1916838001178555620018fd565b82800160010185558215620018fd579182015b82811115620018fd5782518255916020019190600101906200196f565b600183019183908215620018fd5791602002820160005b83821115620019e257835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302620019a3565b8015620018fb5782816101000a81549060ff0219169055600101602081600001049283019260010302620019e2565b5b808211156200190b576000815560010162001a12565b600181811c9082168062001a3d57607f821691505b6020821081141562001a5f57634e487b7160e01b600052602260045260246000fd5b50919050565b6142e88062001a756000396000f3fe60806040526004361061027d5760003560e01c806370a082311161014f578063ad3de14c116100c1578063d8cb55e31161007a578063d8cb55e314610793578063e8a3d485146107a8578063e985e9c5146107bd578063f2fde38b14610806578063f349af8614610826578063fbe706fd1461084657600080fd5b8063ad3de14c146106c0578063b5b82e7b146106e2578063b88d4fde14610702578063c87b56dd14610722578063c9d87e6914610742578063d62e24e01461076257600080fd5b80639bec62c9116101135780639bec62c91461060b5780639cc84cb51461062b5780639f7d034e1461064b578063a22cb4651461066b578063a2ef381c1461068b578063a90b9128146106a057600080fd5b806370a0823114610583578063715018a6146105a35780638da5cb5b146105b85780638e130386146105d657806395d89b41146105f657600080fd5b80632f745c59116101f35780635001f3b5116101ac5780635001f3b5146104cd5780635a2bcc18146104ed5780635b7126b4146105035780635d7e1c12146105235780635dfe52e7146105435780636352211e1461056357600080fd5b80632f745c5914610405578063343843941461042557806335faa4161461044557806336e5df3f1461045a57806342842e0e1461048d5780634f6ccce7146104ad57600080fd5b806311f558891161024557806311f558891461035357806315ee73d11461037357806318160ddd146103935780631b2ef1ca146103b25780631b2f3b4b146103c557806323b872dd146103e557600080fd5b806301ffc9a7146102825780630589a478146102b757806306fdde03146102ef578063081812fc14610311578063095ea7b314610331575b600080fd5b34801561028e57600080fd5b506102a261029d3660046137fd565b610864565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506012546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102ae565b3480156102fb57600080fd5b5061030461088f565b6040516102ae9190613872565b34801561031d57600080fd5b506102d761032c366004613885565b610921565b34801561033d57600080fd5b5061035161034c3660046138b3565b6109bb565b005b34801561035f57600080fd5b506014546102d7906001600160a01b031681565b34801561037f57600080fd5b50600f546102d7906001600160a01b031681565b34801561039f57600080fd5b506008545b6040519081526020016102ae565b6103a46103c03660046138df565b610ad1565b3480156103d157600080fd5b506103a46103e03660046138df565b611470565b3480156103f157600080fd5b50610351610400366004613901565b611495565b34801561041157600080fd5b506103a46104203660046138b3565b6114c6565b34801561043157600080fd5b50610304610440366004613885565b61155c565b34801561045157600080fd5b5061035161160b565b34801561046657600080fd5b5061047a6104753660046138df565b6117a6565b60405161ffff90911681526020016102ae565b34801561049957600080fd5b506103516104a8366004613901565b6117e9565b3480156104b957600080fd5b506103a46104c8366004613885565b611804565b3480156104d957600080fd5b506011546102d7906001600160a01b031681565b3480156104f957600080fd5b506103a4600b5481565b34801561050f57600080fd5b506102a261051e366004613959565b611897565b34801561052f57600080fd5b5061035161053e366004613975565b6118d0565b34801561054f57600080fd5b5061047a61055e3660046138df565b611c51565b34801561056f57600080fd5b506102d761057e366004613885565b611c70565b34801561058f57600080fd5b506103a461059e366004613990565b611ce7565b3480156105af57600080fd5b50610351611d6e565b3480156105c457600080fd5b50600a546001600160a01b03166102d7565b3480156105e257600080fd5b50600d546102d7906001600160a01b031681565b34801561060257600080fd5b50610304611da4565b34801561061757600080fd5b50600c546102d7906001600160a01b031681565b34801561063757600080fd5b506103516106463660046139ad565b611db3565b34801561065757600080fd5b50610351610666366004613975565b611e1a565b34801561067757600080fd5b50610351610686366004613a2d565b611f32565b34801561069757600080fd5b506010546103a4565b3480156106ac57600080fd5b5061047a6106bb3660046138df565b611f3d565b3480156106cc57600080fd5b506106d5611f4d565b6040516102ae9190613a66565b3480156106ee57600080fd5b506103516106fd366004613975565b611fe3565b34801561070e57600080fd5b5061035161071d366004613b64565b61268a565b34801561072e57600080fd5b5061030461073d366004613885565b6126bc565b34801561074e57600080fd5b506013546102d7906001600160a01b031681565b34801561076e57600080fd5b5061047a61077d366004613975565b60e26020526000908152604090205461ffff1681565b34801561079f57600080fd5b506106d5612797565b3480156107b457600080fd5b50610304612824565b3480156107c957600080fd5b506102a26107d8366004613c13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081257600080fd5b50610351610821366004613990565b612844565b34801561083257600080fd5b50600e546102d7906001600160a01b031681565b34801561085257600080fd5b506102d7610861366004613990565b90565b60006001600160e01b0319821663780e9d6360e01b14806108895750610889826128df565b92915050565b60606000805461089e90613c41565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca90613c41565b80156109175780601f106108ec57610100808354040283529160200191610917565b820191906000526020600020905b8154815290600101906020018083116108fa57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661099f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109c682611c70565b9050806001600160a01b0316836001600160a01b03161415610a345760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610996565b336001600160a01b0382161480610a505750610a5081336107d8565b610ac25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610996565b610acc838361292f565b505050565b6000806000806000600b543414610ae757600080fd5b60158760228110610afa57610afa613c7c565b600302018660228110610b0f57610b0f613c7c565b601081049190910154600f9091166002026101000a900461ffff16158015610b775750607b8760228110610b4557610b45613c7c565b600302018660228110610b5a57610b5a613c7c565b601081049190910154600f9091166002026101000a900461ffff16155b610b8057600080fd5b601154604051631521722560e31b815260048101899052602481018890526001600160a01b039091169063a90b912890604401602060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf49190613c92565b15610bfe57600080fd5b610c08878761299d565b9150610c1382612a5c565b905060e58261ffff1660048110610c2c57610c2c613c7c565b018161ffff1660048110610c4257610c42613c7c565b601091828204019190066002029054906101000a900461ffff16935060e58261ffff1660048110610c7557610c75613c7c565b018161ffff1660048110610c8b57610c8b613c7c565b6010918282040191900660020281819054906101000a900461ffff1680929190610cb490613cc1565b91906101000a81548161ffff021916908361ffff16021790555050601160009054906101000a90046001600160a01b03166001600160a01b03166324b5c1346040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190613c92565b9250601160009054906101000a90046001600160a01b03166001600160a01b0316630eb495c26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d9857600080fd5b505af1158015610dac573d6000803e3d6000fd5b5050601154604051637acbfb6560e01b8152600481018790523360248201526001600160a01b039091169250637acbfb659150604401600060405180830381600087803b158015610dfc57600080fd5b505af1158015610e10573d6000803e3d6000fd5b5050601154601354604051632f5d3d6d60e21b815261ffff891660048201526001600160a01b03928316945063fe55932a935087929091169063bd74f5b490602401602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613ce3565b6040516001600160c01b031990911660208201526028016040516020818303038152906040526040518363ffffffff1660e01b8152600401610ed6929190613d0d565b600060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505060115460405163468129a560e01b81526004810187905260006024820152600160448201526001600160a01b03909116925063468129a59150606401600060405180830381600087803b158015610f5c57600080fd5b505af1158015610f70573d6000803e3d6000fd5b50506011546040805180820182528b8152602081018b90529051630381cb3b60e01b81526001600160a01b039092169350630381cb3b9250610fb791879190600401613d26565b600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50506011546040516307f3eb6d60e31b81526004810187905260001960248201526001600160a01b039091169250633f9f5b689150604401600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505060115460405163c4d9102f60e01b81526004810187905260001960248201526001600160a01b03909116925063c4d9102f9150604401600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b50506011546001600160a01b031691506373ffd969905088886110d5876001613d5e565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606401600060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505060115460ed80546001600160a01b0390921693506316ce8a699250869161ffff861690811061116257611162613c7c565b6000918252602090912060108204015460405160e085901b6001600160e01b03191681526004810193909352600f9091166002026101000a900461ffff166024820152604401600060405180830381600087803b1580156111c257600080fd5b505af11580156111d6573d6000803e3d6000fd5b50506011546001600160a01b03169150638389f35390506111f8856001613d5e565b6040518263ffffffff1660e01b815260040161121691815260200190565b600060405180830381600087803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b5050505082601160009054906101000a90046001600160a01b03166001600160a01b03166324b5c1346040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190613c92565b116112ca57600080fd5b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905261ffff8816825260e390529190912061130f916005613633565b5061ffff808516600090815260e36020526040902060019183166005811061133957611339613c7c565b60208082049092018054931515601f9092166101000a91820260ff909202199093161790915561ffff808616600081815260e284526040808220805494891661ffff1990951694909417909355825180840184528b81528085018b905291815260e190935291206113ab9160026136c5565b5083601588602281106113c0576113c0613c7c565b6003020187602281106113d5576113d5613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508260016114079190613d5e565b607b886022811061141a5761141a613c7c565b60030201876022811061142f5761142f613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550611462338561ffff16612c08565b50505061ffff169392505050565b60e1602052816000526040600020816002811061148c57600080fd5b01549150829050565b61149f3382612d56565b6114bb5760405162461bcd60e51b815260040161099690613d76565b610acc838383612e4d565b60006114d183611ce7565b82106115335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610996565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606010828154811061157157611571613c7c565b90600052602060002001805461158690613c41565b80601f01602080910402602001604051908101604052809291908181526020018280546115b290613c41565b80156115ff5780601f106115d4576101008083540402835291602001916115ff565b820191906000526020600020905b8154815290600101906020018083116115e257829003601f168201915b50505050509050919050565b600a546001600160a01b031633148061162e5750600c546001600160a01b031633145b806116435750600d546001600160a01b031633145b806116585750600e546001600160a01b031633145b8061166d5750600f546001600160a01b031633145b61167657600080fd5b600c5447906001600160a01b03166108fc6103e86116968461028a613dc7565b6116a09190613dfc565b6040518115909202916000818181858888f193505050501580156116c8573d6000803e3d6000fd5b50600d546001600160a01b03166108fc6103e86116e6846064613dc7565b6116f09190613dfc565b6040518115909202916000818181858888f19350505050158015611718573d6000803e3d6000fd5b50600e546001600160a01b03166108fc6103e861173684607d613dc7565b6117409190613dfc565b6040518115909202916000818181858888f19350505050158015611768573d6000803e3d6000fd5b50600f546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156117a2573d6000803e3d6000fd5b5050565b601582602281106117b657600080fd5b6003020181602281106117c857600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b610acc8383836040518060200160405280600081525061268a565b600061180f60085490565b82106118725760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610996565b6008828154811061188557611885613c7c565b90600052602060002001549050919050565b60e360205281600052604060002081600581106118b357600080fd5b602081049091015460ff601f9092166101000a9004169150829050565b60006118da6136f3565b60e45460009061ffff620100009091048116908516106118f957600080fd5b60115460405163d713065160e01b815261ffff861660048201526001600160a01b039091169063d713065190602401600060405180830381865afa158015611945573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261196d9190810190613f28565b50949750955060159350859250600091506119859050565b60200201516022811061199a5761199a613c7c565b600302018260016020020151602281106119b6576119b6613c7c565b601081049190910154600f9091166002026101000a900461ffff16156119db57600080fd5b60115460405163f71d96cb60e01b8152600481018590526001600160a01b039091169063f71d96cb90602401600060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a4c9190810190614000565b5094955050506001600160a01b03841633149250611a6c91505057600080fd5b601154604051637acbfb6560e01b815261ffff861660048201523360248201526001600160a01b0390911690637acbfb6590604401600060405180830381600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505060115460405163d713065160e01b815261ffff881660048201526001600160a01b03909116925063d71306519150602401600060405180830381865afa158015611b1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b479190810190613f28565b50949750503387149350611b5e9250505057600080fd5b8360e26000611b6e836001614080565b61ffff1661ffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508160e16000866001611bb09190614080565b61ffff1681526020810191909152604001600020611bcf9160026136c5565b50611bdb846001614080565b825160159060228110611bf057611bf0613c7c565b60030201836001602002015160228110611c0c57611c0c613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550611c4b33856001611c429190614080565b61ffff16612c08565b50505050565b60e58260048110611c6157600080fd5b0181600481106117c857600080fd5b6000818152600260205260408120546001600160a01b0316806108895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610996565b60006001600160a01b038216611d525760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610996565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611d985760405162461bcd60e51b8152600401610996906140a6565b611da26000612ed4565b565b60606001805461089e90613c41565b600a546001600160a01b03163314611ddd5760405162461bcd60e51b8152600401610996906140a6565b60108054600181018255600091909152610acc907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672018383613711565b600a546001600160a01b03163314611e445760405162461bcd60e51b8152600401610996906140a6565b611e4c6136f3565b60115460405163d713065160e01b815261ffff841660048201526001600160a01b039091169063d713065190602401600060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ec09190810190613f28565b50909550611ed8945086935060019250614080915050565b8151607b9060228110611eed57611eed613c7c565b60030201826001602002015160228110611f0957611f09613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6117a2338383612f26565b607b82602281106117b657600080fd5b611f55613785565b604080516104408101909152607b60226000835b82821015611fda57604080516104408101918290529060038402860190602290826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611f8e579050505050505081526020019060010190611f69565b50505050905090565b600080600080611ff16136f3565b60e45460009061ffff620100009091048116908816101561201157600080fd5b60115460405163d713065160e01b815261ffff891660048201526001600160a01b039091169063d713065190602401600060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120859190810190613f28565b509497509550601593508592506000915061209d9050565b6020020151602281106120b2576120b2613c7c565b600302018260016020020151602281106120ce576120ce613c7c565b601081049190910154600f9091166002026101000a900461ffff16156120f357600080fd5b60115460405163f71d96cb60e01b8152600481018590526001600160a01b039091169063f71d96cb90602401600060405180830381865afa15801561213c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121649190810190614000565b5094955050506001600160a01b0384163314925061218491505057600080fd5b81516020830151612195919061299d565b94506121a085612a5c565b935060e58561ffff16600481106121b9576121b9613c7c565b018461ffff16600481106121cf576121cf613c7c565b601091828204019190066002029054906101000a900461ffff16955060e58561ffff166004811061220257612202613c7c565b018461ffff166004811061221857612218613c7c565b6010918282040191900660020281819054906101000a900461ffff168092919061224190613cc1565b82546101009290920a61ffff818102199093169183160217909155601154604051637acbfb6560e01b8152918a1660048301523360248301526001600160a01b03169150637acbfb6590604401600060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b5050601154601354604051632f5d3d6d60e21b815261ffff8b1660048201526001600160a01b03928316945063fe55932a93508b929091169063bd74f5b490602401602060405180830381865afa15801561231b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233f9190613ce3565b6040516001600160c01b031990911660208201526028016040516020818303038152906040526040518363ffffffff1660e01b81526004016123829291906140db565b600060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505060115460ed80546001600160a01b0390921693506316ce8a6992508a9161ffff89169081106123e3576123e3613c7c565b6000918252602090912060108204015460405160e085901b6001600160e01b031916815261ffff9384166004820152600f9092166002026101000a90049091166024820152604401600060405180830381600087803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b505060115460405163d713065160e01b815261ffff8b1660048201526001600160a01b03909116925063d71306519150602401600060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124d19190810190613f28565b509497505033871493506124e89250505057600080fd5b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905261ffff8a16825260e390529190912061252d916005613633565b5061ffff808716600090815260e36020526040902060019186166005811061255757612557613c7c565b60208082049092018054931515601f9092166101000a91820260ff909202199093161790915561ffff808816600090815260e2835260408082208054938c1661ffff199094169390931790925560e190925290206125b7908360026136c5565b5081518690601590602281106125cf576125cf613c7c565b600302018360016020020151602281106125eb576125eb613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555086600161261d9190614080565b8251607b906022811061263257612632613c7c565b6003020183600160200201516022811061264e5761264e613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612681338761ffff16612c08565b50505050505050565b6126943383612d56565b6126b05760405162461bcd60e51b815260040161099690613d76565b611c4b84848484612ff5565b6000818152600260205260409020546060906001600160a01b031661273b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610996565b6000612745613028565b905060008151116127655760405180602001604052806000815250612790565b8061276f84613048565b6040516020016127809291906140f8565b6040516020818303038152906040525b9392505050565b61279f613785565b604080516104408101909152601560226000835b82821015611fda57604080516104408101918290529060038402860190602290826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127d85790505050505050815260200190600101906127b3565b606060405180606001604052806035815260200161424860359139905090565b600a546001600160a01b0316331461286e5760405162461bcd60e51b8152600401610996906140a6565b6001600160a01b0381166128d35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610996565b6128dc81612ed4565b50565b60006001600160e01b031982166380ac58cd60e01b148061291057506001600160e01b03198216635b5e139f60e01b145b8061088957506301ffc9a760e01b6001600160e01b0319831614610889565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061296482611c70565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080601084111580156129b2575060108311155b156129bf57506000612790565b601183101580156129d1575060108411155b80156129de575060228311155b156129eb57506001612790565b601184101580156129fd575060118310155b8015612a0a575060228411155b8015612a17575060228311155b15612a2457506002612790565b60118410158015612a33575060015b8015612a40575060228411155b8015612a4d575060108311155b1561027d575060039392505050565b60008060008060004442604051602001612a80929190918252602082015260400190565b60408051601f1981840301815291905280516020909101209350612aa560648561411e565b9350600a841015612ab95760039250612b12565b600a8410158015612aca5750601e84105b15612ad85760029250612b12565b601e8410158015612ae95750603a84105b15612af75760019250612b12565b603a8410158015612b085750606484105b1561027d57600092505b600091505b60038261ffff1611612bed576004612b2f8385614080565b612b399190614132565b905060e98661ffff1660048110612b5257612b52613c7c565b018161ffff1660048110612b6857612b68613c7c565b601091828204019190066002029054906101000a900461ffff1661ffff1660e58761ffff1660048110612b9d57612b9d613c7c565b018261ffff1660048110612bb357612bb3613c7c565b601091828204019190066002029054906101000a900461ffff1661ffff1611612bdb57612bed565b81612be581613cc1565b925050612b17565b60038261ffff161115612bff57600080fd5b95945050505050565b6001600160a01b038216612c5e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610996565b6000818152600260205260409020546001600160a01b031615612cc35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610996565b612ccf60008383613146565b6001600160a01b0382166000908152600360205260408120805460019290612cf8908490613d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600260205260408120546001600160a01b0316612dcf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610996565b6000612dda83611c70565b9050806001600160a01b0316846001600160a01b03161480612e155750836001600160a01b0316612e0a84610921565b6001600160a01b0316145b80612e4557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b60115461ffff828116600090815260e2602052604090819020549051637acbfb6560e01b8152911660048201526001600160a01b03848116602483015290911690637acbfb6590604401600060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b50505050610acc8383836131fe565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f885760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610996565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613000848484612e4d565b61300c848484846133a5565b611c4b5760405162461bcd60e51b815260040161099690614153565b606060405180606001604052806036815260200161427d60369139905090565b60608161306c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130965780613080816141a5565b915061308f9050600a83613dfc565b9150613070565b60008167ffffffffffffffff8111156130b1576130b1613acc565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b5090505b8415612e45576130f06001836141c0565b91506130fd600a8661411e565b613108906030613d5e565b60f81b81838151811061311d5761311d613c7c565b60200101906001600160f81b031916908160001a90535061313f600a86613dfc565b94506130df565b6001600160a01b0383166131a15761319c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6131c4565b816001600160a01b0316836001600160a01b0316146131c4576131c483826134a3565b6001600160a01b0382166131db57610acc81613540565b826001600160a01b0316826001600160a01b031614610acc57610acc82826135ef565b826001600160a01b031661321182611c70565b6001600160a01b0316146132755760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610996565b6001600160a01b0382166132d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610996565b6132e2838383613146565b6132ed60008261292f565b6001600160a01b03831660009081526003602052604081208054600192906133169084906141c0565b90915550506001600160a01b0382166000908152600360205260408120805460019290613344908490613d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561349857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133e99033908990889088906004016141d7565b6020604051808303816000875af1925050508015613424575060408051601f3d908101601f1916820190925261342191810190614214565b60015b61347e573d808015613452576040519150601f19603f3d011682016040523d82523d6000602084013e613457565b606091505b5080516134765760405162461bcd60e51b815260040161099690614153565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e45565b506001949350505050565b600060016134b084611ce7565b6134ba91906141c0565b60008381526007602052604090205490915080821461350d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613552906001906141c0565b6000838152600960205260408120546008805493945090928490811061357a5761357a613c7c565b90600052602060002001549050806008838154811061359b5761359b613c7c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806135d3576135d3614231565b6001900381819060005260206000200160009055905550505050565b60006135fa83611ce7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001830191839082156136b55791602002820160005b8382111561368657835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613649565b80156136b35782816101000a81549060ff0219169055600101602081600001049283019260010302613686565b505b506136c19291506137b3565b5090565b82600281019282156136b5579160200282015b828111156136b55782518255916020019190600101906136d8565b60405180604001604052806002906020820280368337509192915050565b82805461371d90613c41565b90600052602060002090601f01602090048101928261373f57600085556136b5565b82601f106137585782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061376a565b6040518061044001604052806022905b61379d6137c8565b8152602001906001900390816137955790505090565b5b808211156136c157600081556001016137b4565b6040518061044001604052806022906020820280368337509192915050565b6001600160e01b0319811681146128dc57600080fd5b60006020828403121561380f57600080fd5b8135612790816137e7565b60005b8381101561383557818101518382015260200161381d565b83811115611c4b5750506000910152565b6000815180845261385e81602086016020860161381a565b601f01601f19169290920160200192915050565b6020815260006127906020830184613846565b60006020828403121561389757600080fd5b5035919050565b6001600160a01b03811681146128dc57600080fd5b600080604083850312156138c657600080fd5b82356138d18161389e565b946020939093013593505050565b600080604083850312156138f257600080fd5b50508035926020909101359150565b60008060006060848603121561391657600080fd5b83356139218161389e565b925060208401356139318161389e565b929592945050506040919091013590565b803561ffff8116811461395457600080fd5b919050565b6000806040838503121561396c57600080fd5b6138d183613942565b60006020828403121561398757600080fd5b61279082613942565b6000602082840312156139a257600080fd5b81356127908161389e565b600080602083850312156139c057600080fd5b823567ffffffffffffffff808211156139d857600080fd5b818501915085601f8301126139ec57600080fd5b8135818111156139fb57600080fd5b866020828501011115613a0d57600080fd5b60209290920196919550909350505050565b80151581146128dc57600080fd5b60008060408385031215613a4057600080fd5b8235613a4b8161389e565b91506020830135613a5b81613a1f565b809150509250929050565b619080810181836000805b6022808210613a805750613ac2565b835185845b83811015613aa757825161ffff16825260209283019290910190600101613a85565b50505061044094909401935060209290920191600101613a71565b5050505092915050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715613b0557613b05613acc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b3457613b34613acc565b604052919050565b600067ffffffffffffffff821115613b5657613b56613acc565b50601f01601f191660200190565b60008060008060808587031215613b7a57600080fd5b8435613b858161389e565b93506020850135613b958161389e565b925060408501359150606085013567ffffffffffffffff811115613bb857600080fd5b8501601f81018713613bc957600080fd5b8035613bdc613bd782613b3c565b613b0b565b818152886020838501011115613bf157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613c2657600080fd5b8235613c318161389e565b91506020830135613a5b8161389e565b600181811c90821680613c5557607f821691505b60208210811415613c7657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613ca457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415613cd957613cd9613cab565b6001019392505050565b600060208284031215613cf557600080fd5b81516001600160c01b03198116811461279057600080fd5b828152604060208201526000612e456040830184613846565b8281526060810160208083018460005b6002811015613d5357815183529183019190830190600101613d36565b505050509392505050565b60008219821115613d7157613d71613cab565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615613de157613de1613cab565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613e0b57613e0b613de6565b500490565b600082601f830112613e2157600080fd5b8151613e2f613bd782613b3c565b818152846020838601011115613e4457600080fd5b612e4582602083016020870161381a565b600082601f830112613e6657600080fd5b60405161014080820182811067ffffffffffffffff82111715613e8b57613e8b613acc565b60405283018185821115613e9e57600080fd5b845b82811015613eb8578051825260209182019101613ea0565b509195945050505050565b600082601f830112613ed457600080fd5b6040516040810181811067ffffffffffffffff82111715613ef757613ef7613acc565b8060405250806040840185811115613f0e57600080fd5b845b81811015613eb8578051835260209283019201613f10565b60008060008060008060006102a0888a031215613f4457600080fd5b8751965060208089015167ffffffffffffffff811115613f6357600080fd5b613f6f8b828c01613e10565b97505089605f8a0112613f8157600080fd5b613f89613ae2565b8060e08b018c811115613f9b57600080fd5b60408c015b81811015613fc0578051613fb381613a1f565b8452928401928401613fa0565b50819850613fce8d82613e55565b975050505050613fe2896102208a01613ec3565b92506102608801519150610280880151905092959891949750929550565b600080600080600080600060e0888a03121561401b57600080fd5b87516140268161389e565b602089015190975067ffffffffffffffff81111561404357600080fd5b61404f8a828b01613e10565b60408a015160608b015160808c015160a08d015160c0909d01519b9e939d50919b909a919950975095509350505050565b600061ffff80831681851680830382111561409d5761409d613cab565b01949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff83168152604060208201526000612e456040830184613846565b6000835161410a81846020880161381a565b83519083019061409d81836020880161381a565b60008261412d5761412d613de6565b500690565b600061ffff8084168061414757614147613de6565b92169190910692915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006000198214156141b9576141b9613cab565b5060010190565b6000828210156141d2576141d2613cab565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061420a90830184613846565b9695505050505050565b60006020828403121561422657600080fd5b8151612790816137e7565b634e487b7160e01b600052603160045260246000fdfe697066733a2f2f516d646237787035594a57644c7256656936766e6e68645635457972427835506474345658586f65784135516f57697066733a2f2f516d616e6b335577724757416f516252785243696d4b77376b6468677532757455653141475272397a7a7a3362462fa26469706673582212200556edddd67183038ce9cb77a5e3c3460b85125b4b11d12b626253591229fb7f64736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806370a082311161014f578063ad3de14c116100c1578063d8cb55e31161007a578063d8cb55e314610793578063e8a3d485146107a8578063e985e9c5146107bd578063f2fde38b14610806578063f349af8614610826578063fbe706fd1461084657600080fd5b8063ad3de14c146106c0578063b5b82e7b146106e2578063b88d4fde14610702578063c87b56dd14610722578063c9d87e6914610742578063d62e24e01461076257600080fd5b80639bec62c9116101135780639bec62c91461060b5780639cc84cb51461062b5780639f7d034e1461064b578063a22cb4651461066b578063a2ef381c1461068b578063a90b9128146106a057600080fd5b806370a0823114610583578063715018a6146105a35780638da5cb5b146105b85780638e130386146105d657806395d89b41146105f657600080fd5b80632f745c59116101f35780635001f3b5116101ac5780635001f3b5146104cd5780635a2bcc18146104ed5780635b7126b4146105035780635d7e1c12146105235780635dfe52e7146105435780636352211e1461056357600080fd5b80632f745c5914610405578063343843941461042557806335faa4161461044557806336e5df3f1461045a57806342842e0e1461048d5780634f6ccce7146104ad57600080fd5b806311f558891161024557806311f558891461035357806315ee73d11461037357806318160ddd146103935780631b2ef1ca146103b25780631b2f3b4b146103c557806323b872dd146103e557600080fd5b806301ffc9a7146102825780630589a478146102b757806306fdde03146102ef578063081812fc14610311578063095ea7b314610331575b600080fd5b34801561028e57600080fd5b506102a261029d3660046137fd565b610864565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506012546102d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102ae565b3480156102fb57600080fd5b5061030461088f565b6040516102ae9190613872565b34801561031d57600080fd5b506102d761032c366004613885565b610921565b34801561033d57600080fd5b5061035161034c3660046138b3565b6109bb565b005b34801561035f57600080fd5b506014546102d7906001600160a01b031681565b34801561037f57600080fd5b50600f546102d7906001600160a01b031681565b34801561039f57600080fd5b506008545b6040519081526020016102ae565b6103a46103c03660046138df565b610ad1565b3480156103d157600080fd5b506103a46103e03660046138df565b611470565b3480156103f157600080fd5b50610351610400366004613901565b611495565b34801561041157600080fd5b506103a46104203660046138b3565b6114c6565b34801561043157600080fd5b50610304610440366004613885565b61155c565b34801561045157600080fd5b5061035161160b565b34801561046657600080fd5b5061047a6104753660046138df565b6117a6565b60405161ffff90911681526020016102ae565b34801561049957600080fd5b506103516104a8366004613901565b6117e9565b3480156104b957600080fd5b506103a46104c8366004613885565b611804565b3480156104d957600080fd5b506011546102d7906001600160a01b031681565b3480156104f957600080fd5b506103a4600b5481565b34801561050f57600080fd5b506102a261051e366004613959565b611897565b34801561052f57600080fd5b5061035161053e366004613975565b6118d0565b34801561054f57600080fd5b5061047a61055e3660046138df565b611c51565b34801561056f57600080fd5b506102d761057e366004613885565b611c70565b34801561058f57600080fd5b506103a461059e366004613990565b611ce7565b3480156105af57600080fd5b50610351611d6e565b3480156105c457600080fd5b50600a546001600160a01b03166102d7565b3480156105e257600080fd5b50600d546102d7906001600160a01b031681565b34801561060257600080fd5b50610304611da4565b34801561061757600080fd5b50600c546102d7906001600160a01b031681565b34801561063757600080fd5b506103516106463660046139ad565b611db3565b34801561065757600080fd5b50610351610666366004613975565b611e1a565b34801561067757600080fd5b50610351610686366004613a2d565b611f32565b34801561069757600080fd5b506010546103a4565b3480156106ac57600080fd5b5061047a6106bb3660046138df565b611f3d565b3480156106cc57600080fd5b506106d5611f4d565b6040516102ae9190613a66565b3480156106ee57600080fd5b506103516106fd366004613975565b611fe3565b34801561070e57600080fd5b5061035161071d366004613b64565b61268a565b34801561072e57600080fd5b5061030461073d366004613885565b6126bc565b34801561074e57600080fd5b506013546102d7906001600160a01b031681565b34801561076e57600080fd5b5061047a61077d366004613975565b60e26020526000908152604090205461ffff1681565b34801561079f57600080fd5b506106d5612797565b3480156107b457600080fd5b50610304612824565b3480156107c957600080fd5b506102a26107d8366004613c13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561081257600080fd5b50610351610821366004613990565b612844565b34801561083257600080fd5b50600e546102d7906001600160a01b031681565b34801561085257600080fd5b506102d7610861366004613990565b90565b60006001600160e01b0319821663780e9d6360e01b14806108895750610889826128df565b92915050565b60606000805461089e90613c41565b80601f01602080910402602001604051908101604052809291908181526020018280546108ca90613c41565b80156109175780601f106108ec57610100808354040283529160200191610917565b820191906000526020600020905b8154815290600101906020018083116108fa57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661099f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109c682611c70565b9050806001600160a01b0316836001600160a01b03161415610a345760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610996565b336001600160a01b0382161480610a505750610a5081336107d8565b610ac25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610996565b610acc838361292f565b505050565b6000806000806000600b543414610ae757600080fd5b60158760228110610afa57610afa613c7c565b600302018660228110610b0f57610b0f613c7c565b601081049190910154600f9091166002026101000a900461ffff16158015610b775750607b8760228110610b4557610b45613c7c565b600302018660228110610b5a57610b5a613c7c565b601081049190910154600f9091166002026101000a900461ffff16155b610b8057600080fd5b601154604051631521722560e31b815260048101899052602481018890526001600160a01b039091169063a90b912890604401602060405180830381865afa158015610bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf49190613c92565b15610bfe57600080fd5b610c08878761299d565b9150610c1382612a5c565b905060e58261ffff1660048110610c2c57610c2c613c7c565b018161ffff1660048110610c4257610c42613c7c565b601091828204019190066002029054906101000a900461ffff16935060e58261ffff1660048110610c7557610c75613c7c565b018161ffff1660048110610c8b57610c8b613c7c565b6010918282040191900660020281819054906101000a900461ffff1680929190610cb490613cc1565b91906101000a81548161ffff021916908361ffff16021790555050601160009054906101000a90046001600160a01b03166001600160a01b03166324b5c1346040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190613c92565b9250601160009054906101000a90046001600160a01b03166001600160a01b0316630eb495c26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d9857600080fd5b505af1158015610dac573d6000803e3d6000fd5b5050601154604051637acbfb6560e01b8152600481018790523360248201526001600160a01b039091169250637acbfb659150604401600060405180830381600087803b158015610dfc57600080fd5b505af1158015610e10573d6000803e3d6000fd5b5050601154601354604051632f5d3d6d60e21b815261ffff891660048201526001600160a01b03928316945063fe55932a935087929091169063bd74f5b490602401602060405180830381865afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613ce3565b6040516001600160c01b031990911660208201526028016040516020818303038152906040526040518363ffffffff1660e01b8152600401610ed6929190613d0d565b600060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505060115460405163468129a560e01b81526004810187905260006024820152600160448201526001600160a01b03909116925063468129a59150606401600060405180830381600087803b158015610f5c57600080fd5b505af1158015610f70573d6000803e3d6000fd5b50506011546040805180820182528b8152602081018b90529051630381cb3b60e01b81526001600160a01b039092169350630381cb3b9250610fb791879190600401613d26565b600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50506011546040516307f3eb6d60e31b81526004810187905260001960248201526001600160a01b039091169250633f9f5b689150604401600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b505060115460405163c4d9102f60e01b81526004810187905260001960248201526001600160a01b03909116925063c4d9102f9150604401600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b50506011546001600160a01b031691506373ffd969905088886110d5876001613d5e565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606401600060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505060115460ed80546001600160a01b0390921693506316ce8a699250869161ffff861690811061116257611162613c7c565b6000918252602090912060108204015460405160e085901b6001600160e01b03191681526004810193909352600f9091166002026101000a900461ffff166024820152604401600060405180830381600087803b1580156111c257600080fd5b505af11580156111d6573d6000803e3d6000fd5b50506011546001600160a01b03169150638389f35390506111f8856001613d5e565b6040518263ffffffff1660e01b815260040161121691815260200190565b600060405180830381600087803b15801561123057600080fd5b505af1158015611244573d6000803e3d6000fd5b5050505082601160009054906101000a90046001600160a01b03166001600160a01b03166324b5c1346040518163ffffffff1660e01b8152600401602060405180830381865afa15801561129c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c09190613c92565b116112ca57600080fd5b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905261ffff8816825260e390529190912061130f916005613633565b5061ffff808516600090815260e36020526040902060019183166005811061133957611339613c7c565b60208082049092018054931515601f9092166101000a91820260ff909202199093161790915561ffff808616600081815260e284526040808220805494891661ffff1990951694909417909355825180840184528b81528085018b905291815260e190935291206113ab9160026136c5565b5083601588602281106113c0576113c0613c7c565b6003020187602281106113d5576113d5613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508260016114079190613d5e565b607b886022811061141a5761141a613c7c565b60030201876022811061142f5761142f613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550611462338561ffff16612c08565b50505061ffff169392505050565b60e1602052816000526040600020816002811061148c57600080fd5b01549150829050565b61149f3382612d56565b6114bb5760405162461bcd60e51b815260040161099690613d76565b610acc838383612e4d565b60006114d183611ce7565b82106115335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610996565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606010828154811061157157611571613c7c565b90600052602060002001805461158690613c41565b80601f01602080910402602001604051908101604052809291908181526020018280546115b290613c41565b80156115ff5780601f106115d4576101008083540402835291602001916115ff565b820191906000526020600020905b8154815290600101906020018083116115e257829003601f168201915b50505050509050919050565b600a546001600160a01b031633148061162e5750600c546001600160a01b031633145b806116435750600d546001600160a01b031633145b806116585750600e546001600160a01b031633145b8061166d5750600f546001600160a01b031633145b61167657600080fd5b600c5447906001600160a01b03166108fc6103e86116968461028a613dc7565b6116a09190613dfc565b6040518115909202916000818181858888f193505050501580156116c8573d6000803e3d6000fd5b50600d546001600160a01b03166108fc6103e86116e6846064613dc7565b6116f09190613dfc565b6040518115909202916000818181858888f19350505050158015611718573d6000803e3d6000fd5b50600e546001600160a01b03166108fc6103e861173684607d613dc7565b6117409190613dfc565b6040518115909202916000818181858888f19350505050158015611768573d6000803e3d6000fd5b50600f546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156117a2573d6000803e3d6000fd5b5050565b601582602281106117b657600080fd5b6003020181602281106117c857600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b610acc8383836040518060200160405280600081525061268a565b600061180f60085490565b82106118725760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610996565b6008828154811061188557611885613c7c565b90600052602060002001549050919050565b60e360205281600052604060002081600581106118b357600080fd5b602081049091015460ff601f9092166101000a9004169150829050565b60006118da6136f3565b60e45460009061ffff620100009091048116908516106118f957600080fd5b60115460405163d713065160e01b815261ffff861660048201526001600160a01b039091169063d713065190602401600060405180830381865afa158015611945573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261196d9190810190613f28565b50949750955060159350859250600091506119859050565b60200201516022811061199a5761199a613c7c565b600302018260016020020151602281106119b6576119b6613c7c565b601081049190910154600f9091166002026101000a900461ffff16156119db57600080fd5b60115460405163f71d96cb60e01b8152600481018590526001600160a01b039091169063f71d96cb90602401600060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a4c9190810190614000565b5094955050506001600160a01b03841633149250611a6c91505057600080fd5b601154604051637acbfb6560e01b815261ffff861660048201523360248201526001600160a01b0390911690637acbfb6590604401600060405180830381600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505060115460405163d713065160e01b815261ffff881660048201526001600160a01b03909116925063d71306519150602401600060405180830381865afa158015611b1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b479190810190613f28565b50949750503387149350611b5e9250505057600080fd5b8360e26000611b6e836001614080565b61ffff1661ffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508160e16000866001611bb09190614080565b61ffff1681526020810191909152604001600020611bcf9160026136c5565b50611bdb846001614080565b825160159060228110611bf057611bf0613c7c565b60030201836001602002015160228110611c0c57611c0c613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550611c4b33856001611c429190614080565b61ffff16612c08565b50505050565b60e58260048110611c6157600080fd5b0181600481106117c857600080fd5b6000818152600260205260408120546001600160a01b0316806108895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610996565b60006001600160a01b038216611d525760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610996565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611d985760405162461bcd60e51b8152600401610996906140a6565b611da26000612ed4565b565b60606001805461089e90613c41565b600a546001600160a01b03163314611ddd5760405162461bcd60e51b8152600401610996906140a6565b60108054600181018255600091909152610acc907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672018383613711565b600a546001600160a01b03163314611e445760405162461bcd60e51b8152600401610996906140a6565b611e4c6136f3565b60115460405163d713065160e01b815261ffff841660048201526001600160a01b039091169063d713065190602401600060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ec09190810190613f28565b50909550611ed8945086935060019250614080915050565b8151607b9060228110611eed57611eed613c7c565b60030201826001602002015160228110611f0957611f09613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6117a2338383612f26565b607b82602281106117b657600080fd5b611f55613785565b604080516104408101909152607b60226000835b82821015611fda57604080516104408101918290529060038402860190602290826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611f8e579050505050505081526020019060010190611f69565b50505050905090565b600080600080611ff16136f3565b60e45460009061ffff620100009091048116908816101561201157600080fd5b60115460405163d713065160e01b815261ffff891660048201526001600160a01b039091169063d713065190602401600060405180830381865afa15801561205d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120859190810190613f28565b509497509550601593508592506000915061209d9050565b6020020151602281106120b2576120b2613c7c565b600302018260016020020151602281106120ce576120ce613c7c565b601081049190910154600f9091166002026101000a900461ffff16156120f357600080fd5b60115460405163f71d96cb60e01b8152600481018590526001600160a01b039091169063f71d96cb90602401600060405180830381865afa15801561213c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121649190810190614000565b5094955050506001600160a01b0384163314925061218491505057600080fd5b81516020830151612195919061299d565b94506121a085612a5c565b935060e58561ffff16600481106121b9576121b9613c7c565b018461ffff16600481106121cf576121cf613c7c565b601091828204019190066002029054906101000a900461ffff16955060e58561ffff166004811061220257612202613c7c565b018461ffff166004811061221857612218613c7c565b6010918282040191900660020281819054906101000a900461ffff168092919061224190613cc1565b82546101009290920a61ffff818102199093169183160217909155601154604051637acbfb6560e01b8152918a1660048301523360248301526001600160a01b03169150637acbfb6590604401600060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b5050601154601354604051632f5d3d6d60e21b815261ffff8b1660048201526001600160a01b03928316945063fe55932a93508b929091169063bd74f5b490602401602060405180830381865afa15801561231b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233f9190613ce3565b6040516001600160c01b031990911660208201526028016040516020818303038152906040526040518363ffffffff1660e01b81526004016123829291906140db565b600060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505060115460ed80546001600160a01b0390921693506316ce8a6992508a9161ffff89169081106123e3576123e3613c7c565b6000918252602090912060108204015460405160e085901b6001600160e01b031916815261ffff9384166004820152600f9092166002026101000a90049091166024820152604401600060405180830381600087803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b505060115460405163d713065160e01b815261ffff8b1660048201526001600160a01b03909116925063d71306519150602401600060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124d19190810190613f28565b509497505033871493506124e89250505057600080fd5b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905261ffff8a16825260e390529190912061252d916005613633565b5061ffff808716600090815260e36020526040902060019186166005811061255757612557613c7c565b60208082049092018054931515601f9092166101000a91820260ff909202199093161790915561ffff808816600090815260e2835260408082208054938c1661ffff199094169390931790925560e190925290206125b7908360026136c5565b5081518690601590602281106125cf576125cf613c7c565b600302018360016020020151602281106125eb576125eb613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555086600161261d9190614080565b8251607b906022811061263257612632613c7c565b6003020183600160200201516022811061264e5761264e613c7c565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612681338761ffff16612c08565b50505050505050565b6126943383612d56565b6126b05760405162461bcd60e51b815260040161099690613d76565b611c4b84848484612ff5565b6000818152600260205260409020546060906001600160a01b031661273b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610996565b6000612745613028565b905060008151116127655760405180602001604052806000815250612790565b8061276f84613048565b6040516020016127809291906140f8565b6040516020818303038152906040525b9392505050565b61279f613785565b604080516104408101909152601560226000835b82821015611fda57604080516104408101918290529060038402860190602290826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127d85790505050505050815260200190600101906127b3565b606060405180606001604052806035815260200161424860359139905090565b600a546001600160a01b0316331461286e5760405162461bcd60e51b8152600401610996906140a6565b6001600160a01b0381166128d35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610996565b6128dc81612ed4565b50565b60006001600160e01b031982166380ac58cd60e01b148061291057506001600160e01b03198216635b5e139f60e01b145b8061088957506301ffc9a760e01b6001600160e01b0319831614610889565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061296482611c70565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080601084111580156129b2575060108311155b156129bf57506000612790565b601183101580156129d1575060108411155b80156129de575060228311155b156129eb57506001612790565b601184101580156129fd575060118310155b8015612a0a575060228411155b8015612a17575060228311155b15612a2457506002612790565b60118410158015612a33575060015b8015612a40575060228411155b8015612a4d575060108311155b1561027d575060039392505050565b60008060008060004442604051602001612a80929190918252602082015260400190565b60408051601f1981840301815291905280516020909101209350612aa560648561411e565b9350600a841015612ab95760039250612b12565b600a8410158015612aca5750601e84105b15612ad85760029250612b12565b601e8410158015612ae95750603a84105b15612af75760019250612b12565b603a8410158015612b085750606484105b1561027d57600092505b600091505b60038261ffff1611612bed576004612b2f8385614080565b612b399190614132565b905060e98661ffff1660048110612b5257612b52613c7c565b018161ffff1660048110612b6857612b68613c7c565b601091828204019190066002029054906101000a900461ffff1661ffff1660e58761ffff1660048110612b9d57612b9d613c7c565b018261ffff1660048110612bb357612bb3613c7c565b601091828204019190066002029054906101000a900461ffff1661ffff1611612bdb57612bed565b81612be581613cc1565b925050612b17565b60038261ffff161115612bff57600080fd5b95945050505050565b6001600160a01b038216612c5e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610996565b6000818152600260205260409020546001600160a01b031615612cc35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610996565b612ccf60008383613146565b6001600160a01b0382166000908152600360205260408120805460019290612cf8908490613d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600260205260408120546001600160a01b0316612dcf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610996565b6000612dda83611c70565b9050806001600160a01b0316846001600160a01b03161480612e155750836001600160a01b0316612e0a84610921565b6001600160a01b0316145b80612e4557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b60115461ffff828116600090815260e2602052604090819020549051637acbfb6560e01b8152911660048201526001600160a01b03848116602483015290911690637acbfb6590604401600060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b50505050610acc8383836131fe565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f885760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610996565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613000848484612e4d565b61300c848484846133a5565b611c4b5760405162461bcd60e51b815260040161099690614153565b606060405180606001604052806036815260200161427d60369139905090565b60608161306c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130965780613080816141a5565b915061308f9050600a83613dfc565b9150613070565b60008167ffffffffffffffff8111156130b1576130b1613acc565b6040519080825280601f01601f1916602001820160405280156130db576020820181803683370190505b5090505b8415612e45576130f06001836141c0565b91506130fd600a8661411e565b613108906030613d5e565b60f81b81838151811061311d5761311d613c7c565b60200101906001600160f81b031916908160001a90535061313f600a86613dfc565b94506130df565b6001600160a01b0383166131a15761319c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6131c4565b816001600160a01b0316836001600160a01b0316146131c4576131c483826134a3565b6001600160a01b0382166131db57610acc81613540565b826001600160a01b0316826001600160a01b031614610acc57610acc82826135ef565b826001600160a01b031661321182611c70565b6001600160a01b0316146132755760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610996565b6001600160a01b0382166132d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610996565b6132e2838383613146565b6132ed60008261292f565b6001600160a01b03831660009081526003602052604081208054600192906133169084906141c0565b90915550506001600160a01b0382166000908152600360205260408120805460019290613344908490613d5e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561349857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133e99033908990889088906004016141d7565b6020604051808303816000875af1925050508015613424575060408051601f3d908101601f1916820190925261342191810190614214565b60015b61347e573d808015613452576040519150601f19603f3d011682016040523d82523d6000602084013e613457565b606091505b5080516134765760405162461bcd60e51b815260040161099690614153565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e45565b506001949350505050565b600060016134b084611ce7565b6134ba91906141c0565b60008381526007602052604090205490915080821461350d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613552906001906141c0565b6000838152600960205260408120546008805493945090928490811061357a5761357a613c7c565b90600052602060002001549050806008838154811061359b5761359b613c7c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806135d3576135d3614231565b6001900381819060005260206000200160009055905550505050565b60006135fa83611ce7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001830191839082156136b55791602002820160005b8382111561368657835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613649565b80156136b35782816101000a81549060ff0219169055600101602081600001049283019260010302613686565b505b506136c19291506137b3565b5090565b82600281019282156136b5579160200282015b828111156136b55782518255916020019190600101906136d8565b60405180604001604052806002906020820280368337509192915050565b82805461371d90613c41565b90600052602060002090601f01602090048101928261373f57600085556136b5565b82601f106137585782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061376a565b6040518061044001604052806022905b61379d6137c8565b8152602001906001900390816137955790505090565b5b808211156136c157600081556001016137b4565b6040518061044001604052806022906020820280368337509192915050565b6001600160e01b0319811681146128dc57600080fd5b60006020828403121561380f57600080fd5b8135612790816137e7565b60005b8381101561383557818101518382015260200161381d565b83811115611c4b5750506000910152565b6000815180845261385e81602086016020860161381a565b601f01601f19169290920160200192915050565b6020815260006127906020830184613846565b60006020828403121561389757600080fd5b5035919050565b6001600160a01b03811681146128dc57600080fd5b600080604083850312156138c657600080fd5b82356138d18161389e565b946020939093013593505050565b600080604083850312156138f257600080fd5b50508035926020909101359150565b60008060006060848603121561391657600080fd5b83356139218161389e565b925060208401356139318161389e565b929592945050506040919091013590565b803561ffff8116811461395457600080fd5b919050565b6000806040838503121561396c57600080fd5b6138d183613942565b60006020828403121561398757600080fd5b61279082613942565b6000602082840312156139a257600080fd5b81356127908161389e565b600080602083850312156139c057600080fd5b823567ffffffffffffffff808211156139d857600080fd5b818501915085601f8301126139ec57600080fd5b8135818111156139fb57600080fd5b866020828501011115613a0d57600080fd5b60209290920196919550909350505050565b80151581146128dc57600080fd5b60008060408385031215613a4057600080fd5b8235613a4b8161389e565b91506020830135613a5b81613a1f565b809150509250929050565b619080810181836000805b6022808210613a805750613ac2565b835185845b83811015613aa757825161ffff16825260209283019290910190600101613a85565b50505061044094909401935060209290920191600101613a71565b5050505092915050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715613b0557613b05613acc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b3457613b34613acc565b604052919050565b600067ffffffffffffffff821115613b5657613b56613acc565b50601f01601f191660200190565b60008060008060808587031215613b7a57600080fd5b8435613b858161389e565b93506020850135613b958161389e565b925060408501359150606085013567ffffffffffffffff811115613bb857600080fd5b8501601f81018713613bc957600080fd5b8035613bdc613bd782613b3c565b613b0b565b818152886020838501011115613bf157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613c2657600080fd5b8235613c318161389e565b91506020830135613a5b8161389e565b600181811c90821680613c5557607f821691505b60208210811415613c7657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613ca457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681811415613cd957613cd9613cab565b6001019392505050565b600060208284031215613cf557600080fd5b81516001600160c01b03198116811461279057600080fd5b828152604060208201526000612e456040830184613846565b8281526060810160208083018460005b6002811015613d5357815183529183019190830190600101613d36565b505050509392505050565b60008219821115613d7157613d71613cab565b500190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615613de157613de1613cab565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613e0b57613e0b613de6565b500490565b600082601f830112613e2157600080fd5b8151613e2f613bd782613b3c565b818152846020838601011115613e4457600080fd5b612e4582602083016020870161381a565b600082601f830112613e6657600080fd5b60405161014080820182811067ffffffffffffffff82111715613e8b57613e8b613acc565b60405283018185821115613e9e57600080fd5b845b82811015613eb8578051825260209182019101613ea0565b509195945050505050565b600082601f830112613ed457600080fd5b6040516040810181811067ffffffffffffffff82111715613ef757613ef7613acc565b8060405250806040840185811115613f0e57600080fd5b845b81811015613eb8578051835260209283019201613f10565b60008060008060008060006102a0888a031215613f4457600080fd5b8751965060208089015167ffffffffffffffff811115613f6357600080fd5b613f6f8b828c01613e10565b97505089605f8a0112613f8157600080fd5b613f89613ae2565b8060e08b018c811115613f9b57600080fd5b60408c015b81811015613fc0578051613fb381613a1f565b8452928401928401613fa0565b50819850613fce8d82613e55565b975050505050613fe2896102208a01613ec3565b92506102608801519150610280880151905092959891949750929550565b600080600080600080600060e0888a03121561401b57600080fd5b87516140268161389e565b602089015190975067ffffffffffffffff81111561404357600080fd5b61404f8a828b01613e10565b60408a015160608b015160808c015160a08d015160c0909d01519b9e939d50919b909a919950975095509350505050565b600061ffff80831681851680830382111561409d5761409d613cab565b01949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff83168152604060208201526000612e456040830184613846565b6000835161410a81846020880161381a565b83519083019061409d81836020880161381a565b60008261412d5761412d613de6565b500690565b600061ffff8084168061414757614147613de6565b92169190910692915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006000198214156141b9576141b9613cab565b5060010190565b6000828210156141d2576141d2613cab565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061420a90830184613846565b9695505050505050565b60006020828403121561422657600080fd5b8151612790816137e7565b634e487b7160e01b600052603160045260246000fdfe697066733a2f2f516d646237787035594a57644c7256656936766e6e68645635457972427835506474345658586f65784135516f57697066733a2f2f516d616e6b335577724757416f516252785243696d4b77376b6468677532757455653141475272397a7a7a3362462fa26469706673582212200556edddd67183038ce9cb77a5e3c3460b85125b4b11d12b626253591229fb7f64736f6c634300080a0033

Deployed Bytecode Sourcemap

47080:16069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37048:224;;;;;;;;;;-1:-1:-1;37048:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;37048:224:0;;;;;;;;47688:80;;;;;;;;;;-1:-1:-1;47688:80:0;;;;-1:-1:-1;;;;;47688:80:0;;;;;;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;47688:80:0;592:203:1;22757:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24316:221::-;;;;;;;;;;-1:-1:-1;24316:221:0;;;;;:::i;:::-;;:::i;23839:411::-;;;;;;;;;;-1:-1:-1;23839:411:0;;;;;:::i;:::-;;:::i;:::-;;47802:82;;;;;;;;;;-1:-1:-1;47802:82:0;;;;-1:-1:-1;;;;;47802:82:0;;;47484:83;;;;;;;;;;-1:-1:-1;47484:83:0;;;;-1:-1:-1;;;;;47484:83:0;;;37688:113;;;;;;;;;;-1:-1:-1;37776:10:0;:17;37688:113;;;2562:25:1;;;2550:2;2535:18;37688:113:0;2416:177:1;53646:1595:0;;;;;;:::i;:::-;;:::i;48057:40::-;;;;;;;;;;-1:-1:-1;48057:40:0;;;;;:::i;:::-;;:::i;25066:339::-;;;;;;;;;;-1:-1:-1;25066:339:0;;;;;:::i;:::-;;:::i;37356:256::-;;;;;;;;;;-1:-1:-1;37356:256:0;;;;;:::i;:::-;;:::i;50349:108::-;;;;;;;;;;-1:-1:-1;50349:108:0;;;;;:::i;:::-;;:::i;49299:484::-;;;;;;;;;;;;;:::i;47918:26::-;;;;;;;;;;-1:-1:-1;47918:26:0;;;;;:::i;:::-;;:::i;:::-;;;3486:6:1;3474:19;;;3456:38;;3444:2;3429:18;47918:26:0;3312:188:1;25476:185:0;;;;;;;;;;-1:-1:-1;25476:185:0;;;;;:::i;:::-;;:::i;37878:233::-;;;;;;;;;;-1:-1:-1;37878:233:0;;;;;:::i;:::-;;:::i;47665:16::-;;;;;;;;;;-1:-1:-1;47665:16:0;;;;-1:-1:-1;;;;;47665:16:0;;;47155:46;;;;;;;;;;;;;;;;48192:47;;;;;;;;;;-1:-1:-1;48192:47:0;;;;;:::i;:::-;;:::i;51147:872::-;;;;;;;;;;-1:-1:-1;51147:872:0;;;;;:::i;:::-;;:::i;48649:28::-;;;;;;;;;;-1:-1:-1;48649:28:0;;;;;:::i;:::-;;:::i;22451:239::-;;;;;;;;;;-1:-1:-1;22451:239:0;;;;;:::i;:::-;;:::i;22181:208::-;;;;;;;;;;-1:-1:-1;22181:208:0;;;;;:::i;:::-;;:::i;44928:103::-;;;;;;;;;;;;;:::i;44277:87::-;;;;;;;;;;-1:-1:-1;44350:6:0;;-1:-1:-1;;;;;44350:6:0;44277:87;;47304:83;;;;;;;;;;-1:-1:-1;47304:83:0;;;;-1:-1:-1;;;;;47304:83:0;;;22926:104;;;;;;;;;;;;;:::i;47214:83::-;;;;;;;;;;-1:-1:-1;47214:83:0;;;;-1:-1:-1;;;;;47214:83:0;;;50568:90;;;;;;;;;;-1:-1:-1;50568:90:0;;;;;:::i;:::-;;:::i;50956:183::-;;;;;;;;;;-1:-1:-1;50956:183:0;;;;;:::i;:::-;;:::i;24609:155::-;;;;;;;;;;-1:-1:-1;24609:155:0;;;;;:::i;:::-;;:::i;50465:95::-;;;;;;;;;;-1:-1:-1;50543:2:0;:9;50465:95;;47998:25;;;;;;;;;;-1:-1:-1;47998:25:0;;;;;:::i;:::-;;:::i;50666:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52118:1516::-;;;;;;;;;;-1:-1:-1;52118:1516:0;;;;;:::i;:::-;;:::i;25732:328::-;;;;;;;;;;-1:-1:-1;25732:328:0;;;;;:::i;:::-;;:::i;23101:334::-;;;;;;;;;;-1:-1:-1;23101:334:0;;;;;:::i;:::-;;:::i;47775:20::-;;;;;;;;;;-1:-1:-1;47775:20:0;;;;-1:-1:-1;;;;;47775:20:0;;;48104:48;;;;;;;;;;-1:-1:-1;48104:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50769:93;;;;;;;;;;;;;:::i;50179:162::-;;;;;;;;;;;;;:::i;24835:164::-;;;;;;;;;;-1:-1:-1;24835:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24956:25:0;;;24932:4;24956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24835:164;45186:201;;;;;;;;;;-1:-1:-1;45186:201:0;;;;;:::i;:::-;;:::i;47394:83::-;;;;;;;;;;-1:-1:-1;47394:83:0;;;;-1:-1:-1;;;;;47394:83:0;;;49889:103;;;;;;;;;;-1:-1:-1;49889:103:0;;;;;:::i;:::-;49982:1;49889:103;37048:224;37150:4;-1:-1:-1;;;;;;37174:50:0;;-1:-1:-1;;;37174:50:0;;:90;;;37228:36;37252:11;37228:23;:36::i;:::-;37167:97;37048:224;-1:-1:-1;;37048:224:0:o;22757:100::-;22811:13;22844:5;22837:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22757:100;:::o;24316:221::-;24392:7;27659:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27659:16:0;24412:73;;;;-1:-1:-1;;;24412:73:0;;10017:2:1;24412:73:0;;;9999:21:1;10056:2;10036:18;;;10029:30;10095:34;10075:18;;;10068:62;-1:-1:-1;;;10146:18:1;;;10139:42;10198:19;;24412:73:0;;;;;;;;;-1:-1:-1;24505:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24505:24:0;;24316:221::o;23839:411::-;23920:13;23936:23;23951:7;23936:14;:23::i;:::-;23920:39;;23984:5;-1:-1:-1;;;;;23978:11:0;:2;-1:-1:-1;;;;;23978:11:0;;;23970:57;;;;-1:-1:-1;;;23970:57:0;;10430:2:1;23970:57:0;;;10412:21:1;10469:2;10449:18;;;10442:30;10508:34;10488:18;;;10481:62;-1:-1:-1;;;10559:18:1;;;10552:31;10600:19;;23970:57:0;10228:397:1;23970:57:0;17076:10;-1:-1:-1;;;;;24062:21:0;;;;:62;;-1:-1:-1;24087:37:0;24104:5;17076:10;24835:164;:::i;24087:37::-;24040:168;;;;-1:-1:-1;;;24040:168:0;;10832:2:1;24040:168:0;;;10814:21:1;10871:2;10851:18;;;10844:30;10910:34;10890:18;;;10883:62;10981:26;10961:18;;;10954:54;11025:19;;24040:168:0;10630:420:1;24040:168:0;24221:21;24230:2;24234:7;24221:8;:21::i;:::-;23909:341;23839:411;;:::o;53646:1595::-;53713:7;53758:9;53778:11;53834:8;53930:13;53977:10;;53964:9;:23;53956:32;;;;;;54051:4;54056:3;54051:9;;;;;;;:::i;:::-;;;;54061:3;54051:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:19;:41;;;;;54074:3;54078;54074:8;;;;;;;:::i;:::-;;;;54083:3;54074:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:18;54051:41;54043:50;;;;;;54112:4;;:18;;-1:-1:-1;;;54112:18:0;;;;;11361:25:1;;;11402:18;;;11395:34;;;-1:-1:-1;;;;;54112:4:0;;;;:8;;11334:18:1;;54112::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;54104:32;;;;;;54153:29;54173:3;54178;54153:19;:29::i;:::-;54149:33;;54202:16;54216:1;54202:13;:16::i;:::-;54193:25;;54244:8;54253:1;54244:11;;;;;;;;;:::i;:::-;;54256:6;54244:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54239:24;;54274:8;54283:1;54274:11;;;;;;;;;:::i;:::-;;54286:6;54274:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;54317:4;;;;;;;;;-1:-1:-1;;;;;54317:4:0;-1:-1:-1;;;;;54317:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54308:25;;54344:4;;;;;;;;;-1:-1:-1;;;;;54344:4:0;-1:-1:-1;;;;;54344:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54370:4:0;;:51;;-1:-1:-1;;;54370:51:0;;;;;11361:25:1;;;54408:10:0;11402:18:1;;;11395:34;-1:-1:-1;;;;;54370:4:0;;;;-1:-1:-1;54370:13:0;;-1:-1:-1;11334:18:1;;54370:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54432:4:0;;54477:6;;:20;;-1:-1:-1;;;54477:20:0;;3486:6:1;3474:19;;54477:20:0;;;3456:38:1;-1:-1:-1;;;;;54432:4:0;;;;-1:-1:-1;54432:12:0;;-1:-1:-1;54445:6:0;;54477;;;;:16;;3429:18:1;;54477:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54460:38;;-1:-1:-1;;;;;;12599:41:1;;;54460:38:0;;;12587:54:1;12657:11;;54460:38:0;;;;;;;;;;;;54432:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54511:4:0;;:26;;-1:-1:-1;;;54511:26:0;;;;;13193:25:1;;;54511:4:0;13234:18:1;;;13227:34;54511:4:0;13277:18:1;;;13270:34;-1:-1:-1;;;;;54511:4:0;;;;-1:-1:-1;54511:12:0;;-1:-1:-1;13166:18:1;;54511:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54548:4:0;;:33;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54548:33:0;;-1:-1:-1;;;;;54548:4:0;;;;-1:-1:-1;54548:14:0;;-1:-1:-1;54548:33:0;;54563:6;;54548:33;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54592:4:0;;:30;;-1:-1:-1;;;54592:30:0;;;;;11361:25:1;;;-1:-1:-1;;11402:18:1;;;11395:34;-1:-1:-1;;;;;54592:4:0;;;;-1:-1:-1;54592:18:0;;-1:-1:-1;11334:18:1;;54592:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54633:4:0;;:26;;-1:-1:-1;;;54633:26:0;;;;;11361:25:1;;;-1:-1:-1;;11402:18:1;;;11395:34;-1:-1:-1;;;;;54633:4:0;;;;-1:-1:-1;54633:14:0;;-1:-1:-1;11334:18:1;;54633:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54670:4:0;;-1:-1:-1;;;;;54670:4:0;;-1:-1:-1;54670:11:0;;-1:-1:-1;54682:3:0;54687;54692:8;:6;54670:4;54692:8;:::i;:::-;54670:31;;-1:-1:-1;;;;;;54670:31:0;;;;;;;;;;13193:25:1;;;;13234:18;;;13227:34;;;;13277:18;;;13270:34;13166:18;;54670:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54712:4:0;;54737:13;:21;;-1:-1:-1;;;;;54712:4:0;;;;-1:-1:-1;54712:16:0;;-1:-1:-1;54729:6:0;;54737:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;54712:47;;;;;;-1:-1:-1;;;;;;54712:47:0;;;;;;14769:25:1;;;;54737:21:0;;;;;;;;;;;;14810:18:1;;;14803:47;14742:18;;54712:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54770:4:0;;-1:-1:-1;;;;;54770:4:0;;-1:-1:-1;54770:17:0;;-1:-1:-1;54788:8:0;:6;54770:4;54788:8;:::i;:::-;54770:27;;;;;;;;;;;;;2562:25:1;;2550:2;2535:18;;2416:177;54770:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54901:6;54882:4;;;;;;;;;-1:-1:-1;;;;;54882:4:0;-1:-1:-1;;;;;54882:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;54874:34;;;;;;54921:55;;;;;;;;-1:-1:-1;54921:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;:13;:17;;;;;;:55;;;;:::i;:::-;-1:-1:-1;54987:17:0;;;;;;;;:13;:17;;;;;55015:4;;54987:25;;;;;;;;;:::i;:::-;;;;;;;;:32;;;;;:25;;;;:32;;;;;;;;;;;;;;;;;55032:19;;;;-1:-1:-1;55032:19:0;;;:15;:19;;;;;;:36;;;;;-1:-1:-1;;55032:36:0;;;;;;;;;;55079:25;;;;;;;;;;;;;;;;:12;;;:8;:12;;;;;:25;;;;:::i;:::-;;55132:2;55115:4;55120:3;55115:9;;;;;;;:::i;:::-;;;;55125:3;55115:14;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;55168:6;55175:1;55168:8;;;;:::i;:::-;55145:3;55149;55145:8;;;;;;;:::i;:::-;;;;55154:3;55145:13;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55190:21;55196:10;55208:2;55190:21;;:5;:21::i;:::-;-1:-1:-1;;;55224:9:0;;;;-1:-1:-1;;;53646:1595:0:o;48057:40::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48057:40:0;;-1:-1:-1;48057:40:0:o;25066:339::-;25261:41;17076:10;25294:7;25261:18;:41::i;:::-;25253:103;;;;-1:-1:-1;;;25253:103:0;;;;;;;:::i;:::-;25369:28;25379:4;25385:2;25389:7;25369:9;:28::i;37356:256::-;37453:7;37489:23;37506:5;37489:16;:23::i;:::-;37481:5;:31;37473:87;;;;-1:-1:-1;;;37473:87:0;;15481:2:1;37473:87:0;;;15463:21:1;15520:2;15500:18;;;15493:30;15559:34;15539:18;;;15532:62;-1:-1:-1;;;15610:18:1;;;15603:41;15661:19;;37473:87:0;15279:407:1;37473:87:0;-1:-1:-1;;;;;;37578:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37356:256::o;50349:108::-;50405:13;50438:2;50441:7;50438:11;;;;;;;;:::i;:::-;;;;;;;;50431:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50349:108;;;:::o;49299:484::-;44350:6;;-1:-1:-1;;;;;44350:6:0;49342:10;:21;;:45;;-1:-1:-1;49381:6:0;;-1:-1:-1;;;;;49381:6:0;49367:10;:20;49342:45;:82;;;-1:-1:-1;49418:6:0;;-1:-1:-1;;;;;49418:6:0;49404:10;:20;49342:82;:106;;;-1:-1:-1;49442:6:0;;-1:-1:-1;;;;;49442:6:0;49428:10;:20;49342:106;:143;;;-1:-1:-1;49479:6:0;;-1:-1:-1;;;;;49479:6:0;49465:10;:20;49342:143;49334:152;;;;;;49559:6;;49525:21;;-1:-1:-1;;;;;49559:6:0;:33;49587:4;49575:11;49525:21;49583:3;49575:11;:::i;:::-;:16;;;;:::i;:::-;49559:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49603:6:0;;-1:-1:-1;;;;;49603:6:0;:33;49631:4;49619:11;:7;49627:3;49619:11;:::i;:::-;:16;;;;:::i;:::-;49603:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49647:6:0;;-1:-1:-1;;;;;49647:6:0;:33;49675:4;49663:11;:7;49671:3;49663:11;:::i;:::-;:16;;;;:::i;:::-;49647:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49737:6:0;;:38;;-1:-1:-1;;;;;49737:6:0;;;;49753:21;49737:38;;;;;:6;:38;:6;:38;49753:21;49737:6;:38;;;;;;;;;;;;;;;;;;;;;49323:460;49299:484::o;47918:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25476:185::-;25614:39;25631:4;25637:2;25641:7;25614:39;;;;;;;;;;;;:16;:39::i;37878:233::-;37953:7;37989:30;37776:10;:17;;37688:113;37989:30;37981:5;:38;37973:95;;;;-1:-1:-1;;;37973:95:0;;16323:2:1;37973:95:0;;;16305:21:1;16362:2;16342:18;;;16335:30;16401:34;16381:18;;;16374:62;-1:-1:-1;;;16452:18:1;;;16445:42;16504:19;;37973:95:0;16121:408:1;37973:95:0;38086:10;38097:5;38086:17;;;;;;;;:::i;:::-;;;;;;;;;38079:24;;37878:233;;;:::o;48192:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48192:47:0;;-1:-1:-1;48192:47:0:o;51147:872::-;51194:10;51215:21;;:::i;:::-;51297:17;;51247:20;;51297:17;;;;;;;51288:26;;;;51280:35;;;;;;51350:4;;:20;;-1:-1:-1;;;51350:20:0;;3486:6:1;3474:19;;51350:20:0;;;3456:38:1;-1:-1:-1;;;;;51350:4:0;;;;:12;;3429:18:1;;51350:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51350:20:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51328:42:0;;-1:-1:-1;51328:42:0;-1:-1:-1;51427:4:0;;-1:-1:-1;51328:42:0;;-1:-1:-1;51439:1:0;;-1:-1:-1;51432:9:0;;-1:-1:-1;51432:9:0;;;;;;51427:15;;;;;;;:::i;:::-;;;;51443:6;51450:1;51443:9;;;;51427:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:31;51419:40;;;;;;51495:4;;:19;;-1:-1:-1;;;51495:19:0;;;;;2562:25:1;;;-1:-1:-1;;;;;51495:4:0;;;;:12;;2535:18:1;;51495:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51495:19:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51472:42:0;;-1:-1:-1;;;;;;;;51584:26:0;;51600:10;51584:26;;-1:-1:-1;51576:35:0;;-1:-1:-1;;51576:35:0;;;;;51624:4;;:51;;-1:-1:-1;;;51624:51:0;;20628:6:1;20616:19;;51624:51:0;;;20598:38:1;51662:10:0;20652:18:1;;;20645:34;-1:-1:-1;;;;;51624:4:0;;;;:13;;20571:18:1;;51624:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51702:4:0;;:20;;-1:-1:-1;;;51702:20:0;;3486:6:1;3474:19;;51702:20:0;;;3456:38:1;-1:-1:-1;;;;;51702:4:0;;;;-1:-1:-1;51702:12:0;;-1:-1:-1;3429:18:1;;51702:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51702:20:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51686:36:0;;-1:-1:-1;;51827:10:0;51802:37;;;-1:-1:-1;51794:46:0;;-1:-1:-1;;;51794:46:0;;;;;51881:6;51853:15;:25;51869:8;51881:6;51876:1;51869:8;:::i;:::-;51853:25;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;51919:6;51898:8;:18;51907:6;51914:1;51907:8;;;;:::i;:::-;51898:18;;;;;;;;;;;;;-1:-1:-1;51898:18:0;:27;;;;:::i;:::-;-1:-1:-1;51965:8:0;:6;51972:1;51965:8;:::i;:::-;51941:9;;51936:4;;:15;;;;;;;:::i;:::-;;;;51952:6;51959:1;51952:9;;;;51936:26;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;51984:27;51990:10;52002:6;52009:1;52002:8;;;;:::i;:::-;51984:27;;:5;:27::i;:::-;51183:836;;;51147:872;:::o;48649:28::-;;;;;;;;;;;;;;;;;;;;;;22451:239;22523:7;22559:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22559:16:0;22594:19;22586:73;;;;-1:-1:-1;;;22586:73:0;;21121:2:1;22586:73:0;;;21103:21:1;21160:2;21140:18;;;21133:30;21199:34;21179:18;;;21172:62;-1:-1:-1;;;21250:18:1;;;21243:39;21299:19;;22586:73:0;20919:405:1;22181:208:0;22253:7;-1:-1:-1;;;;;22281:19:0;;22273:74;;;;-1:-1:-1;;;22273:74:0;;21531:2:1;22273:74:0;;;21513:21:1;21570:2;21550:18;;;21543:30;21609:34;21589:18;;;21582:62;-1:-1:-1;;;21660:18:1;;;21653:40;21710:19;;22273:74:0;21329:406:1;22273:74:0;-1:-1:-1;;;;;;22365:16:0;;;;;:9;:16;;;;;;;22181:208::o;44928:103::-;44350:6;;-1:-1:-1;;;;;44350:6:0;17076:10;44497:23;44489:68;;;;-1:-1:-1;;;44489:68:0;;;;;;;:::i;:::-;44993:30:::1;45020:1;44993:18;:30::i;:::-;44928:103::o:0;22926:104::-;22982:13;23015:7;23008:14;;;;;:::i;50568:90::-;44350:6;;-1:-1:-1;;;;;44350:6:0;17076:10;44497:23;44489:68;;;;-1:-1:-1;;;44489:68:0;;;;;;;:::i;:::-;50638:2:::1;:12:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;50638:12:0;;;;::::1;::::0;;::::1;50646:3:::0;;50638:12:::1;:::i;50956:183::-:0;44350:6;;-1:-1:-1;;;;;44350:6:0;17076:10;44497:23;44489:68;;;;-1:-1:-1;;;44489:68:0;;;;;;;:::i;:::-;51015:21:::1;;:::i;:::-;51064:4;::::0;:20:::1;::::0;-1:-1:-1;;;51064:20:0;;3486:6:1;3474:19;;51064:20:0::1;::::0;::::1;3456:38:1::0;-1:-1:-1;;;;;51064:4:0;;::::1;::::0;:12:::1;::::0;3429:18:1;;51064:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;51064:20:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51047:37:0;;-1:-1:-1;51123:8:0::1;::::0;-1:-1:-1;51123:6:0;;-1:-1:-1;51130:1:0::1;::::0;-1:-1:-1;51123:8:0::1;::::0;-1:-1:-1;;51123:8:0:i:1;:::-;51099:9:::0;;51095:3:::1;::::0;:14:::1;::::0;::::1;;;;;:::i;:::-;;;;51110:6:::0;51117:1:::1;51110:9;;;;51095:25;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;51004:135;50956:183:::0;:::o;24609:155::-;24704:52;17076:10;24737:8;24747;24704:18;:52::i;47998:25::-;;;;;;;;;;;50666:91;50705:21;;:::i;:::-;50739:10;;;;;;;;;50746:3;50739:10;-1:-1:-1;50739:10:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50739:10:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50666:91;:::o;52118:1516::-;52188:9;52242:8;52338:13;52362:10;52383:21;;:::i;:::-;52466:17;;52415:20;;52466:17;;;;;;;52456:27;;;;;52448:36;;;;;;52519:4;;:20;;-1:-1:-1;;;52519:20:0;;3486:6:1;3474:19;;52519:20:0;;;3456:38:1;-1:-1:-1;;;;;52519:4:0;;;;:12;;3429:18:1;;52519:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52519:20:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52497:42:0;;-1:-1:-1;52497:42:0;-1:-1:-1;52596:4:0;;-1:-1:-1;52497:42:0;;-1:-1:-1;52608:1:0;;-1:-1:-1;52601:9:0;;-1:-1:-1;52601:9:0;;;;;;52596:15;;;;;;;:::i;:::-;;;;52612:6;52619:1;52612:9;;;;52596:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:31;52588:40;;;;;;52664:4;;:19;;-1:-1:-1;;;52664:19:0;;;;;2562:25:1;;;-1:-1:-1;;;;;52664:4:0;;;;:12;;2535:18:1;;52664:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52664:19:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52641:42:0;;-1:-1:-1;;;;;;;;52753:26:0;;52769:10;52753:26;;-1:-1:-1;52745:35:0;;-1:-1:-1;;52745:35:0;;;;;52817:9;;;52828;;;52797:41;;52817:9;52797:19;:41::i;:::-;52793:45;;52858:16;52872:1;52858:13;:16::i;:::-;52849:25;;52900:8;52909:1;52900:11;;;;;;;;;:::i;:::-;;52912:6;52900:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52895:24;;52930:8;52939:1;52930:11;;;;;;;;;:::i;:::-;;52942:6;52930:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;52964:4;;:51;;-1:-1:-1;;;52964:51:0;;20616:19:1;;;52964:51:0;;;20598:38:1;53002:10:0;20652:18:1;;;20645:34;-1:-1:-1;;;;;52964:4:0;;-1:-1:-1;52964:13:0;;20571:18:1;;52964:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53026:4:0;;53071:6;;:20;;-1:-1:-1;;;53071:20:0;;3486:6:1;3474:19;;53071:20:0;;;3456:38:1;-1:-1:-1;;;;;53026:4:0;;;;-1:-1:-1;53026:12:0;;-1:-1:-1;53039:6:0;;53071;;;;:16;;3429:18:1;;53071:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53054:38;;-1:-1:-1;;;;;;12599:41:1;;;53054:38:0;;;12587:54:1;12657:11;;53054:38:0;;;;;;;;;;;;53026:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53105:4:0;;53130:13;:21;;-1:-1:-1;;;;;53105:4:0;;;;-1:-1:-1;53105:16:0;;-1:-1:-1;53122:6:0;;53130:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;53105:47;;;;;;-1:-1:-1;;;;;;53105:47:0;;;53130:21;22624:15:1;;;53105:47:0;;;22606:34:1;53130:21:0;;;;;;;;;;;;;22656:18:1;;;22649:43;22554:18;;53105:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53179:4:0;;:20;;-1:-1:-1;;;53179:20:0;;3486:6:1;3474:19;;53179:20:0;;;3456:38:1;-1:-1:-1;;;;;53179:4:0;;;;-1:-1:-1;53179:12:0;;-1:-1:-1;3429:18:1;;53179:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53179:20:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53163:36:0;;-1:-1:-1;;53304:10:0;53279:37;;;-1:-1:-1;53271:46:0;;-1:-1:-1;;;53271:46:0;;;;;53330:55;;;;;;;;-1:-1:-1;53330:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;:13;:17;;;;;;:55;;;;:::i;:::-;-1:-1:-1;53396:17:0;;;;;;;;:13;:17;;;;;53424:4;;53396:25;;;;;;;;;:::i;:::-;;;;;;;;:32;;;;;:25;;;;:32;;;;;;;;;;;;;;;;;53441:19;;;;-1:-1:-1;53441:19:0;;;:15;:19;;;;;;:28;;;;;-1:-1:-1;;53441:28:0;;;;;;;;;;53480:8;:12;;;;;:21;;53495:6;53480:21;;:::i;:::-;-1:-1:-1;53517:9:0;;53541:2;;53512:4;;:15;;;;;;;:::i;:::-;;;;53528:6;53535:1;53528:9;;;;53512:26;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;53582:6;53589:1;53582:8;;;;:::i;:::-;53558:9;;53554:3;;:14;;;;;;;:::i;:::-;;;;53569:6;53576:1;53569:9;;;;53554:25;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53603:21;53609:10;53621:2;53603:21;;:5;:21::i;:::-;52157:1477;;;;;;52118:1516;:::o;25732:328::-;25907:41;17076:10;25940:7;25907:18;:41::i;:::-;25899:103;;;;-1:-1:-1;;;25899:103:0;;;;;;;:::i;:::-;26013:39;26027:4;26033:2;26037:7;26046:5;26013:13;:39::i;23101:334::-;27635:4;27659:16;;;:7;:16;;;;;;23174:13;;-1:-1:-1;;;;;27659:16:0;23200:76;;;;-1:-1:-1;;;23200:76:0;;22905:2:1;23200:76:0;;;22887:21:1;22944:2;22924:18;;;22917:30;22983:34;22963:18;;;22956:62;-1:-1:-1;;;23034:18:1;;;23027:45;23089:19;;23200:76:0;22703:411:1;23200:76:0;23289:21;23313:10;:8;:10::i;:::-;23289:34;;23365:1;23347:7;23341:21;:25;:86;;;;;;;;;;;;;;;;;23393:7;23402:18;:7;:16;:18::i;:::-;23376:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23341:86;23334:93;23101:334;-1:-1:-1;;;23101:334:0:o;50769:93::-;50809:21;;:::i;:::-;50843:11;;;;;;;;;50850:4;50843:11;-1:-1:-1;50843:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50843:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50179:162;50223:13;50249:62;;;;;;;;;;;;;;;;;;;50179:162;:::o;45186:201::-;44350:6;;-1:-1:-1;;;;;44350:6:0;17076:10;44497:23;44489:68;;;;-1:-1:-1;;;44489:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45275:22:0;::::1;45267:73;;;::::0;-1:-1:-1;;;45267:73:0;;23796:2:1;45267:73:0::1;::::0;::::1;23778:21:1::0;23835:2;23815:18;;;23808:30;23874:34;23854:18;;;23847:62;-1:-1:-1;;;23925:18:1;;;23918:36;23971:19;;45267:73:0::1;23594:402:1::0;45267:73:0::1;45351:28;45370:8;45351:18;:28::i;:::-;45186:201:::0;:::o;21812:305::-;21914:4;-1:-1:-1;;;;;;21951:40:0;;-1:-1:-1;;;21951:40:0;;:105;;-1:-1:-1;;;;;;;22008:48:0;;-1:-1:-1;;;22008:48:0;21951:105;:158;;;-1:-1:-1;;;;;;;;;;20346:40:0;;;22073:36;20237:157;31716:174;31791:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31791:29:0;-1:-1:-1;;;;;31791:29:0;;;;;;;;:24;;31845:23;31791:24;31845:14;:23::i;:::-;-1:-1:-1;;;;;31836:46:0;;;;;;;;;;;31716:174;;:::o;55249:533::-;55321:6;;55395:2;55388:3;:9;;55364:46;;;;;55408:2;55401:3;:9;;55364:46;55361:395;;;-1:-1:-1;55431:1:0;55361:395;;;55472:2;55465:3;:9;;55453:34;;;;;55485:2;55478:3;:9;;55453:34;:47;;;;;55498:2;55491:3;:9;;55453:47;55450:306;;;-1:-1:-1;55521:1:0;55450:306;;;55550:2;55543:3;:9;;:22;;;;;55563:2;55556:3;:9;;55543:22;:35;;;;;55576:2;55569:3;:9;;55543:35;:48;;;;;55589:2;55582:3;:9;;55543:48;55540:216;;;-1:-1:-1;55612:1:0;55540:216;;;55641:2;55634:3;:9;;:21;;;;-1:-1:-1;55647:8:0;55634:21;:34;;;;;55666:2;55659:3;:9;;55634:34;:47;;;;;55679:2;55672:3;:9;;55634:47;55631:125;;;-1:-1:-1;55702:1:0;55773;55249:533;-1:-1:-1;;;55249:533:0:o;55837:1447::-;55893:6;55912:8;55973;56095;56149:13;56290:16;56308:15;56273:51;;;;;;;;24158:19:1;;;24202:2;24193:12;;24186:28;24239:2;24230:12;;24001:247;56273:51:0;;;;-1:-1:-1;;56273:51:0;;;;;;;;;56263:62;;56273:51;56263:62;;;;;-1:-1:-1;56343:9:0;56349:3;56263:62;56343:9;:::i;:::-;56337:15;;56372:2;56366:3;:8;56363:373;;;56421:1;56417:5;;56363:373;;;56450:2;56443:3;:9;;:21;;;;;56462:2;56456:3;:8;56443:21;56440:296;;;56510:1;56506:5;;56440:296;;;56539:2;56532:3;:9;;:21;;;;;56551:2;56545:3;:8;56532:21;56529:207;;;56597:1;56593:5;;56529:207;;;56626:2;56619:3;:9;;:22;;;;;56638:3;56632;:9;56619:22;56616:120;;;56682:1;56678:5;;56616:120;56880:1;56876:5;;56872:177;56888:1;56883;:6;;;56872:177;;56930:1;56921:5;56925:1;56921;:5;:::i;:::-;56920:11;;;;:::i;:::-;56911:20;;56972:13;56986:1;56972:16;;;;;;;;;:::i;:::-;;56989:6;56972:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56949:47;;:8;56958:1;56949:11;;;;;;;;;:::i;:::-;;56961:6;56949:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:47;;;56946:92;;57017:5;;56946:92;56891:3;;;;:::i;:::-;;;;56872:177;;;57146:1;57142;:5;;;57139:45;;;57164:8;;;57139:45;57270:6;55837:1447;-1:-1:-1;;;;;55837:1447:0:o;29548:439::-;-1:-1:-1;;;;;29628:16:0;;29620:61;;;;-1:-1:-1;;;29620:61:0;;24756:2:1;29620:61:0;;;24738:21:1;;;24775:18;;;24768:30;24834:34;24814:18;;;24807:62;24886:18;;29620:61:0;24554:356:1;29620:61:0;27635:4;27659:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27659:16:0;:30;29692:58;;;;-1:-1:-1;;;29692:58:0;;25117:2:1;29692:58:0;;;25099:21:1;25156:2;25136:18;;;25129:30;25195;25175:18;;;25168:58;25243:18;;29692:58:0;24915:352:1;29692:58:0;29763:45;29792:1;29796:2;29800:7;29763:20;:45::i;:::-;-1:-1:-1;;;;;29821:13:0;;;;;;:9;:13;;;;;:18;;29838:1;;29821:13;:18;;29838:1;;29821:18;:::i;:::-;;;;-1:-1:-1;;29850:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29850:21:0;-1:-1:-1;;;;;29850:21:0;;;;;;;;29889:33;;29850:16;;;29889:33;;29850:16;;29889:33;49737:38;49323:460;49299:484::o;27864:348::-;27957:4;27659:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27659:16:0;27974:73;;;;-1:-1:-1;;;27974:73:0;;25474:2:1;27974:73:0;;;25456:21:1;25513:2;25493:18;;;25486:30;25552:34;25532:18;;;25525:62;-1:-1:-1;;;25603:18:1;;;25596:42;25655:19;;27974:73:0;25272:408:1;27974:73:0;28058:13;28074:23;28089:7;28074:14;:23::i;:::-;28058:39;;28127:5;-1:-1:-1;;;;;28116:16:0;:7;-1:-1:-1;;;;;28116:16:0;;:51;;;;28160:7;-1:-1:-1;;;;;28136:31:0;:20;28148:7;28136:11;:20::i;:::-;-1:-1:-1;;;;;28136:31:0;;28116:51;:87;;;-1:-1:-1;;;;;;24956:25:0;;;24932:4;24956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28171:32;28108:96;27864:348;-1:-1:-1;;;;27864:348:0:o;62897:247::-;63022:4;;63036:32;;;;63022:4;63036:32;;;:15;:32;;;;;;;;63022:69;;-1:-1:-1;;;63022:69:0;;63036:32;;63022:69;;;20598:38:1;-1:-1:-1;;;;;63070:20:0;;;20652:18:1;;;20645:34;63022:4:0;;;;:13;;20571:18:1;;63022:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63102:34;63118:4;63124:2;63128:7;63102:15;:34::i;45547:191::-;45640:6;;;-1:-1:-1;;;;;45657:17:0;;;-1:-1:-1;;;;;;45657:17:0;;;;;;;45690:40;;45640:6;;;45657:17;45640:6;;45690:40;;45621:16;;45690:40;45610:128;45547:191;:::o;32032:315::-;32187:8;-1:-1:-1;;;;;32178:17:0;:5;-1:-1:-1;;;;;32178:17:0;;;32170:55;;;;-1:-1:-1;;;32170:55:0;;25887:2:1;32170:55:0;;;25869:21:1;25926:2;25906:18;;;25899:30;25965:27;25945:18;;;25938:55;26010:18;;32170:55:0;25685:349:1;32170:55:0;-1:-1:-1;;;;;32236:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32236:46:0;;;;;;;;;;32298:41;;540::1;;;32298::0;;513:18:1;32298:41:0;;;;;;;32032:315;;;:::o;26942:::-;27099:28;27109:4;27115:2;27119:7;27099:9;:28::i;:::-;27146:48;27169:4;27175:2;27179:7;27188:5;27146:22;:48::i;:::-;27138:111;;;;-1:-1:-1;;;27138:111:0;;;;;;;:::i;50000:171::-;50052:13;50078:63;;;;;;;;;;;;;;;;;;;50000:171;:::o;17594:723::-;17650:13;17871:10;17867:53;;-1:-1:-1;;17898:10:0;;;;;;;;;;;;-1:-1:-1;;;17898:10:0;;;;;17594:723::o;17867:53::-;17945:5;17930:12;17986:78;17993:9;;17986:78;;18019:8;;;;:::i;:::-;;-1:-1:-1;18042:10:0;;-1:-1:-1;18050:2:0;18042:10;;:::i;:::-;;;17986:78;;;18074:19;18106:6;18096:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18096:17:0;;18074:39;;18124:154;18131:10;;18124:154;;18158:11;18168:1;18158:11;;:::i;:::-;;-1:-1:-1;18227:10:0;18235:2;18227:5;:10;:::i;:::-;18214:24;;:2;:24;:::i;:::-;18201:39;;18184:6;18191;18184:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18184:56:0;;;;;;;;-1:-1:-1;18255:11:0;18264:2;18255:11;;:::i;:::-;;;18124:154;;38724:589;-1:-1:-1;;;;;38930:18:0;;38926:187;;38965:40;38997:7;40140:10;:17;;40113:24;;;;:15;:24;;;;;:44;;;40168:24;;;;;;;;;;;;40036:164;38965:40;38926:187;;;39035:2;-1:-1:-1;;;;;39027:10:0;:4;-1:-1:-1;;;;;39027:10:0;;39023:90;;39054:47;39087:4;39093:7;39054:32;:47::i;:::-;-1:-1:-1;;;;;39127:16:0;;39123:183;;39160:45;39197:7;39160:36;:45::i;39123:183::-;39233:4;-1:-1:-1;;;;;39227:10:0;:2;-1:-1:-1;;;;;39227:10:0;;39223:83;;39254:40;39282:2;39286:7;39254:27;:40::i;30973:625::-;31132:4;-1:-1:-1;;;;;31105:31:0;:23;31120:7;31105:14;:23::i;:::-;-1:-1:-1;;;;;31105:31:0;;31097:81;;;;-1:-1:-1;;;31097:81:0;;26930:2:1;31097:81:0;;;26912:21:1;26969:2;26949:18;;;26942:30;27008:34;26988:18;;;26981:62;-1:-1:-1;;;27059:18:1;;;27052:35;27104:19;;31097:81:0;26728:401:1;31097:81:0;-1:-1:-1;;;;;31197:16:0;;31189:65;;;;-1:-1:-1;;;31189:65:0;;27336:2:1;31189:65:0;;;27318:21:1;27375:2;27355:18;;;27348:30;27414:34;27394:18;;;27387:62;-1:-1:-1;;;27465:18:1;;;27458:34;27509:19;;31189:65:0;27134:400:1;31189:65:0;31267:39;31288:4;31294:2;31298:7;31267:20;:39::i;:::-;31371:29;31388:1;31392:7;31371:8;:29::i;:::-;-1:-1:-1;;;;;31413:15:0;;;;;;:9;:15;;;;;:20;;31432:1;;31413:15;:20;;31432:1;;31413:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31444:13:0;;;;;;:9;:13;;;;;:18;;31461:1;;31444:13;:18;;31461:1;;31444:18;:::i;:::-;;;;-1:-1:-1;;31473:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31473:21:0;-1:-1:-1;;;;;31473:21:0;;;;;;;;;31512:27;;31473:16;;31512:27;;;;;;;23909:341;23839:411;;:::o;32912:799::-;33067:4;-1:-1:-1;;;;;33088:13:0;;9290:20;9338:8;33084:620;;33124:72;;-1:-1:-1;;;33124:72:0;;-1:-1:-1;;;;;33124:36:0;;;;;:72;;17076:10;;33175:4;;33181:7;;33190:5;;33124:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33124:72:0;;;;;;;;-1:-1:-1;;33124:72:0;;;;;;;;;;;;:::i;:::-;;;33120:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33366:13:0;;33362:272;;33409:60;;-1:-1:-1;;;33409:60:0;;;;;;;:::i;33362:272::-;33584:6;33578:13;33569:6;33565:2;33561:15;33554:38;33120:529;-1:-1:-1;;;;;;33247:51:0;-1:-1:-1;;;33247:51:0;;-1:-1:-1;33240:58:0;;33084:620;-1:-1:-1;33688:4:0;32912:799;;;;;;:::o;40827:988::-;41093:22;41143:1;41118:22;41135:4;41118:16;:22::i;:::-;:26;;;;:::i;:::-;41155:18;41176:26;;;:17;:26;;;;;;41093:51;;-1:-1:-1;41309:28:0;;;41305:328;;-1:-1:-1;;;;;41376:18:0;;41354:19;41376:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41427:30;;;;;;:44;;;41544:30;;:17;:30;;;;;:43;;;41305:328;-1:-1:-1;41729:26:0;;;;:17;:26;;;;;;;;41722:33;;;-1:-1:-1;;;;;41773:18:0;;;;;:12;:18;;;;;:34;;;;;;;41766:41;40827:988::o;42110:1079::-;42388:10;:17;42363:22;;42388:21;;42408:1;;42388:21;:::i;:::-;42420:18;42441:24;;;:15;:24;;;;;;42814:10;:26;;42363:46;;-1:-1:-1;42441:24:0;;42363:46;;42814:26;;;;;;:::i;:::-;;;;;;;;;42792:48;;42878:11;42853:10;42864;42853:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42958:28;;;:15;:28;;;;;;;:41;;;43130:24;;;;;43123:31;43165:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42181:1008;;;42110:1079;:::o;39614:221::-;39699:14;39716:20;39733:2;39716:16;:20::i;:::-;-1:-1:-1;;;;;39747:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39792:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39614:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;800:258::-;872:1;882:113;896:6;893:1;890:13;882:113;;;972:11;;;966:18;953:11;;;946:39;918:2;911:10;882:113;;;1013:6;1010:1;1007:13;1004:48;;;-1:-1:-1;;1048:1:1;1030:16;;1023:27;800:258::o;1063:::-;1105:3;1143:5;1137:12;1170:6;1165:3;1158:19;1186:63;1242:6;1235:4;1230:3;1226:14;1219:4;1212:5;1208:16;1186:63;:::i;:::-;1303:2;1282:15;-1:-1:-1;;1278:29:1;1269:39;;;;1310:4;1265:50;;1063:258;-1:-1:-1;;1063:258:1:o;1326:220::-;1475:2;1464:9;1457:21;1438:4;1495:45;1536:2;1525:9;1521:18;1513:6;1495:45;:::i;1551:180::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;-1:-1:-1;1702:23:1;;1551:180;-1:-1:-1;1551:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2598:248::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;-1:-1:-1;;2766:23:1;;;2836:2;2821:18;;;2808:32;;-1:-1:-1;2598:248:1:o;2851:456::-;2928:6;2936;2944;2997:2;2985:9;2976:7;2972:23;2968:32;2965:52;;;3013:1;3010;3003:12;2965:52;3052:9;3039:23;3071:31;3096:5;3071:31;:::i;:::-;3121:5;-1:-1:-1;3178:2:1;3163:18;;3150:32;3191:33;3150:32;3191:33;:::i;:::-;2851:456;;3243:7;;-1:-1:-1;;;3297:2:1;3282:18;;;;3269:32;;2851:456::o;3726:159::-;3793:20;;3853:6;3842:18;;3832:29;;3822:57;;3875:1;3872;3865:12;3822:57;3726:159;;;:::o;3890:252::-;3957:6;3965;4018:2;4006:9;3997:7;3993:23;3989:32;3986:52;;;4034:1;4031;4024:12;3986:52;4057:28;4075:9;4057:28;:::i;4147:184::-;4205:6;4258:2;4246:9;4237:7;4233:23;4229:32;4226:52;;;4274:1;4271;4264:12;4226:52;4297:28;4315:9;4297:28;:::i;4336:247::-;4395:6;4448:2;4436:9;4427:7;4423:23;4419:32;4416:52;;;4464:1;4461;4454:12;4416:52;4503:9;4490:23;4522:31;4547:5;4522:31;:::i;4588:592::-;4659:6;4667;4720:2;4708:9;4699:7;4695:23;4691:32;4688:52;;;4736:1;4733;4726:12;4688:52;4776:9;4763:23;4805:18;4846:2;4838:6;4835:14;4832:34;;;4862:1;4859;4852:12;4832:34;4900:6;4889:9;4885:22;4875:32;;4945:7;4938:4;4934:2;4930:13;4926:27;4916:55;;4967:1;4964;4957:12;4916:55;5007:2;4994:16;5033:2;5025:6;5022:14;5019:34;;;5049:1;5046;5039:12;5019:34;5094:7;5089:2;5080:6;5076:2;5072:15;5068:24;5065:37;5062:57;;;5115:1;5112;5105:12;5062:57;5146:2;5138:11;;;;;5168:6;;-1:-1:-1;4588:592:1;;-1:-1:-1;;;;4588:592:1:o;5185:118::-;5271:5;5264:13;5257:21;5250:5;5247:32;5237:60;;5293:1;5290;5283:12;5308:382;5373:6;5381;5434:2;5422:9;5413:7;5409:23;5405:32;5402:52;;;5450:1;5447;5440:12;5402:52;5489:9;5476:23;5508:31;5533:5;5508:31;:::i;:::-;5558:5;-1:-1:-1;5615:2:1;5600:18;;5587:32;5628:30;5587:32;5628:30;:::i;:::-;5677:7;5667:17;;;5308:382;;;;;:::o;5695:981::-;5923:5;5908:21;;5912:9;6006:6;5881:4;;6061:609;6129:4;6164:2;6159:3;6156:11;6146:32;;6171:5;;;6146:32;6201:13;;6240:3;6323:1;6337:247;6353:2;6348:3;6345:11;6337:247;;;6428:15;;6445:6;6424:28;6410:43;;6480:4;6553:17;;;;6510:14;;;;6375:1;6366:11;6337:247;;;-1:-1:-1;;;6613:6:1;6604:16;;;;;-1:-1:-1;6655:4:1;6643:17;;;;;6092:1;6083:11;6061:609;;;6065:3;;;;5695:981;;;;:::o;6681:127::-;6742:10;6737:3;6733:20;6730:1;6723:31;6773:4;6770:1;6763:15;6797:4;6794:1;6787:15;6813:252;6885:2;6879:9;6927:3;6915:16;;6961:18;6946:34;;6982:22;;;6943:62;6940:88;;;7008:18;;:::i;:::-;7044:2;7037:22;6813:252;:::o;7070:275::-;7141:2;7135:9;7206:2;7187:13;;-1:-1:-1;;7183:27:1;7171:40;;7241:18;7226:34;;7262:22;;;7223:62;7220:88;;;7288:18;;:::i;:::-;7324:2;7317:22;7070:275;;-1:-1:-1;7070:275:1:o;7350:186::-;7398:4;7431:18;7423:6;7420:30;7417:56;;;7453:18;;:::i;:::-;-1:-1:-1;7519:2:1;7498:15;-1:-1:-1;;7494:29:1;7525:4;7490:40;;7350:186::o;7541:1016::-;7636:6;7644;7652;7660;7713:3;7701:9;7692:7;7688:23;7684:33;7681:53;;;7730:1;7727;7720:12;7681:53;7769:9;7756:23;7788:31;7813:5;7788:31;:::i;:::-;7838:5;-1:-1:-1;7895:2:1;7880:18;;7867:32;7908:33;7867:32;7908:33;:::i;:::-;7960:7;-1:-1:-1;8014:2:1;7999:18;;7986:32;;-1:-1:-1;8069:2:1;8054:18;;8041:32;8096:18;8085:30;;8082:50;;;8128:1;8125;8118:12;8082:50;8151:22;;8204:4;8196:13;;8192:27;-1:-1:-1;8182:55:1;;8233:1;8230;8223:12;8182:55;8269:2;8256:16;8294:48;8310:31;8338:2;8310:31;:::i;:::-;8294:48;:::i;:::-;8365:2;8358:5;8351:17;8405:7;8400:2;8395;8391;8387:11;8383:20;8380:33;8377:53;;;8426:1;8423;8416:12;8377:53;8481:2;8476;8472;8468:11;8463:2;8456:5;8452:14;8439:45;8525:1;8520:2;8515;8508:5;8504:14;8500:23;8493:34;8546:5;8536:15;;;;;7541:1016;;;;;;;:::o;8785:388::-;8853:6;8861;8914:2;8902:9;8893:7;8889:23;8885:32;8882:52;;;8930:1;8927;8920:12;8882:52;8969:9;8956:23;8988:31;9013:5;8988:31;:::i;:::-;9038:5;-1:-1:-1;9095:2:1;9080:18;;9067:32;9108:33;9067:32;9108:33;:::i;9430:380::-;9509:1;9505:12;;;;9552;;;9573:61;;9627:4;9619:6;9615:17;9605:27;;9573:61;9680:2;9672:6;9669:14;9649:18;9646:38;9643:161;;;9726:10;9721:3;9717:20;9714:1;9707:31;9761:4;9758:1;9751:15;9789:4;9786:1;9779:15;9643:161;;9430:380;;;:::o;11055:127::-;11116:10;11111:3;11107:20;11104:1;11097:31;11147:4;11144:1;11137:15;11171:4;11168:1;11161:15;11440:184;11510:6;11563:2;11551:9;11542:7;11538:23;11534:32;11531:52;;;11579:1;11576;11569:12;11531:52;-1:-1:-1;11602:16:1;;11440:184;-1:-1:-1;11440:184:1:o;11629:127::-;11690:10;11685:3;11681:20;11678:1;11671:31;11721:4;11718:1;11711:15;11745:4;11742:1;11735:15;11761:197;11799:3;11827:6;11868:2;11861:5;11857:14;11895:2;11886:7;11883:15;11880:41;;;11901:18;;:::i;:::-;11950:1;11937:15;;11761:197;-1:-1:-1;;;11761:197:1:o;12157:298::-;12226:6;12279:2;12267:9;12258:7;12254:23;12250:32;12247:52;;;12295:1;12292;12285:12;12247:52;12321:16;;-1:-1:-1;;;;;;12366:40:1;;12356:51;;12346:79;;12421:1;12418;12411:12;12679:291;12856:6;12845:9;12838:25;12899:2;12894;12883:9;12879:18;12872:30;12819:4;12919:45;12960:2;12949:9;12945:18;12937:6;12919:45;:::i;13315:553::-;13535:25;;;13523:2;13508:18;;13579:2;13601:18;;;13661:6;13481:4;13695:167;13709:4;13706:1;13703:11;13695:167;;;13768:13;;13756:26;;13802:12;;;;13837:15;;;;13729:1;13722:9;13695:167;;;13699:3;;;;13315:553;;;;;:::o;14139:128::-;14179:3;14210:1;14206:6;14203:1;14200:13;14197:39;;;14216:18;;:::i;:::-;-1:-1:-1;14252:9:1;;14139:128::o;14861:413::-;15063:2;15045:21;;;15102:2;15082:18;;;15075:30;15141:34;15136:2;15121:18;;15114:62;-1:-1:-1;;;15207:2:1;15192:18;;15185:47;15264:3;15249:19;;14861:413::o;15691:168::-;15731:7;15797:1;15793;15789:6;15785:14;15782:1;15779:21;15774:1;15767:9;15760:17;15756:45;15753:71;;;15804:18;;:::i;:::-;-1:-1:-1;15844:9:1;;15691:168::o;15864:127::-;15925:10;15920:3;15916:20;15913:1;15906:31;15956:4;15953:1;15946:15;15980:4;15977:1;15970:15;15996:120;16036:1;16062;16052:35;;16067:18;;:::i;:::-;-1:-1:-1;16101:9:1;;15996:120::o;16534:429::-;16588:5;16641:3;16634:4;16626:6;16622:17;16618:27;16608:55;;16659:1;16656;16649:12;16608:55;16688:6;16682:13;16719:48;16735:31;16763:2;16735:31;:::i;16719:48::-;16792:2;16783:7;16776:19;16838:3;16831:4;16826:2;16818:6;16814:15;16810:26;16807:35;16804:55;;;16855:1;16852;16845:12;16804:55;16868:64;16929:2;16922:4;16913:7;16909:18;16902:4;16894:6;16890:17;16868:64;:::i;16968:683::-;17040:5;17093:3;17086:4;17078:6;17074:17;17070:27;17060:55;;17111:1;17108;17101:12;17060:55;17144:2;17138:9;17166:3;17208:2;17200:6;17196:15;17277:6;17265:10;17262:22;17241:18;17229:10;17226:34;17223:62;17220:88;;;17288:18;;:::i;:::-;17324:2;17317:22;17388:15;;17359:6;17415:15;;;17412:35;;;17443:1;17440;17433:12;17412:35;17467:6;17482:139;17498:6;17493:3;17490:15;17482:139;;;17566:10;;17554:23;;17606:4;17597:14;;;;17515;17482:139;;;-1:-1:-1;17639:6:1;;16968:683;-1:-1:-1;;;;;16968:683:1:o;17656:650::-;17717:5;17770:3;17763:4;17755:6;17751:17;17747:27;17737:55;;17788:1;17785;17778:12;17737:55;17821:2;17815:9;17863:2;17855:6;17851:15;17932:6;17920:10;17917:22;17896:18;17884:10;17881:34;17878:62;17875:88;;;17943:18;;:::i;:::-;17983:10;17979:2;17972:22;;18014:6;18055:2;18047:6;18043:15;18081:3;18073:6;18070:15;18067:35;;;18098:1;18095;18088:12;18067:35;18122:6;18137:139;18153:6;18148:3;18145:15;18137:139;;;18221:10;;18209:23;;18261:4;18252:14;;;;18170;18137:139;;18311:1330;18510:6;18518;18526;18534;18542;18550;18558;18611:3;18599:9;18590:7;18586:23;18582:33;18579:53;;;18628:1;18625;18618:12;18579:53;18657:9;18651:16;18641:26;;18686:2;18732;18721:9;18717:18;18711:25;18759:18;18751:6;18748:30;18745:50;;;18791:1;18788;18781:12;18745:50;18814:61;18867:7;18858:6;18847:9;18843:22;18814:61;:::i;:::-;18804:71;;;18918:7;18913:2;18902:9;18898:18;18894:32;18884:60;;18940:1;18937;18930:12;18884:60;18964:22;;:::i;:::-;19008:3;19049;19038:9;19034:19;19076:7;19068:6;19065:19;19062:39;;;19097:1;19094;19087:12;19062:39;19136:2;19125:9;19121:18;19148:207;19164:6;19159:3;19156:15;19148:207;;;19237:3;19231:10;19254:28;19276:5;19254:28;:::i;:::-;19295:18;;19333:12;;;;19181;;19148:207;;;19152:3;19374:5;19364:15;;19398:63;19453:7;19445:6;19398:63;:::i;:::-;19388:73;;;;;;19480:65;19537:7;19531:3;19520:9;19516:19;19480:65;:::i;:::-;19470:75;;19585:3;19574:9;19570:19;19564:26;19554:36;;19630:3;19619:9;19615:19;19609:26;19599:36;;18311:1330;;;;;;;;;;:::o;19646:774::-;19780:6;19788;19796;19804;19812;19820;19828;19881:3;19869:9;19860:7;19856:23;19852:33;19849:53;;;19898:1;19895;19888:12;19849:53;19930:9;19924:16;19949:31;19974:5;19949:31;:::i;:::-;20048:2;20033:18;;20027:25;19999:5;;-1:-1:-1;20075:18:1;20064:30;;20061:50;;;20107:1;20104;20097:12;20061:50;20130:61;20183:7;20174:6;20163:9;20159:22;20130:61;:::i;:::-;20231:2;20216:18;;20210:25;20275:2;20260:18;;20254:25;20319:3;20304:19;;20298:26;20364:3;20349:19;;20343:26;20409:3;20394:19;;;20388:26;19646:774;;20120:71;;-1:-1:-1;20210:25:1;;20254;;20298:26;;-1:-1:-1;20343:26:1;-1:-1:-1;20388:26:1;-1:-1:-1;19646:774:1;-1:-1:-1;;;;19646:774:1:o;20690:224::-;20729:3;20757:6;20790:2;20787:1;20783:10;20820:2;20817:1;20813:10;20851:3;20847:2;20843:12;20838:3;20835:21;20832:47;;;20859:18;;:::i;:::-;20895:13;;20690:224;-1:-1:-1;;;;20690:224:1:o;21740:356::-;21942:2;21924:21;;;21961:18;;;21954:30;22020:34;22015:2;22000:18;;21993:62;22087:2;22072:18;;21740:356::o;22101:303::-;22289:6;22281;22277:19;22266:9;22259:38;22333:2;22328;22317:9;22313:18;22306:30;22240:4;22353:45;22394:2;22383:9;22379:18;22371:6;22353:45;:::i;23119:470::-;23298:3;23336:6;23330:13;23352:53;23398:6;23393:3;23386:4;23378:6;23374:17;23352:53;:::i;:::-;23468:13;;23427:16;;;;23490:57;23468:13;23427:16;23524:4;23512:17;;23490:57;:::i;24253:112::-;24285:1;24311;24301:35;;24316:18;;:::i;:::-;-1:-1:-1;24350:9:1;;24253:112::o;24370:179::-;24401:1;24427:6;24460:2;24457:1;24453:10;24482:3;24472:37;;24489:18;;:::i;:::-;24527:10;;24523:20;;;;;24370:179;-1:-1:-1;;24370:179:1:o;26039:414::-;26241:2;26223:21;;;26280:2;26260:18;;;26253:30;26319:34;26314:2;26299:18;;26292:62;-1:-1:-1;;;26385:2:1;26370:18;;26363:48;26443:3;26428:19;;26039:414::o;26458:135::-;26497:3;-1:-1:-1;;26518:17:1;;26515:43;;;26538:18;;:::i;:::-;-1:-1:-1;26585:1:1;26574:13;;26458:135::o;26598:125::-;26638:4;26666:1;26663;26660:8;26657:34;;;26671:18;;:::i;:::-;-1:-1:-1;26708:9:1;;26598:125::o;27539:489::-;-1:-1:-1;;;;;27808:15:1;;;27790:34;;27860:15;;27855:2;27840:18;;27833:43;27907:2;27892:18;;27885:34;;;27955:3;27950:2;27935:18;;27928:31;;;27733:4;;27976:46;;28002:19;;27994:6;27976:46;:::i;:::-;27968:54;27539:489;-1:-1:-1;;;;;;27539:489:1:o;28033:249::-;28102:6;28155:2;28143:9;28134:7;28130:23;28126:32;28123:52;;;28171:1;28168;28161:12;28123:52;28203:9;28197:16;28222:30;28246:5;28222:30;:::i;28287:127::-;28348:10;28343:3;28339:20;28336:1;28329:31;28379:4;28376:1;28369:15;28403:4;28400:1;28393:15

Swarm Source

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