ETH Price: $3,345.02 (-0.65%)
Gas: 5 Gwei

Token

 

Overview

Max Total Supply

368

Holders

364

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x70748646206a936ebe4e6adb32cba2791ae23668
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:
Dynamic1155

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 11: Dynamic1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

contract Dynamic1155 is ERC1155Burnable, Ownable {
    // whether minting by owner is allowed
    bool public manualMintAllowed = true;
    // individual uri per type
    mapping (uint256 => string) public typeToUri;
    // whether main uri is freezed
    bool public isUriFreezed;
    // whether each individual uri is freezed
    mapping (uint256 => bool) public typeIsUriFreezed;
    
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory _uri)
        ERC1155(_uri)
    {}
    
    /**
     * @dev Lock further manual minting by owner
     */
    function disableManualMint() public onlyOwner {
        manualMintAllowed = false;
    }
            
    /**
     * @dev Airdrop tokens to owners
     */
    function mintOwner(address[] calldata owners, uint256[] calldata types, uint256[] calldata counts) public onlyOwner {
      require(manualMintAllowed, "Not allowed");
      require(owners.length == types.length && types.length == counts.length, "Bad array lengths");
         
      for (uint256 i = 0; i < owners.length; i++) {
        _mint(owners[i], types[i], counts[i], "");
      }
    }

    /**
     * @dev Airdrop single tokens to owners
     */
    function mintOwnerOneToken(address[] calldata owners, uint256 typeId) public onlyOwner {
      require(manualMintAllowed, "Not allowed");
         
      for (uint256 i = 0; i < owners.length; i++) {
        _mint(owners[i], typeId, 1, "");
      }
    }

    function uri(uint256 typeId) public view override returns (string memory) {
        string memory typeUri = typeToUri[typeId];
        if (bytes(typeUri).length == 0) {
            return super.uri(typeId);
        } else {
            return typeUri;
        }
    }
   
    /**
     * @dev Updates the metadata URI
     */
    function updateUri(string calldata newUri) public onlyOwner {
        require(!isUriFreezed, "Freezed");
        _setURI(newUri);
    }

    /**
     * @dev Freezes the metadata URI
     */
    function freezeUri() public onlyOwner {
        isUriFreezed = true;
    }

    /**
     * @dev Updates and freezes the metadata URI
     */
    function permanentSetUri(string calldata newUri) public onlyOwner {
        updateUri(newUri);
        freezeUri();
    }

    /**
     * @dev Updates the metadata URI for a specific type
     */
    function updateUriForType(string calldata newUri, uint256 typeId) public onlyOwner {
        require(!typeIsUriFreezed[typeId], "Freezed");
        typeToUri[typeId] = newUri;
    }

    /**
     * @dev Freezes the metadata URI
     */
    function freezeUriForType(uint256 typeId) public onlyOwner {
        typeIsUriFreezed[typeId] = true;
    }

    /**
     * @dev Updates and freezes the metadata URI
     */
    function permanentSetUriForType(string calldata newUri, uint256 typeId) public onlyOwner {
        updateUriForType(newUri, typeId);
        freezeUriForType(typeId);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (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 4 of 11: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

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

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

        address operator = _msgSender();

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

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 5 of 11: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 6 of 11: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 9 of 11: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

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

pragma solidity ^0.8.0;

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

File 11 of 11: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableManualMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"freezeUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUriFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualMintAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"types","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"mintOwnerOneToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"permanentSetUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"permanentSetUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsUriFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeToUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"updateUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"updateUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526001600360146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162004a2e38038062004a2e8339818101604052810190620000529190620002a4565b8062000064816200008c60201b60201c565b506200008562000079620000a860201b60201c565b620000b060201b60201c565b5062000479565b8060029080519060200190620000a492919062000176565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000184906200038a565b90600052602060002090601f016020900481019282620001a85760008555620001f4565b82601f10620001c357805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f3578251825591602001919060010190620001d6565b5b50905062000203919062000207565b5090565b5b808211156200022257600081600090555060010162000208565b5090565b60006200023d62000237846200031e565b620002f5565b9050828152602081018484840111156200025c576200025b62000459565b5b6200026984828562000354565b509392505050565b600082601f83011262000289576200028862000454565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000463565b5b600082015167ffffffffffffffff811115620002de57620002dd6200045e565b5b620002ec8482850162000271565b91505092915050565b60006200030162000314565b90506200030f8282620003c0565b919050565b6000604051905090565b600067ffffffffffffffff8211156200033c576200033b62000425565b5b620003478262000468565b9050602081019050919050565b60005b838110156200037457808201518184015260208101905062000357565b8381111562000384576000848401525b50505050565b60006002820490506001821680620003a357607f821691505b60208210811415620003ba57620003b9620003f6565b5b50919050565b620003cb8262000468565b810181811067ffffffffffffffff82111715620003ed57620003ec62000425565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6145a580620004896000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80636b20c454116100de578063abff7f6e11610097578063e985e9c511610071578063e985e9c514610442578063f242432a14610472578063f2fde38b1461048e578063f5298aca146104aa5761018d565b8063abff7f6e146103ee578063c30f3bb11461040a578063c75e25e1146104265761018d565b80636b20c45414610354578063715018a6146103705780638da5cb5b1461037a57806395d34d9e14610398578063a22cb465146103b4578063ab05ff41146103d05761018d565b80632094aacc1161014b5780632be9279d116101255780632be9279d146102ce5780632eb2c2d6146102ec5780634e1273f414610308578063570b3c6a146103385761018d565b80632094aacc14610252578063267f8640146102825780632768d709146102b25761018d565b8062fdd58e1461019257806301ffc9a7146101c2578063086cb785146101f257806308b58c1d146101fc5780630e89341c146102185780630f52b76e14610248575b600080fd5b6101ac60048036038101906101a791906130b2565b6104c6565b6040516101b99190613b52565b60405180910390f35b6101dc60048036038101906101d791906132d1565b61058f565b6040516101e991906138d5565b60405180910390f35b6101fa610671565b005b61021660048036038101906102119190613378565b61070a565b005b610232600480360381019061022d91906133d8565b61079f565b60405161023f91906138f0565b60405180910390f35b610250610866565b005b61026c600480360381019061026791906133d8565b6108ff565b60405161027991906138f0565b60405180910390f35b61029c600480360381019061029791906133d8565b61099f565b6040516102a991906138d5565b60405180910390f35b6102cc60048036038101906102c79190613145565b6109bf565b005b6102d6610b81565b6040516102e391906138d5565b60405180910390f35b61030660048036038101906103019190612e81565b610b94565b005b610322600480360381019061031d9190613259565b610c35565b60405161032f919061387c565b60405180910390f35b610352600480360381019061034d919061332b565b610d4e565b005b61036e60048036038101906103699190612fe7565b610e6b565b005b610378610f08565b005b610382610f90565b60405161038f919061379f565b60405180910390f35b6103b260048036038101906103ad9190613378565b610fba565b005b6103ce60048036038101906103c99190613072565b6110bf565b005b6103d86110d5565b6040516103e591906138d5565b60405180910390f35b6104086004803603810190610403919061332b565b6110e8565b005b610424600480360381019061041f91906133d8565b61117a565b005b610440600480360381019061043b91906131f9565b611225565b005b61045c60048036038101906104579190612e41565b61135a565b60405161046991906138d5565b60405180910390f35b61048c60048036038101906104879190612f50565b6113ee565b005b6104a860048036038101906104a39190612e14565b61148f565b005b6104c460048036038101906104bf91906130f2565b611587565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052e90613972565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061066a575061066982611624565b5b9050919050565b61067961168e565b73ffffffffffffffffffffffffffffffffffffffff16610697610f90565b73ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e490613ab2565b60405180910390fd5b6001600560006101000a81548160ff021916908315150217905550565b61071261168e565b73ffffffffffffffffffffffffffffffffffffffff16610730610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077d90613ab2565b60405180910390fd5b610791838383610fba565b61079a8161117a565b505050565b606060006004600084815260200190815260200160002080546107c190613dc1565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed90613dc1565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b5050505050905060008151141561085c5761085483611696565b915050610861565b809150505b919050565b61086e61168e565b73ffffffffffffffffffffffffffffffffffffffff1661088c610f90565b73ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613ab2565b60405180910390fd5b6000600360146101000a81548160ff021916908315150217905550565b6004602052806000526040600020600091509050805461091e90613dc1565b80601f016020809104026020016040519081016040528092919081815260200182805461094a90613dc1565b80156109975780601f1061096c57610100808354040283529160200191610997565b820191906000526020600020905b81548152906001019060200180831161097a57829003601f168201915b505050505081565b60066020528060005260406000206000915054906101000a900460ff1681565b6109c761168e565b73ffffffffffffffffffffffffffffffffffffffff166109e5610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613ab2565b60405180910390fd5b600360149054906101000a900460ff16610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613a92565b60405180910390fd5b8383905086869050148015610aa457508181905084849050145b610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90613952565b60405180910390fd5b60005b86869050811015610b7857610b65878783818110610b0757610b06613ecb565b5b9050602002016020810190610b1c9190612e14565b868684818110610b2f57610b2e613ecb565b5b90506020020135858585818110610b4957610b48613ecb565b5b905060200201356040518060200160405280600081525061172a565b8080610b7090613e24565b915050610ae6565b50505050505050565b600360149054906101000a900460ff1681565b610b9c61168e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610be25750610be185610bdc61168e565b61135a565b5b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890613a12565b60405180910390fd5b610c2e85858585856118c0565b5050505050565b60608151835114610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290613af2565b60405180910390fd5b6000835167ffffffffffffffff811115610c9857610c97613efa565b5b604051908082528060200260200182016040528015610cc65781602001602082028036833780820191505090505b50905060005b8451811015610d4357610d13858281518110610ceb57610cea613ecb565b5b6020026020010151858381518110610d0657610d05613ecb565b5b60200260200101516104c6565b828281518110610d2657610d25613ecb565b5b60200260200101818152505080610d3c90613e24565b9050610ccc565b508091505092915050565b610d5661168e565b73ffffffffffffffffffffffffffffffffffffffff16610d74610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190613ab2565b60405180910390fd5b600560009054906101000a900460ff1615610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190613a32565b60405180910390fd5b610e6782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bd4565b5050565b610e7361168e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610eb95750610eb883610eb361168e565b61135a565b5b610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906139d2565b60405180910390fd5b610f03838383611bee565b505050565b610f1061168e565b73ffffffffffffffffffffffffffffffffffffffff16610f2e610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613ab2565b60405180910390fd5b610f8e6000611e9f565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fc261168e565b73ffffffffffffffffffffffffffffffffffffffff16610fe0610f90565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613ab2565b60405180910390fd5b6006600082815260200190815260200160002060009054906101000a900460ff1615611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613a32565b60405180910390fd5b82826004600084815260200190815260200160002091906110b99291906129d4565b50505050565b6110d16110ca61168e565b8383611f65565b5050565b600560009054906101000a900460ff1681565b6110f061168e565b73ffffffffffffffffffffffffffffffffffffffff1661110e610f90565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613ab2565b60405180910390fd5b61116e8282610d4e565b611176610671565b5050565b61118261168e565b73ffffffffffffffffffffffffffffffffffffffff166111a0610f90565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613ab2565b60405180910390fd5b60016006600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61122d61168e565b73ffffffffffffffffffffffffffffffffffffffff1661124b610f90565b73ffffffffffffffffffffffffffffffffffffffff16146112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890613ab2565b60405180910390fd5b600360149054906101000a900460ff166112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613a92565b60405180910390fd5b60005b838390508110156113545761134184848381811061131457611313613ecb565b5b90506020020160208101906113299190612e14565b8360016040518060200160405280600081525061172a565b808061134c90613e24565b9150506112f3565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f661168e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061143c575061143b8561143661168e565b61135a565b5b61147b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611472906139d2565b60405180910390fd5b61148885858585856120d2565b5050505050565b61149761168e565b73ffffffffffffffffffffffffffffffffffffffff166114b5610f90565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613ab2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613992565b60405180910390fd5b61158481611e9f565b50565b61158f61168e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806115d557506115d4836115cf61168e565b61135a565b5b611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906139d2565b60405180910390fd5b61161f838383612354565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060600280546116a590613dc1565b80601f01602080910402602001604051908101604052809291908181526020018280546116d190613dc1565b801561171e5780601f106116f35761010080835404028352916020019161171e565b820191906000526020600020905b81548152906001019060200180831161170157829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613b32565b60405180910390fd5b60006117a461168e565b90506117c5816000876117b688612571565b6117bf88612571565b876125eb565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118249190613cb5565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516118a2929190613b6d565b60405180910390a46118b9816000878787876125f3565b5050505050565b8151835114611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b906139f2565b60405180910390fd5b600061197e61168e565b905061198e8187878787876125eb565b60005b8451811015611b3f5760008582815181106119af576119ae613ecb565b5b6020026020010151905060008583815181106119ce576119cd613ecb565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613a72565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b249190613cb5565b9250508190555050505080611b3890613e24565b9050611991565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bb692919061389e565b60405180910390a4611bcc8187878787876127da565b505050505050565b8060029080519060200190611bea929190612a5a565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613a52565b60405180910390fd5b8051825114611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990613b12565b60405180910390fd5b6000611cac61168e565b9050611ccc818560008686604051806020016040528060008152506125eb565b60005b8351811015611e19576000848281518110611ced57611cec613ecb565b5b602002602001015190506000848381518110611d0c57611d0b613ecb565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da4906139b2565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e1190613e24565b915050611ccf565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e9192919061389e565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb90613ad2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c591906138d5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612142576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612139906139f2565b60405180910390fd5b600061214c61168e565b905061216c81878761215d88612571565b61216688612571565b876125eb565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613a72565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b89190613cb5565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612335929190613b6d565b60405180910390a461234b8288888888886125f3565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90613a52565b60405180910390fd5b60006123ce61168e565b90506123fe818560006123e087612571565b6123e987612571565b604051806020016040528060008152506125eb565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906139b2565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612562929190613b6d565b60405180910390a45050505050565b60606000600167ffffffffffffffff8111156125905761258f613efa565b5b6040519080825280602002602001820160405280156125be5781602001602082028036833780820191505090505b50905082816000815181106125d6576125d5613ecb565b5b60200260200101818152505080915050919050565b505050505050565b6126128473ffffffffffffffffffffffffffffffffffffffff166129c1565b156127d2578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612658959493929190613822565b602060405180830381600087803b15801561267257600080fd5b505af19250505080156126a357506040513d601f19601f820116820180604052508101906126a091906132fe565b60015b612749576126af613f29565b806308c379a0141561270c57506126c461447d565b806126cf575061270e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270391906138f0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274090613912565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c790613932565b60405180910390fd5b505b505050505050565b6127f98473ffffffffffffffffffffffffffffffffffffffff166129c1565b156129b9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161283f9594939291906137ba565b602060405180830381600087803b15801561285957600080fd5b505af192505050801561288a57506040513d601f19601f8201168201806040525081019061288791906132fe565b60015b61293057612896613f29565b806308c379a014156128f357506128ab61447d565b806128b657506128f5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea91906138f0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790613912565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae90613932565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b8280546129e090613dc1565b90600052602060002090601f016020900481019282612a025760008555612a49565b82601f10612a1b57803560ff1916838001178555612a49565b82800160010185558215612a49579182015b82811115612a48578235825591602001919060010190612a2d565b5b509050612a569190612ae0565b5090565b828054612a6690613dc1565b90600052602060002090601f016020900481019282612a885760008555612acf565b82601f10612aa157805160ff1916838001178555612acf565b82800160010185558215612acf579182015b82811115612ace578251825591602001919060010190612ab3565b5b509050612adc9190612ae0565b5090565b5b80821115612af9576000816000905550600101612ae1565b5090565b6000612b10612b0b84613bbb565b613b96565b90508083825260208201905082856020860282011115612b3357612b32613f55565b5b60005b85811015612b635781612b498882612c1f565b845260208401935060208301925050600181019050612b36565b5050509392505050565b6000612b80612b7b84613be7565b613b96565b90508083825260208201905082856020860282011115612ba357612ba2613f55565b5b60005b85811015612bd35781612bb98882612dff565b845260208401935060208301925050600181019050612ba6565b5050509392505050565b6000612bf0612beb84613c13565b613b96565b905082815260208101848484011115612c0c57612c0b613f5a565b5b612c17848285613d7f565b509392505050565b600081359050612c2e81614513565b92915050565b60008083601f840112612c4a57612c49613f50565b5b8235905067ffffffffffffffff811115612c6757612c66613f4b565b5b602083019150836020820283011115612c8357612c82613f55565b5b9250929050565b600082601f830112612c9f57612c9e613f50565b5b8135612caf848260208601612afd565b91505092915050565b60008083601f840112612cce57612ccd613f50565b5b8235905067ffffffffffffffff811115612ceb57612cea613f4b565b5b602083019150836020820283011115612d0757612d06613f55565b5b9250929050565b600082601f830112612d2357612d22613f50565b5b8135612d33848260208601612b6d565b91505092915050565b600081359050612d4b8161452a565b92915050565b600081359050612d6081614541565b92915050565b600081519050612d7581614541565b92915050565b600082601f830112612d9057612d8f613f50565b5b8135612da0848260208601612bdd565b91505092915050565b60008083601f840112612dbf57612dbe613f50565b5b8235905067ffffffffffffffff811115612ddc57612ddb613f4b565b5b602083019150836001820283011115612df857612df7613f55565b5b9250929050565b600081359050612e0e81614558565b92915050565b600060208284031215612e2a57612e29613f64565b5b6000612e3884828501612c1f565b91505092915050565b60008060408385031215612e5857612e57613f64565b5b6000612e6685828601612c1f565b9250506020612e7785828601612c1f565b9150509250929050565b600080600080600060a08688031215612e9d57612e9c613f64565b5b6000612eab88828901612c1f565b9550506020612ebc88828901612c1f565b945050604086013567ffffffffffffffff811115612edd57612edc613f5f565b5b612ee988828901612d0e565b935050606086013567ffffffffffffffff811115612f0a57612f09613f5f565b5b612f1688828901612d0e565b925050608086013567ffffffffffffffff811115612f3757612f36613f5f565b5b612f4388828901612d7b565b9150509295509295909350565b600080600080600060a08688031215612f6c57612f6b613f64565b5b6000612f7a88828901612c1f565b9550506020612f8b88828901612c1f565b9450506040612f9c88828901612dff565b9350506060612fad88828901612dff565b925050608086013567ffffffffffffffff811115612fce57612fcd613f5f565b5b612fda88828901612d7b565b9150509295509295909350565b60008060006060848603121561300057612fff613f64565b5b600061300e86828701612c1f565b935050602084013567ffffffffffffffff81111561302f5761302e613f5f565b5b61303b86828701612d0e565b925050604084013567ffffffffffffffff81111561305c5761305b613f5f565b5b61306886828701612d0e565b9150509250925092565b6000806040838503121561308957613088613f64565b5b600061309785828601612c1f565b92505060206130a885828601612d3c565b9150509250929050565b600080604083850312156130c9576130c8613f64565b5b60006130d785828601612c1f565b92505060206130e885828601612dff565b9150509250929050565b60008060006060848603121561310b5761310a613f64565b5b600061311986828701612c1f565b935050602061312a86828701612dff565b925050604061313b86828701612dff565b9150509250925092565b6000806000806000806060878903121561316257613161613f64565b5b600087013567ffffffffffffffff8111156131805761317f613f5f565b5b61318c89828a01612c34565b9650965050602087013567ffffffffffffffff8111156131af576131ae613f5f565b5b6131bb89828a01612cb8565b9450945050604087013567ffffffffffffffff8111156131de576131dd613f5f565b5b6131ea89828a01612cb8565b92509250509295509295509295565b60008060006040848603121561321257613211613f64565b5b600084013567ffffffffffffffff8111156132305761322f613f5f565b5b61323c86828701612c34565b9350935050602061324f86828701612dff565b9150509250925092565b600080604083850312156132705761326f613f64565b5b600083013567ffffffffffffffff81111561328e5761328d613f5f565b5b61329a85828601612c8a565b925050602083013567ffffffffffffffff8111156132bb576132ba613f5f565b5b6132c785828601612d0e565b9150509250929050565b6000602082840312156132e7576132e6613f64565b5b60006132f584828501612d51565b91505092915050565b60006020828403121561331457613313613f64565b5b600061332284828501612d66565b91505092915050565b6000806020838503121561334257613341613f64565b5b600083013567ffffffffffffffff8111156133605761335f613f5f565b5b61336c85828601612da9565b92509250509250929050565b60008060006040848603121561339157613390613f64565b5b600084013567ffffffffffffffff8111156133af576133ae613f5f565b5b6133bb86828701612da9565b935093505060206133ce86828701612dff565b9150509250925092565b6000602082840312156133ee576133ed613f64565b5b60006133fc84828501612dff565b91505092915050565b60006134118383613781565b60208301905092915050565b61342681613d0b565b82525050565b600061343782613c54565b6134418185613c82565b935061344c83613c44565b8060005b8381101561347d5781516134648882613405565b975061346f83613c75565b925050600181019050613450565b5085935050505092915050565b61349381613d1d565b82525050565b60006134a482613c5f565b6134ae8185613c93565b93506134be818560208601613d8e565b6134c781613f69565b840191505092915050565b60006134dd82613c6a565b6134e78185613ca4565b93506134f7818560208601613d8e565b61350081613f69565b840191505092915050565b6000613518603483613ca4565b915061352382613f87565b604082019050919050565b600061353b602883613ca4565b915061354682613fd6565b604082019050919050565b600061355e601183613ca4565b915061356982614025565b602082019050919050565b6000613581602b83613ca4565b915061358c8261404e565b604082019050919050565b60006135a4602683613ca4565b91506135af8261409d565b604082019050919050565b60006135c7602483613ca4565b91506135d2826140ec565b604082019050919050565b60006135ea602983613ca4565b91506135f58261413b565b604082019050919050565b600061360d602583613ca4565b91506136188261418a565b604082019050919050565b6000613630603283613ca4565b915061363b826141d9565b604082019050919050565b6000613653600783613ca4565b915061365e82614228565b602082019050919050565b6000613676602383613ca4565b915061368182614251565b604082019050919050565b6000613699602a83613ca4565b91506136a4826142a0565b604082019050919050565b60006136bc600b83613ca4565b91506136c7826142ef565b602082019050919050565b60006136df602083613ca4565b91506136ea82614318565b602082019050919050565b6000613702602983613ca4565b915061370d82614341565b604082019050919050565b6000613725602983613ca4565b915061373082614390565b604082019050919050565b6000613748602883613ca4565b9150613753826143df565b604082019050919050565b600061376b602183613ca4565b91506137768261442e565b604082019050919050565b61378a81613d75565b82525050565b61379981613d75565b82525050565b60006020820190506137b4600083018461341d565b92915050565b600060a0820190506137cf600083018861341d565b6137dc602083018761341d565b81810360408301526137ee818661342c565b90508181036060830152613802818561342c565b905081810360808301526138168184613499565b90509695505050505050565b600060a082019050613837600083018861341d565b613844602083018761341d565b6138516040830186613790565b61385e6060830185613790565b81810360808301526138708184613499565b90509695505050505050565b60006020820190508181036000830152613896818461342c565b905092915050565b600060408201905081810360008301526138b8818561342c565b905081810360208301526138cc818461342c565b90509392505050565b60006020820190506138ea600083018461348a565b92915050565b6000602082019050818103600083015261390a81846134d2565b905092915050565b6000602082019050818103600083015261392b8161350b565b9050919050565b6000602082019050818103600083015261394b8161352e565b9050919050565b6000602082019050818103600083015261396b81613551565b9050919050565b6000602082019050818103600083015261398b81613574565b9050919050565b600060208201905081810360008301526139ab81613597565b9050919050565b600060208201905081810360008301526139cb816135ba565b9050919050565b600060208201905081810360008301526139eb816135dd565b9050919050565b60006020820190508181036000830152613a0b81613600565b9050919050565b60006020820190508181036000830152613a2b81613623565b9050919050565b60006020820190508181036000830152613a4b81613646565b9050919050565b60006020820190508181036000830152613a6b81613669565b9050919050565b60006020820190508181036000830152613a8b8161368c565b9050919050565b60006020820190508181036000830152613aab816136af565b9050919050565b60006020820190508181036000830152613acb816136d2565b9050919050565b60006020820190508181036000830152613aeb816136f5565b9050919050565b60006020820190508181036000830152613b0b81613718565b9050919050565b60006020820190508181036000830152613b2b8161373b565b9050919050565b60006020820190508181036000830152613b4b8161375e565b9050919050565b6000602082019050613b676000830184613790565b92915050565b6000604082019050613b826000830185613790565b613b8f6020830184613790565b9392505050565b6000613ba0613bb1565b9050613bac8282613df3565b919050565b6000604051905090565b600067ffffffffffffffff821115613bd657613bd5613efa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c0257613c01613efa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c2e57613c2d613efa565b5b613c3782613f69565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613cc082613d75565b9150613ccb83613d75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0057613cff613e6d565b5b828201905092915050565b6000613d1682613d55565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dac578082015181840152602081019050613d91565b83811115613dbb576000848401525b50505050565b60006002820490506001821680613dd957607f821691505b60208210811415613ded57613dec613e9c565b5b50919050565b613dfc82613f69565b810181811067ffffffffffffffff82111715613e1b57613e1a613efa565b5b80604052505050565b6000613e2f82613d75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6257613e61613e6d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613f485760046000803e613f45600051613f7a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f426164206172726179206c656e67746873000000000000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f467265657a656400000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561448d57614510565b614495613bb1565b60043d036004823e80513d602482011167ffffffffffffffff821117156144bd575050614510565b808201805167ffffffffffffffff8111156144db5750505050614510565b80602083010160043d0385018111156144f8575050505050614510565b61450782602001850186613df3565b82955050505050505b90565b61451c81613d0b565b811461452757600080fd5b50565b61453381613d1d565b811461453e57600080fd5b50565b61454a81613d29565b811461455557600080fd5b50565b61456181613d75565b811461456c57600080fd5b5056fea2646970667358221220976d19edecaa64ab75bea4c6ea9f471f0467dc4bb316971ab620366d9e96710664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80636b20c454116100de578063abff7f6e11610097578063e985e9c511610071578063e985e9c514610442578063f242432a14610472578063f2fde38b1461048e578063f5298aca146104aa5761018d565b8063abff7f6e146103ee578063c30f3bb11461040a578063c75e25e1146104265761018d565b80636b20c45414610354578063715018a6146103705780638da5cb5b1461037a57806395d34d9e14610398578063a22cb465146103b4578063ab05ff41146103d05761018d565b80632094aacc1161014b5780632be9279d116101255780632be9279d146102ce5780632eb2c2d6146102ec5780634e1273f414610308578063570b3c6a146103385761018d565b80632094aacc14610252578063267f8640146102825780632768d709146102b25761018d565b8062fdd58e1461019257806301ffc9a7146101c2578063086cb785146101f257806308b58c1d146101fc5780630e89341c146102185780630f52b76e14610248575b600080fd5b6101ac60048036038101906101a791906130b2565b6104c6565b6040516101b99190613b52565b60405180910390f35b6101dc60048036038101906101d791906132d1565b61058f565b6040516101e991906138d5565b60405180910390f35b6101fa610671565b005b61021660048036038101906102119190613378565b61070a565b005b610232600480360381019061022d91906133d8565b61079f565b60405161023f91906138f0565b60405180910390f35b610250610866565b005b61026c600480360381019061026791906133d8565b6108ff565b60405161027991906138f0565b60405180910390f35b61029c600480360381019061029791906133d8565b61099f565b6040516102a991906138d5565b60405180910390f35b6102cc60048036038101906102c79190613145565b6109bf565b005b6102d6610b81565b6040516102e391906138d5565b60405180910390f35b61030660048036038101906103019190612e81565b610b94565b005b610322600480360381019061031d9190613259565b610c35565b60405161032f919061387c565b60405180910390f35b610352600480360381019061034d919061332b565b610d4e565b005b61036e60048036038101906103699190612fe7565b610e6b565b005b610378610f08565b005b610382610f90565b60405161038f919061379f565b60405180910390f35b6103b260048036038101906103ad9190613378565b610fba565b005b6103ce60048036038101906103c99190613072565b6110bf565b005b6103d86110d5565b6040516103e591906138d5565b60405180910390f35b6104086004803603810190610403919061332b565b6110e8565b005b610424600480360381019061041f91906133d8565b61117a565b005b610440600480360381019061043b91906131f9565b611225565b005b61045c60048036038101906104579190612e41565b61135a565b60405161046991906138d5565b60405180910390f35b61048c60048036038101906104879190612f50565b6113ee565b005b6104a860048036038101906104a39190612e14565b61148f565b005b6104c460048036038101906104bf91906130f2565b611587565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052e90613972565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061066a575061066982611624565b5b9050919050565b61067961168e565b73ffffffffffffffffffffffffffffffffffffffff16610697610f90565b73ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e490613ab2565b60405180910390fd5b6001600560006101000a81548160ff021916908315150217905550565b61071261168e565b73ffffffffffffffffffffffffffffffffffffffff16610730610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077d90613ab2565b60405180910390fd5b610791838383610fba565b61079a8161117a565b505050565b606060006004600084815260200190815260200160002080546107c190613dc1565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed90613dc1565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b5050505050905060008151141561085c5761085483611696565b915050610861565b809150505b919050565b61086e61168e565b73ffffffffffffffffffffffffffffffffffffffff1661088c610f90565b73ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613ab2565b60405180910390fd5b6000600360146101000a81548160ff021916908315150217905550565b6004602052806000526040600020600091509050805461091e90613dc1565b80601f016020809104026020016040519081016040528092919081815260200182805461094a90613dc1565b80156109975780601f1061096c57610100808354040283529160200191610997565b820191906000526020600020905b81548152906001019060200180831161097a57829003601f168201915b505050505081565b60066020528060005260406000206000915054906101000a900460ff1681565b6109c761168e565b73ffffffffffffffffffffffffffffffffffffffff166109e5610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613ab2565b60405180910390fd5b600360149054906101000a900460ff16610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613a92565b60405180910390fd5b8383905086869050148015610aa457508181905084849050145b610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90613952565b60405180910390fd5b60005b86869050811015610b7857610b65878783818110610b0757610b06613ecb565b5b9050602002016020810190610b1c9190612e14565b868684818110610b2f57610b2e613ecb565b5b90506020020135858585818110610b4957610b48613ecb565b5b905060200201356040518060200160405280600081525061172a565b8080610b7090613e24565b915050610ae6565b50505050505050565b600360149054906101000a900460ff1681565b610b9c61168e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610be25750610be185610bdc61168e565b61135a565b5b610c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1890613a12565b60405180910390fd5b610c2e85858585856118c0565b5050505050565b60608151835114610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290613af2565b60405180910390fd5b6000835167ffffffffffffffff811115610c9857610c97613efa565b5b604051908082528060200260200182016040528015610cc65781602001602082028036833780820191505090505b50905060005b8451811015610d4357610d13858281518110610ceb57610cea613ecb565b5b6020026020010151858381518110610d0657610d05613ecb565b5b60200260200101516104c6565b828281518110610d2657610d25613ecb565b5b60200260200101818152505080610d3c90613e24565b9050610ccc565b508091505092915050565b610d5661168e565b73ffffffffffffffffffffffffffffffffffffffff16610d74610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190613ab2565b60405180910390fd5b600560009054906101000a900460ff1615610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190613a32565b60405180910390fd5b610e6782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611bd4565b5050565b610e7361168e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610eb95750610eb883610eb361168e565b61135a565b5b610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906139d2565b60405180910390fd5b610f03838383611bee565b505050565b610f1061168e565b73ffffffffffffffffffffffffffffffffffffffff16610f2e610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90613ab2565b60405180910390fd5b610f8e6000611e9f565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fc261168e565b73ffffffffffffffffffffffffffffffffffffffff16610fe0610f90565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613ab2565b60405180910390fd5b6006600082815260200190815260200160002060009054906101000a900460ff1615611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90613a32565b60405180910390fd5b82826004600084815260200190815260200160002091906110b99291906129d4565b50505050565b6110d16110ca61168e565b8383611f65565b5050565b600560009054906101000a900460ff1681565b6110f061168e565b73ffffffffffffffffffffffffffffffffffffffff1661110e610f90565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613ab2565b60405180910390fd5b61116e8282610d4e565b611176610671565b5050565b61118261168e565b73ffffffffffffffffffffffffffffffffffffffff166111a0610f90565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613ab2565b60405180910390fd5b60016006600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61122d61168e565b73ffffffffffffffffffffffffffffffffffffffff1661124b610f90565b73ffffffffffffffffffffffffffffffffffffffff16146112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890613ab2565b60405180910390fd5b600360149054906101000a900460ff166112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790613a92565b60405180910390fd5b60005b838390508110156113545761134184848381811061131457611313613ecb565b5b90506020020160208101906113299190612e14565b8360016040518060200160405280600081525061172a565b808061134c90613e24565b9150506112f3565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f661168e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061143c575061143b8561143661168e565b61135a565b5b61147b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611472906139d2565b60405180910390fd5b61148885858585856120d2565b5050505050565b61149761168e565b73ffffffffffffffffffffffffffffffffffffffff166114b5610f90565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290613ab2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290613992565b60405180910390fd5b61158481611e9f565b50565b61158f61168e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806115d557506115d4836115cf61168e565b61135a565b5b611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906139d2565b60405180910390fd5b61161f838383612354565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6060600280546116a590613dc1565b80601f01602080910402602001604051908101604052809291908181526020018280546116d190613dc1565b801561171e5780601f106116f35761010080835404028352916020019161171e565b820191906000526020600020905b81548152906001019060200180831161170157829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613b32565b60405180910390fd5b60006117a461168e565b90506117c5816000876117b688612571565b6117bf88612571565b876125eb565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118249190613cb5565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516118a2929190613b6d565b60405180910390a46118b9816000878787876125f3565b5050505050565b8151835114611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b906139f2565b60405180910390fd5b600061197e61168e565b905061198e8187878787876125eb565b60005b8451811015611b3f5760008582815181106119af576119ae613ecb565b5b6020026020010151905060008583815181106119ce576119cd613ecb565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690613a72565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b249190613cb5565b9250508190555050505080611b3890613e24565b9050611991565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bb692919061389e565b60405180910390a4611bcc8187878787876127da565b505050505050565b8060029080519060200190611bea929190612a5a565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613a52565b60405180910390fd5b8051825114611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990613b12565b60405180910390fd5b6000611cac61168e565b9050611ccc818560008686604051806020016040528060008152506125eb565b60005b8351811015611e19576000848281518110611ced57611cec613ecb565b5b602002602001015190506000848381518110611d0c57611d0b613ecb565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da4906139b2565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e1190613e24565b915050611ccf565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e9192919061389e565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb90613ad2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120c591906138d5565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612142576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612139906139f2565b60405180910390fd5b600061214c61168e565b905061216c81878761215d88612571565b61216688612571565b876125eb565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613a72565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b89190613cb5565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612335929190613b6d565b60405180910390a461234b8288888888886125f3565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90613a52565b60405180910390fd5b60006123ce61168e565b90506123fe818560006123e087612571565b6123e987612571565b604051806020016040528060008152506125eb565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906139b2565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612562929190613b6d565b60405180910390a45050505050565b60606000600167ffffffffffffffff8111156125905761258f613efa565b5b6040519080825280602002602001820160405280156125be5781602001602082028036833780820191505090505b50905082816000815181106125d6576125d5613ecb565b5b60200260200101818152505080915050919050565b505050505050565b6126128473ffffffffffffffffffffffffffffffffffffffff166129c1565b156127d2578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612658959493929190613822565b602060405180830381600087803b15801561267257600080fd5b505af19250505080156126a357506040513d601f19601f820116820180604052508101906126a091906132fe565b60015b612749576126af613f29565b806308c379a0141561270c57506126c461447d565b806126cf575061270e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270391906138f0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274090613912565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c790613932565b60405180910390fd5b505b505050505050565b6127f98473ffffffffffffffffffffffffffffffffffffffff166129c1565b156129b9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161283f9594939291906137ba565b602060405180830381600087803b15801561285957600080fd5b505af192505050801561288a57506040513d601f19601f8201168201806040525081019061288791906132fe565b60015b61293057612896613f29565b806308c379a014156128f357506128ab61447d565b806128b657506128f5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea91906138f0565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790613912565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae90613932565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b8280546129e090613dc1565b90600052602060002090601f016020900481019282612a025760008555612a49565b82601f10612a1b57803560ff1916838001178555612a49565b82800160010185558215612a49579182015b82811115612a48578235825591602001919060010190612a2d565b5b509050612a569190612ae0565b5090565b828054612a6690613dc1565b90600052602060002090601f016020900481019282612a885760008555612acf565b82601f10612aa157805160ff1916838001178555612acf565b82800160010185558215612acf579182015b82811115612ace578251825591602001919060010190612ab3565b5b509050612adc9190612ae0565b5090565b5b80821115612af9576000816000905550600101612ae1565b5090565b6000612b10612b0b84613bbb565b613b96565b90508083825260208201905082856020860282011115612b3357612b32613f55565b5b60005b85811015612b635781612b498882612c1f565b845260208401935060208301925050600181019050612b36565b5050509392505050565b6000612b80612b7b84613be7565b613b96565b90508083825260208201905082856020860282011115612ba357612ba2613f55565b5b60005b85811015612bd35781612bb98882612dff565b845260208401935060208301925050600181019050612ba6565b5050509392505050565b6000612bf0612beb84613c13565b613b96565b905082815260208101848484011115612c0c57612c0b613f5a565b5b612c17848285613d7f565b509392505050565b600081359050612c2e81614513565b92915050565b60008083601f840112612c4a57612c49613f50565b5b8235905067ffffffffffffffff811115612c6757612c66613f4b565b5b602083019150836020820283011115612c8357612c82613f55565b5b9250929050565b600082601f830112612c9f57612c9e613f50565b5b8135612caf848260208601612afd565b91505092915050565b60008083601f840112612cce57612ccd613f50565b5b8235905067ffffffffffffffff811115612ceb57612cea613f4b565b5b602083019150836020820283011115612d0757612d06613f55565b5b9250929050565b600082601f830112612d2357612d22613f50565b5b8135612d33848260208601612b6d565b91505092915050565b600081359050612d4b8161452a565b92915050565b600081359050612d6081614541565b92915050565b600081519050612d7581614541565b92915050565b600082601f830112612d9057612d8f613f50565b5b8135612da0848260208601612bdd565b91505092915050565b60008083601f840112612dbf57612dbe613f50565b5b8235905067ffffffffffffffff811115612ddc57612ddb613f4b565b5b602083019150836001820283011115612df857612df7613f55565b5b9250929050565b600081359050612e0e81614558565b92915050565b600060208284031215612e2a57612e29613f64565b5b6000612e3884828501612c1f565b91505092915050565b60008060408385031215612e5857612e57613f64565b5b6000612e6685828601612c1f565b9250506020612e7785828601612c1f565b9150509250929050565b600080600080600060a08688031215612e9d57612e9c613f64565b5b6000612eab88828901612c1f565b9550506020612ebc88828901612c1f565b945050604086013567ffffffffffffffff811115612edd57612edc613f5f565b5b612ee988828901612d0e565b935050606086013567ffffffffffffffff811115612f0a57612f09613f5f565b5b612f1688828901612d0e565b925050608086013567ffffffffffffffff811115612f3757612f36613f5f565b5b612f4388828901612d7b565b9150509295509295909350565b600080600080600060a08688031215612f6c57612f6b613f64565b5b6000612f7a88828901612c1f565b9550506020612f8b88828901612c1f565b9450506040612f9c88828901612dff565b9350506060612fad88828901612dff565b925050608086013567ffffffffffffffff811115612fce57612fcd613f5f565b5b612fda88828901612d7b565b9150509295509295909350565b60008060006060848603121561300057612fff613f64565b5b600061300e86828701612c1f565b935050602084013567ffffffffffffffff81111561302f5761302e613f5f565b5b61303b86828701612d0e565b925050604084013567ffffffffffffffff81111561305c5761305b613f5f565b5b61306886828701612d0e565b9150509250925092565b6000806040838503121561308957613088613f64565b5b600061309785828601612c1f565b92505060206130a885828601612d3c565b9150509250929050565b600080604083850312156130c9576130c8613f64565b5b60006130d785828601612c1f565b92505060206130e885828601612dff565b9150509250929050565b60008060006060848603121561310b5761310a613f64565b5b600061311986828701612c1f565b935050602061312a86828701612dff565b925050604061313b86828701612dff565b9150509250925092565b6000806000806000806060878903121561316257613161613f64565b5b600087013567ffffffffffffffff8111156131805761317f613f5f565b5b61318c89828a01612c34565b9650965050602087013567ffffffffffffffff8111156131af576131ae613f5f565b5b6131bb89828a01612cb8565b9450945050604087013567ffffffffffffffff8111156131de576131dd613f5f565b5b6131ea89828a01612cb8565b92509250509295509295509295565b60008060006040848603121561321257613211613f64565b5b600084013567ffffffffffffffff8111156132305761322f613f5f565b5b61323c86828701612c34565b9350935050602061324f86828701612dff565b9150509250925092565b600080604083850312156132705761326f613f64565b5b600083013567ffffffffffffffff81111561328e5761328d613f5f565b5b61329a85828601612c8a565b925050602083013567ffffffffffffffff8111156132bb576132ba613f5f565b5b6132c785828601612d0e565b9150509250929050565b6000602082840312156132e7576132e6613f64565b5b60006132f584828501612d51565b91505092915050565b60006020828403121561331457613313613f64565b5b600061332284828501612d66565b91505092915050565b6000806020838503121561334257613341613f64565b5b600083013567ffffffffffffffff8111156133605761335f613f5f565b5b61336c85828601612da9565b92509250509250929050565b60008060006040848603121561339157613390613f64565b5b600084013567ffffffffffffffff8111156133af576133ae613f5f565b5b6133bb86828701612da9565b935093505060206133ce86828701612dff565b9150509250925092565b6000602082840312156133ee576133ed613f64565b5b60006133fc84828501612dff565b91505092915050565b60006134118383613781565b60208301905092915050565b61342681613d0b565b82525050565b600061343782613c54565b6134418185613c82565b935061344c83613c44565b8060005b8381101561347d5781516134648882613405565b975061346f83613c75565b925050600181019050613450565b5085935050505092915050565b61349381613d1d565b82525050565b60006134a482613c5f565b6134ae8185613c93565b93506134be818560208601613d8e565b6134c781613f69565b840191505092915050565b60006134dd82613c6a565b6134e78185613ca4565b93506134f7818560208601613d8e565b61350081613f69565b840191505092915050565b6000613518603483613ca4565b915061352382613f87565b604082019050919050565b600061353b602883613ca4565b915061354682613fd6565b604082019050919050565b600061355e601183613ca4565b915061356982614025565b602082019050919050565b6000613581602b83613ca4565b915061358c8261404e565b604082019050919050565b60006135a4602683613ca4565b91506135af8261409d565b604082019050919050565b60006135c7602483613ca4565b91506135d2826140ec565b604082019050919050565b60006135ea602983613ca4565b91506135f58261413b565b604082019050919050565b600061360d602583613ca4565b91506136188261418a565b604082019050919050565b6000613630603283613ca4565b915061363b826141d9565b604082019050919050565b6000613653600783613ca4565b915061365e82614228565b602082019050919050565b6000613676602383613ca4565b915061368182614251565b604082019050919050565b6000613699602a83613ca4565b91506136a4826142a0565b604082019050919050565b60006136bc600b83613ca4565b91506136c7826142ef565b602082019050919050565b60006136df602083613ca4565b91506136ea82614318565b602082019050919050565b6000613702602983613ca4565b915061370d82614341565b604082019050919050565b6000613725602983613ca4565b915061373082614390565b604082019050919050565b6000613748602883613ca4565b9150613753826143df565b604082019050919050565b600061376b602183613ca4565b91506137768261442e565b604082019050919050565b61378a81613d75565b82525050565b61379981613d75565b82525050565b60006020820190506137b4600083018461341d565b92915050565b600060a0820190506137cf600083018861341d565b6137dc602083018761341d565b81810360408301526137ee818661342c565b90508181036060830152613802818561342c565b905081810360808301526138168184613499565b90509695505050505050565b600060a082019050613837600083018861341d565b613844602083018761341d565b6138516040830186613790565b61385e6060830185613790565b81810360808301526138708184613499565b90509695505050505050565b60006020820190508181036000830152613896818461342c565b905092915050565b600060408201905081810360008301526138b8818561342c565b905081810360208301526138cc818461342c565b90509392505050565b60006020820190506138ea600083018461348a565b92915050565b6000602082019050818103600083015261390a81846134d2565b905092915050565b6000602082019050818103600083015261392b8161350b565b9050919050565b6000602082019050818103600083015261394b8161352e565b9050919050565b6000602082019050818103600083015261396b81613551565b9050919050565b6000602082019050818103600083015261398b81613574565b9050919050565b600060208201905081810360008301526139ab81613597565b9050919050565b600060208201905081810360008301526139cb816135ba565b9050919050565b600060208201905081810360008301526139eb816135dd565b9050919050565b60006020820190508181036000830152613a0b81613600565b9050919050565b60006020820190508181036000830152613a2b81613623565b9050919050565b60006020820190508181036000830152613a4b81613646565b9050919050565b60006020820190508181036000830152613a6b81613669565b9050919050565b60006020820190508181036000830152613a8b8161368c565b9050919050565b60006020820190508181036000830152613aab816136af565b9050919050565b60006020820190508181036000830152613acb816136d2565b9050919050565b60006020820190508181036000830152613aeb816136f5565b9050919050565b60006020820190508181036000830152613b0b81613718565b9050919050565b60006020820190508181036000830152613b2b8161373b565b9050919050565b60006020820190508181036000830152613b4b8161375e565b9050919050565b6000602082019050613b676000830184613790565b92915050565b6000604082019050613b826000830185613790565b613b8f6020830184613790565b9392505050565b6000613ba0613bb1565b9050613bac8282613df3565b919050565b6000604051905090565b600067ffffffffffffffff821115613bd657613bd5613efa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c0257613c01613efa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c2e57613c2d613efa565b5b613c3782613f69565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613cc082613d75565b9150613ccb83613d75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0057613cff613e6d565b5b828201905092915050565b6000613d1682613d55565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dac578082015181840152602081019050613d91565b83811115613dbb576000848401525b50505050565b60006002820490506001821680613dd957607f821691505b60208210811415613ded57613dec613e9c565b5b50919050565b613dfc82613f69565b810181811067ffffffffffffffff82111715613e1b57613e1a613efa565b5b80604052505050565b6000613e2f82613d75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6257613e61613e6d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613f485760046000803e613f45600051613f7a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f426164206172726179206c656e67746873000000000000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f467265657a656400000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561448d57614510565b614495613bb1565b60043d036004823e80513d602482011167ffffffffffffffff821117156144bd575050614510565b808201805167ffffffffffffffff8111156144db5750505050614510565b80602083010160043d0385018111156144f8575050505050614510565b61450782602001850186613df3565b82955050505050505b90565b61451c81613d0b565b811461452757600080fd5b50565b61453381613d1d565b811461453e57600080fd5b50565b61454a81613d29565b811461455557600080fd5b50565b61456181613d75565b811461456c57600080fd5b5056fea2646970667358221220976d19edecaa64ab75bea4c6ea9f471f0467dc4bb316971ab620366d9e96710664736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

122:3079:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:231:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1207:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2230:76:2;;;:::i;:::-;;3023:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1687:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;782:90;;;:::i;:::-;;297:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;948:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;222:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4123:442:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2581:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2028:138:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;735:353:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1714:103:10;;;:::i;:::-;;1063:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2590:184:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3178:155:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;384:24:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2382:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2838:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1419:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3405:168:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3645:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;406:321:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2184:231:3;2270:7;2317:1;2298:21;;:7;:21;;;;2290:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2385:9;:13;2395:2;2385:13;;;;;;;;;;;:22;2399:7;2385:22;;;;;;;;;;;;;;;;2378:29;;2184:231;;;;:::o;1207:310::-;1309:4;1361:26;1346:41;;;:11;:41;;;;:110;;;;1419:37;1404:52;;;:11;:52;;;;1346:110;:163;;;;1473:36;1497:11;1473:23;:36::i;:::-;1346:163;1326:183;;1207:310;;;:::o;2230:76:2:-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2294:4:2::1;2279:12;;:19;;;;;;;;;;;;;;;;;;2230:76::o:0;3023:175::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3123:32:2::1;3140:6;;3148;3123:16;:32::i;:::-;3166:24;3183:6;3166:16;:24::i;:::-;3023:175:::0;;;:::o;1687:274::-;1746:13;1772:21;1796:9;:17;1806:6;1796:17;;;;;;;;;;;1772:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1853:1;1834:7;1828:21;:26;1824:130;;;1878:17;1888:6;1878:9;:17::i;:::-;1871:24;;;;;1824:130;1935:7;1928:14;;;1687:274;;;;:::o;782:90::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;859:5:2::1;839:17;;:25;;;;;;;;;;;;;;;;;;782:90::o:0;297:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;462:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;948:400::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1081:17:2::1;;;;;;;;;;;1073:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1148:5;;:12;;1131:6;;:13;;:29;:62;;;;;1180:6;;:13;;1164:5;;:12;;:29;1131:62;1123:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;1240:9;1235:106;1259:6;;:13;;1255:1;:17;1235:106;;;1290:41;1296:6;;1303:1;1296:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;1307:5;;1313:1;1307:8;;;;;;;:::i;:::-;;;;;;;;1317:6;;1324:1;1317:9;;;;;;;:::i;:::-;;;;;;;;1290:41;;;;;;;;;;;::::0;:5:::1;:41::i;:::-;1274:3;;;;;:::i;:::-;;;;1235:106;;;;948:400:::0;;;;;;:::o;222:36::-;;;;;;;;;;;;;:::o;4123:442:3:-;4364:12;:10;:12::i;:::-;4356:20;;:4;:20;;;:60;;;;4380:36;4397:4;4403:12;:10;:12::i;:::-;4380:16;:36::i;:::-;4356:60;4334:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;4505:52;4528:4;4534:2;4538:3;4543:7;4552:4;4505:22;:52::i;:::-;4123:442;;;;;:::o;2581:524::-;2737:16;2798:3;:10;2779:8;:15;:29;2771:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2867:30;2914:8;:15;2900:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2867:63;;2948:9;2943:122;2967:8;:15;2963:1;:19;2943:122;;;3023:30;3033:8;3042:1;3033:11;;;;;;;;:::i;:::-;;;;;;;;3046:3;3050:1;3046:6;;;;;;;;:::i;:::-;;;;;;;;3023:9;:30::i;:::-;3004:13;3018:1;3004:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2984:3;;;;:::i;:::-;;;2943:122;;;;3084:13;3077:20;;;2581:524;;;;:::o;2028:138:2:-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2108:12:2::1;;;;;;;;;;;2107:13;2099:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;2143:15;2151:6;;2143:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:15::i;:::-;2028:138:::0;;:::o;735:353:4:-;911:12;:10;:12::i;:::-;900:23;;:7;:23;;;:66;;;;927:39;944:7;953:12;:10;:12::i;:::-;927:16;:39::i;:::-;900:66;878:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;1048:32;1059:7;1068:3;1073:6;1048:10;:32::i;:::-;735:353;;;:::o;1714:103:10:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1063:87::-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2590:184:2:-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2693:16:2::1;:24;2710:6;2693:24;;;;;;;;;;;;;;;;;;;;;2692:25;2684:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;2760:6;;2740:9;:17;2750:6;2740:17;;;;;;;;;;;:26;;;;;;;:::i;:::-;;2590:184:::0;;;:::o;3178:155:3:-;3273:52;3292:12;:10;:12::i;:::-;3306:8;3316;3273:18;:52::i;:::-;3178:155;;:::o;384:24:2:-;;;;;;;;;;;;;:::o;2382:124::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2459:17:2::1;2469:6;;2459:9;:17::i;:::-;2487:11;:9;:11::i;:::-;2382:124:::0;;:::o;2838:109::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2935:4:2::1;2908:16;:24;2925:6;2908:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2838:109:::0;:::o;1419:260::-;1294:12:10;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1523:17:2::1;;;;;;;;;;;1515:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1581:9;1576:96;1600:6;;:13;;1596:1;:17;1576:96;;;1631:31;1637:6;;1644:1;1637:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;1648:6;1656:1;1631:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;1615:3;;;;;:::i;:::-;;;;1576:96;;;;1419:260:::0;;;:::o;3405:168:3:-;3504:4;3528:18;:27;3547:7;3528:27;;;;;;;;;;;;;;;:37;3556:8;3528:37;;;;;;;;;;;;;;;;;;;;;;;;;3521:44;;3405:168;;;;:::o;3645:401::-;3861:12;:10;:12::i;:::-;3853:20;;:4;:20;;;:60;;;;3877:36;3894:4;3900:12;:10;:12::i;:::-;3877:16;:36::i;:::-;3853:60;3831:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;3993:45;4011:4;4017:2;4021;4025:6;4033:4;3993:17;:45::i;:::-;3645:401;;;;;:::o;1972:201:10:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;;;2053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;406:321:4:-;557:12;:10;:12::i;:::-;546:23;;:7;:23;;;:66;;;;573:39;590:7;599:12;:10;:12::i;:::-;573:16;:39::i;:::-;546:66;524:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;694:25;700:7;709:2;713:5;694;:25::i;:::-;406:321;;;:::o;854:157:5:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;1928:105:3:-;1988:13;2021:4;2014:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1928:105;;;:::o;8599:569::-;8766:1;8752:16;;:2;:16;;;;8744:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8819:16;8838:12;:10;:12::i;:::-;8819:31;;8863:102;8884:8;8902:1;8906:2;8910:21;8928:2;8910:17;:21::i;:::-;8933:25;8951:6;8933:17;:25::i;:::-;8960:4;8863:20;:102::i;:::-;8999:6;8978:9;:13;8988:2;8978:13;;;;;;;;;;;:17;8992:2;8978:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9058:2;9021:52;;9054:1;9021:52;;9036:8;9021:52;;;9062:2;9066:6;9021:52;;;;;;;:::i;:::-;;;;;;;;9086:74;9117:8;9135:1;9139:2;9143;9147:6;9155:4;9086:30;:74::i;:::-;8733:435;8599:569;;;;:::o;6207:1074::-;6434:7;:14;6420:3;:10;:28;6412:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6526:1;6512:16;;:2;:16;;;;6504:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6583:16;6602:12;:10;:12::i;:::-;6583:31;;6627:60;6648:8;6658:4;6664:2;6668:3;6673:7;6682:4;6627:20;:60::i;:::-;6705:9;6700:421;6724:3;:10;6720:1;:14;6700:421;;;6756:10;6769:3;6773:1;6769:6;;;;;;;;:::i;:::-;;;;;;;;6756:19;;6790:14;6807:7;6815:1;6807:10;;;;;;;;:::i;:::-;;;;;;;;6790:27;;6834:19;6856:9;:13;6866:2;6856:13;;;;;;;;;;;:19;6870:4;6856:19;;;;;;;;;;;;;;;;6834:41;;6913:6;6898:11;:21;;6890:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;7046:6;7032:11;:20;7010:9;:13;7020:2;7010:13;;;;;;;;;;;:19;7024:4;7010:19;;;;;;;;;;;;;;;:42;;;;7103:6;7082:9;:13;7092:2;7082:13;;;;;;;;;;;:17;7096:2;7082:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6741:380;;;6736:3;;;;:::i;:::-;;;6700:421;;;;7168:2;7138:47;;7162:4;7138:47;;7152:8;7138:47;;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7198:75;7234:8;7244:4;7250:2;7254:3;7259:7;7268:4;7198:35;:75::i;:::-;6401:880;6207:1074;;;;;:::o;8125:88::-;8199:6;8192:4;:13;;;;;;;;;;;;:::i;:::-;;8125:88;:::o;11360:891::-;11528:1;11512:18;;:4;:18;;;;11504:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11603:7;:14;11589:3;:10;:28;11581:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11675:16;11694:12;:10;:12::i;:::-;11675:31;;11719:66;11740:8;11750:4;11764:1;11768:3;11773:7;11719:66;;;;;;;;;;;;:20;:66::i;:::-;11803:9;11798:373;11822:3;:10;11818:1;:14;11798:373;;;11854:10;11867:3;11871:1;11867:6;;;;;;;;:::i;:::-;;;;;;;;11854:19;;11888:14;11905:7;11913:1;11905:10;;;;;;;;:::i;:::-;;;;;;;;11888:27;;11932:19;11954:9;:13;11964:2;11954:13;;;;;;;;;;;:19;11968:4;11954:19;;;;;;;;;;;;;;;;11932:41;;12011:6;11996:11;:21;;11988:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12138:6;12124:11;:20;12102:9;:13;12112:2;12102:13;;;;;;;;;;;:19;12116:4;12102:19;;;;;;;;;;;;;;;:42;;;;11839:332;;;11834:3;;;;;:::i;:::-;;;;11798:373;;;;12226:1;12188:55;;12212:4;12188:55;;12202:8;12188:55;;;12230:3;12235:7;12188:55;;;;;;;:::i;:::-;;;;;;;;11493:758;11360:891;;;:::o;2333:191:10:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;12393:331:3:-;12548:8;12539:17;;:5;:17;;;;12531:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12651:8;12613:18;:25;12632:5;12613:25;;;;;;;;;;;;;;;:35;12639:8;12613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12697:8;12675:41;;12690:5;12675:41;;;12707:8;12675:41;;;;;;:::i;:::-;;;;;;;;12393:331;;;:::o;5029:820::-;5231:1;5217:16;;:2;:16;;;;5209:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5288:16;5307:12;:10;:12::i;:::-;5288:31;;5332:96;5353:8;5363:4;5369:2;5373:21;5391:2;5373:17;:21::i;:::-;5396:25;5414:6;5396:17;:25::i;:::-;5423:4;5332:20;:96::i;:::-;5441:19;5463:9;:13;5473:2;5463:13;;;;;;;;;;;:19;5477:4;5463:19;;;;;;;;;;;;;;;;5441:41;;5516:6;5501:11;:21;;5493:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5641:6;5627:11;:20;5605:9;:13;5615:2;5605:13;;;;;;;;;;;:19;5619:4;5605:19;;;;;;;;;;;;;;;:42;;;;5690:6;5669:9;:13;5679:2;5669:13;;;;;;;;;;;:17;5683:2;5669:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5745:2;5714:46;;5739:4;5714:46;;5729:8;5714:46;;;5749:2;5753:6;5714:46;;;;;;;:::i;:::-;;;;;;;;5773:68;5804:8;5814:4;5820:2;5824;5828:6;5836:4;5773:30;:68::i;:::-;5198:651;;5029:820;;;;;:::o;10509:648::-;10652:1;10636:18;;:4;:18;;;;10628:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10707:16;10726:12;:10;:12::i;:::-;10707:31;;10751:102;10772:8;10782:4;10796:1;10800:21;10818:2;10800:17;:21::i;:::-;10823:25;10841:6;10823:17;:25::i;:::-;10751:102;;;;;;;;;;;;:20;:102::i;:::-;10866:19;10888:9;:13;10898:2;10888:13;;;;;;;;;;;:19;10902:4;10888:19;;;;;;;;;;;;;;;;10866:41;;10941:6;10926:11;:21;;10918:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11060:6;11046:11;:20;11024:9;:13;11034:2;11024:13;;;;;;;;;;;:19;11038:4;11024:19;;;;;;;;;;;;;;;:42;;;;11134:1;11095:54;;11120:4;11095:54;;11110:8;11095:54;;;11138:2;11142:6;11095:54;;;;;;;:::i;:::-;;;;;;;;10617:540;;10509:648;;;:::o;15482:198::-;15548:16;15577:22;15616:1;15602:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15577:41;;15640:7;15629:5;15635:1;15629:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;15667:5;15660:12;;;15482:198;;;:::o;13680:221::-;;;;;;;:::o;13909:744::-;14124:15;:2;:13;;;:15::i;:::-;14120:526;;;14177:2;14160:38;;;14199:8;14209:4;14215:2;14219:6;14227:4;14160:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14156:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14508:6;14501:14;;;;;;;;;;;:::i;:::-;;;;;;;;14156:479;;;14557:62;;;;;;;;;;:::i;:::-;;;;;;;;14156:479;14294:43;;;14282:55;;;:8;:55;;;;14278:154;;14362:50;;;;;;;;;;:::i;:::-;;;;;;;;14278:154;14233:214;14120:526;13909:744;;;;;;:::o;14661:813::-;14901:15;:2;:13;;;:15::i;:::-;14897:570;;;14954:2;14937:43;;;14981:8;14991:4;14997:3;15002:7;15011:4;14937:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14933:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15329:6;15322:14;;;;;;;;;;;:::i;:::-;;;;;;;;14933:523;;;15378:62;;;;;;;;;;:::i;:::-;;;;;;;;14933:523;15110:48;;;15098:60;;;:8;:60;;;;15094:159;;15183:50;;;;;;;;;;:::i;:::-;;;;;;;;15094:159;15017:251;14897:570;14661:813;;;;;;:::o;797:387:0:-;857:4;1065:12;1132:7;1120:20;1112:28;;1175:1;1168:4;:8;1161:15;;;797:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:11:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:568::-;2148:8;2158:6;2208:3;2201:4;2193:6;2189:17;2185:27;2175:122;;2216:79;;:::i;:::-;2175:122;2329:6;2316:20;2306:30;;2359:18;2351:6;2348:30;2345:117;;;2381:79;;:::i;:::-;2345:117;2495:4;2487:6;2483:17;2471:29;;2549:3;2541:4;2533:6;2529:17;2519:8;2515:32;2512:41;2509:128;;;2556:79;;:::i;:::-;2509:128;2075:568;;;;;:::o;2666:370::-;2737:5;2786:3;2779:4;2771:6;2767:17;2763:27;2753:122;;2794:79;;:::i;:::-;2753:122;2911:6;2898:20;2936:94;3026:3;3018:6;3011:4;3003:6;2999:17;2936:94;:::i;:::-;2927:103;;2743:293;2666:370;;;;:::o;3059:568::-;3132:8;3142:6;3192:3;3185:4;3177:6;3173:17;3169:27;3159:122;;3200:79;;:::i;:::-;3159:122;3313:6;3300:20;3290:30;;3343:18;3335:6;3332:30;3329:117;;;3365:79;;:::i;:::-;3329:117;3479:4;3471:6;3467:17;3455:29;;3533:3;3525:4;3517:6;3513:17;3503:8;3499:32;3496:41;3493:128;;;3540:79;;:::i;:::-;3493:128;3059:568;;;;;:::o;3650:370::-;3721:5;3770:3;3763:4;3755:6;3751:17;3747:27;3737:122;;3778:79;;:::i;:::-;3737:122;3895:6;3882:20;3920:94;4010:3;4002:6;3995:4;3987:6;3983:17;3920:94;:::i;:::-;3911:103;;3727:293;3650:370;;;;:::o;4026:133::-;4069:5;4107:6;4094:20;4085:29;;4123:30;4147:5;4123:30;:::i;:::-;4026:133;;;;:::o;4165:137::-;4210:5;4248:6;4235:20;4226:29;;4264:32;4290:5;4264:32;:::i;:::-;4165:137;;;;:::o;4308:141::-;4364:5;4395:6;4389:13;4380:22;;4411:32;4437:5;4411:32;:::i;:::-;4308:141;;;;:::o;4468:338::-;4523:5;4572:3;4565:4;4557:6;4553:17;4549:27;4539:122;;4580:79;;:::i;:::-;4539:122;4697:6;4684:20;4722:78;4796:3;4788:6;4781:4;4773:6;4769:17;4722:78;:::i;:::-;4713:87;;4529:277;4468:338;;;;:::o;4826:553::-;4884:8;4894:6;4944:3;4937:4;4929:6;4925:17;4921:27;4911:122;;4952:79;;:::i;:::-;4911:122;5065:6;5052:20;5042:30;;5095:18;5087:6;5084:30;5081:117;;;5117:79;;:::i;:::-;5081:117;5231:4;5223:6;5219:17;5207:29;;5285:3;5277:4;5269:6;5265:17;5255:8;5251:32;5248:41;5245:128;;;5292:79;;:::i;:::-;5245:128;4826:553;;;;;:::o;5385:139::-;5431:5;5469:6;5456:20;5447:29;;5485:33;5512:5;5485:33;:::i;:::-;5385:139;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:474::-;5933:6;5941;5990:2;5978:9;5969:7;5965:23;5961:32;5958:119;;;5996:79;;:::i;:::-;5958:119;6116:1;6141:53;6186:7;6177:6;6166:9;6162:22;6141:53;:::i;:::-;6131:63;;6087:117;6243:2;6269:53;6314:7;6305:6;6294:9;6290:22;6269:53;:::i;:::-;6259:63;;6214:118;5865:474;;;;;:::o;6345:1509::-;6499:6;6507;6515;6523;6531;6580:3;6568:9;6559:7;6555:23;6551:33;6548:120;;;6587:79;;:::i;:::-;6548:120;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6990:2;6979:9;6975:18;6962:32;7021:18;7013:6;7010:30;7007:117;;;7043:79;;:::i;:::-;7007:117;7148:78;7218:7;7209:6;7198:9;7194:22;7148:78;:::i;:::-;7138:88;;6933:303;7303:2;7292:9;7288:18;7275:32;7334:18;7326:6;7323:30;7320:117;;;7356:79;;:::i;:::-;7320:117;7461:78;7531:7;7522:6;7511:9;7507:22;7461:78;:::i;:::-;7451:88;;7246:303;7616:3;7605:9;7601:19;7588:33;7648:18;7640:6;7637:30;7634:117;;;7670:79;;:::i;:::-;7634:117;7775:62;7829:7;7820:6;7809:9;7805:22;7775:62;:::i;:::-;7765:72;;7559:288;6345:1509;;;;;;;;:::o;7860:1089::-;7964:6;7972;7980;7988;7996;8045:3;8033:9;8024:7;8020:23;8016:33;8013:120;;;8052:79;;:::i;:::-;8013:120;8172:1;8197:53;8242:7;8233:6;8222:9;8218:22;8197:53;:::i;:::-;8187:63;;8143:117;8299:2;8325:53;8370:7;8361:6;8350:9;8346:22;8325:53;:::i;:::-;8315:63;;8270:118;8427:2;8453:53;8498:7;8489:6;8478:9;8474:22;8453:53;:::i;:::-;8443:63;;8398:118;8555:2;8581:53;8626:7;8617:6;8606:9;8602:22;8581:53;:::i;:::-;8571:63;;8526:118;8711:3;8700:9;8696:19;8683:33;8743:18;8735:6;8732:30;8729:117;;;8765:79;;:::i;:::-;8729:117;8870:62;8924:7;8915:6;8904:9;8900:22;8870:62;:::i;:::-;8860:72;;8654:288;7860:1089;;;;;;;;:::o;8955:1039::-;9082:6;9090;9098;9147:2;9135:9;9126:7;9122:23;9118:32;9115:119;;;9153:79;;:::i;:::-;9115:119;9273:1;9298:53;9343:7;9334:6;9323:9;9319:22;9298:53;:::i;:::-;9288:63;;9244:117;9428:2;9417:9;9413:18;9400:32;9459:18;9451:6;9448:30;9445:117;;;9481:79;;:::i;:::-;9445:117;9586:78;9656:7;9647:6;9636:9;9632:22;9586:78;:::i;:::-;9576:88;;9371:303;9741:2;9730:9;9726:18;9713:32;9772:18;9764:6;9761:30;9758:117;;;9794:79;;:::i;:::-;9758:117;9899:78;9969:7;9960:6;9949:9;9945:22;9899:78;:::i;:::-;9889:88;;9684:303;8955:1039;;;;;:::o;10000:468::-;10065:6;10073;10122:2;10110:9;10101:7;10097:23;10093:32;10090:119;;;10128:79;;:::i;:::-;10090:119;10248:1;10273:53;10318:7;10309:6;10298:9;10294:22;10273:53;:::i;:::-;10263:63;;10219:117;10375:2;10401:50;10443:7;10434:6;10423:9;10419:22;10401:50;:::i;:::-;10391:60;;10346:115;10000:468;;;;;:::o;10474:474::-;10542:6;10550;10599:2;10587:9;10578:7;10574:23;10570:32;10567:119;;;10605:79;;:::i;:::-;10567:119;10725:1;10750:53;10795:7;10786:6;10775:9;10771:22;10750:53;:::i;:::-;10740:63;;10696:117;10852:2;10878:53;10923:7;10914:6;10903:9;10899:22;10878:53;:::i;:::-;10868:63;;10823:118;10474:474;;;;;:::o;10954:619::-;11031:6;11039;11047;11096:2;11084:9;11075:7;11071:23;11067:32;11064:119;;;11102:79;;:::i;:::-;11064:119;11222:1;11247:53;11292:7;11283:6;11272:9;11268:22;11247:53;:::i;:::-;11237:63;;11193:117;11349:2;11375:53;11420:7;11411:6;11400:9;11396:22;11375:53;:::i;:::-;11365:63;;11320:118;11477:2;11503:53;11548:7;11539:6;11528:9;11524:22;11503:53;:::i;:::-;11493:63;;11448:118;10954:619;;;;;:::o;11579:1309::-;11737:6;11745;11753;11761;11769;11777;11826:2;11814:9;11805:7;11801:23;11797:32;11794:119;;;11832:79;;:::i;:::-;11794:119;11980:1;11969:9;11965:17;11952:31;12010:18;12002:6;11999:30;11996:117;;;12032:79;;:::i;:::-;11996:117;12145:80;12217:7;12208:6;12197:9;12193:22;12145:80;:::i;:::-;12127:98;;;;11923:312;12302:2;12291:9;12287:18;12274:32;12333:18;12325:6;12322:30;12319:117;;;12355:79;;:::i;:::-;12319:117;12468:80;12540:7;12531:6;12520:9;12516:22;12468:80;:::i;:::-;12450:98;;;;12245:313;12625:2;12614:9;12610:18;12597:32;12656:18;12648:6;12645:30;12642:117;;;12678:79;;:::i;:::-;12642:117;12791:80;12863:7;12854:6;12843:9;12839:22;12791:80;:::i;:::-;12773:98;;;;12568:313;11579:1309;;;;;;;;:::o;12894:704::-;12989:6;12997;13005;13054:2;13042:9;13033:7;13029:23;13025:32;13022:119;;;13060:79;;:::i;:::-;13022:119;13208:1;13197:9;13193:17;13180:31;13238:18;13230:6;13227:30;13224:117;;;13260:79;;:::i;:::-;13224:117;13373:80;13445:7;13436:6;13425:9;13421:22;13373:80;:::i;:::-;13355:98;;;;13151:312;13502:2;13528:53;13573:7;13564:6;13553:9;13549:22;13528:53;:::i;:::-;13518:63;;13473:118;12894:704;;;;;:::o;13604:894::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13933:1;13922:9;13918:17;13905:31;13963:18;13955:6;13952:30;13949:117;;;13985:79;;:::i;:::-;13949:117;14090:78;14160:7;14151:6;14140:9;14136:22;14090:78;:::i;:::-;14080:88;;13876:302;14245:2;14234:9;14230:18;14217:32;14276:18;14268:6;14265:30;14262:117;;;14298:79;;:::i;:::-;14262:117;14403:78;14473:7;14464:6;14453:9;14449:22;14403:78;:::i;:::-;14393:88;;14188:303;13604:894;;;;;:::o;14504:327::-;14562:6;14611:2;14599:9;14590:7;14586:23;14582:32;14579:119;;;14617:79;;:::i;:::-;14579:119;14737:1;14762:52;14806:7;14797:6;14786:9;14782:22;14762:52;:::i;:::-;14752:62;;14708:116;14504:327;;;;:::o;14837:349::-;14906:6;14955:2;14943:9;14934:7;14930:23;14926:32;14923:119;;;14961:79;;:::i;:::-;14923:119;15081:1;15106:63;15161:7;15152:6;15141:9;15137:22;15106:63;:::i;:::-;15096:73;;15052:127;14837:349;;;;:::o;15192:529::-;15263:6;15271;15320:2;15308:9;15299:7;15295:23;15291:32;15288:119;;;15326:79;;:::i;:::-;15288:119;15474:1;15463:9;15459:17;15446:31;15504:18;15496:6;15493:30;15490:117;;;15526:79;;:::i;:::-;15490:117;15639:65;15696:7;15687:6;15676:9;15672:22;15639:65;:::i;:::-;15621:83;;;;15417:297;15192:529;;;;;:::o;15727:674::-;15807:6;15815;15823;15872:2;15860:9;15851:7;15847:23;15843:32;15840:119;;;15878:79;;:::i;:::-;15840:119;16026:1;16015:9;16011:17;15998:31;16056:18;16048:6;16045:30;16042:117;;;16078:79;;:::i;:::-;16042:117;16191:65;16248:7;16239:6;16228:9;16224:22;16191:65;:::i;:::-;16173:83;;;;15969:297;16305:2;16331:53;16376:7;16367:6;16356:9;16352:22;16331:53;:::i;:::-;16321:63;;16276:118;15727:674;;;;;:::o;16407:329::-;16466:6;16515:2;16503:9;16494:7;16490:23;16486:32;16483:119;;;16521:79;;:::i;:::-;16483:119;16641:1;16666:53;16711:7;16702:6;16691:9;16687:22;16666:53;:::i;:::-;16656:63;;16612:117;16407:329;;;;:::o;16742:179::-;16811:10;16832:46;16874:3;16866:6;16832:46;:::i;:::-;16910:4;16905:3;16901:14;16887:28;;16742:179;;;;:::o;16927:118::-;17014:24;17032:5;17014:24;:::i;:::-;17009:3;17002:37;16927:118;;:::o;17081:732::-;17200:3;17229:54;17277:5;17229:54;:::i;:::-;17299:86;17378:6;17373:3;17299:86;:::i;:::-;17292:93;;17409:56;17459:5;17409:56;:::i;:::-;17488:7;17519:1;17504:284;17529:6;17526:1;17523:13;17504:284;;;17605:6;17599:13;17632:63;17691:3;17676:13;17632:63;:::i;:::-;17625:70;;17718:60;17771:6;17718:60;:::i;:::-;17708:70;;17564:224;17551:1;17548;17544:9;17539:14;;17504:284;;;17508:14;17804:3;17797:10;;17205:608;;;17081:732;;;;:::o;17819:109::-;17900:21;17915:5;17900:21;:::i;:::-;17895:3;17888:34;17819:109;;:::o;17934:360::-;18020:3;18048:38;18080:5;18048:38;:::i;:::-;18102:70;18165:6;18160:3;18102:70;:::i;:::-;18095:77;;18181:52;18226:6;18221:3;18214:4;18207:5;18203:16;18181:52;:::i;:::-;18258:29;18280:6;18258:29;:::i;:::-;18253:3;18249:39;18242:46;;18024:270;17934:360;;;;:::o;18300:364::-;18388:3;18416:39;18449:5;18416:39;:::i;:::-;18471:71;18535:6;18530:3;18471:71;:::i;:::-;18464:78;;18551:52;18596:6;18591:3;18584:4;18577:5;18573:16;18551:52;:::i;:::-;18628:29;18650:6;18628:29;:::i;:::-;18623:3;18619:39;18612:46;;18392:272;18300:364;;;;:::o;18670:366::-;18812:3;18833:67;18897:2;18892:3;18833:67;:::i;:::-;18826:74;;18909:93;18998:3;18909:93;:::i;:::-;19027:2;19022:3;19018:12;19011:19;;18670:366;;;:::o;19042:::-;19184:3;19205:67;19269:2;19264:3;19205:67;:::i;:::-;19198:74;;19281:93;19370:3;19281:93;:::i;:::-;19399:2;19394:3;19390:12;19383:19;;19042:366;;;:::o;19414:::-;19556:3;19577:67;19641:2;19636:3;19577:67;:::i;:::-;19570:74;;19653:93;19742:3;19653:93;:::i;:::-;19771:2;19766:3;19762:12;19755:19;;19414:366;;;:::o;19786:::-;19928:3;19949:67;20013:2;20008:3;19949:67;:::i;:::-;19942:74;;20025:93;20114:3;20025:93;:::i;:::-;20143:2;20138:3;20134:12;20127:19;;19786:366;;;:::o;20158:::-;20300:3;20321:67;20385:2;20380:3;20321:67;:::i;:::-;20314:74;;20397:93;20486:3;20397:93;:::i;:::-;20515:2;20510:3;20506:12;20499:19;;20158:366;;;:::o;20530:::-;20672:3;20693:67;20757:2;20752:3;20693:67;:::i;:::-;20686:74;;20769:93;20858:3;20769:93;:::i;:::-;20887:2;20882:3;20878:12;20871:19;;20530:366;;;:::o;20902:::-;21044:3;21065:67;21129:2;21124:3;21065:67;:::i;:::-;21058:74;;21141:93;21230:3;21141:93;:::i;:::-;21259:2;21254:3;21250:12;21243:19;;20902:366;;;:::o;21274:::-;21416:3;21437:67;21501:2;21496:3;21437:67;:::i;:::-;21430:74;;21513:93;21602:3;21513:93;:::i;:::-;21631:2;21626:3;21622:12;21615:19;;21274:366;;;:::o;21646:::-;21788:3;21809:67;21873:2;21868:3;21809:67;:::i;:::-;21802:74;;21885:93;21974:3;21885:93;:::i;:::-;22003:2;21998:3;21994:12;21987:19;;21646:366;;;:::o;22018:365::-;22160:3;22181:66;22245:1;22240:3;22181:66;:::i;:::-;22174:73;;22256:93;22345:3;22256:93;:::i;:::-;22374:2;22369:3;22365:12;22358:19;;22018:365;;;:::o;22389:366::-;22531:3;22552:67;22616:2;22611:3;22552:67;:::i;:::-;22545:74;;22628:93;22717:3;22628:93;:::i;:::-;22746:2;22741:3;22737:12;22730:19;;22389:366;;;:::o;22761:::-;22903:3;22924:67;22988:2;22983:3;22924:67;:::i;:::-;22917:74;;23000:93;23089:3;23000:93;:::i;:::-;23118:2;23113:3;23109:12;23102:19;;22761:366;;;:::o;23133:::-;23275:3;23296:67;23360:2;23355:3;23296:67;:::i;:::-;23289:74;;23372:93;23461:3;23372:93;:::i;:::-;23490:2;23485:3;23481:12;23474:19;;23133:366;;;:::o;23505:::-;23647:3;23668:67;23732:2;23727:3;23668:67;:::i;:::-;23661:74;;23744:93;23833:3;23744:93;:::i;:::-;23862:2;23857:3;23853:12;23846:19;;23505:366;;;:::o;23877:::-;24019:3;24040:67;24104:2;24099:3;24040:67;:::i;:::-;24033:74;;24116:93;24205:3;24116:93;:::i;:::-;24234:2;24229:3;24225:12;24218:19;;23877:366;;;:::o;24249:::-;24391:3;24412:67;24476:2;24471:3;24412:67;:::i;:::-;24405:74;;24488:93;24577:3;24488:93;:::i;:::-;24606:2;24601:3;24597:12;24590:19;;24249:366;;;:::o;24621:::-;24763:3;24784:67;24848:2;24843:3;24784:67;:::i;:::-;24777:74;;24860:93;24949:3;24860:93;:::i;:::-;24978:2;24973:3;24969:12;24962:19;;24621:366;;;:::o;24993:::-;25135:3;25156:67;25220:2;25215:3;25156:67;:::i;:::-;25149:74;;25232:93;25321:3;25232:93;:::i;:::-;25350:2;25345:3;25341:12;25334:19;;24993:366;;;:::o;25365:108::-;25442:24;25460:5;25442:24;:::i;:::-;25437:3;25430:37;25365:108;;:::o;25479:118::-;25566:24;25584:5;25566:24;:::i;:::-;25561:3;25554:37;25479:118;;:::o;25603:222::-;25696:4;25734:2;25723:9;25719:18;25711:26;;25747:71;25815:1;25804:9;25800:17;25791:6;25747:71;:::i;:::-;25603:222;;;;:::o;25831:1053::-;26154:4;26192:3;26181:9;26177:19;26169:27;;26206:71;26274:1;26263:9;26259:17;26250:6;26206:71;:::i;:::-;26287:72;26355:2;26344:9;26340:18;26331:6;26287:72;:::i;:::-;26406:9;26400:4;26396:20;26391:2;26380:9;26376:18;26369:48;26434:108;26537:4;26528:6;26434:108;:::i;:::-;26426:116;;26589:9;26583:4;26579:20;26574:2;26563:9;26559:18;26552:48;26617:108;26720:4;26711:6;26617:108;:::i;:::-;26609:116;;26773:9;26767:4;26763:20;26757:3;26746:9;26742:19;26735:49;26801:76;26872:4;26863:6;26801:76;:::i;:::-;26793:84;;25831:1053;;;;;;;;:::o;26890:751::-;27113:4;27151:3;27140:9;27136:19;27128:27;;27165:71;27233:1;27222:9;27218:17;27209:6;27165:71;:::i;:::-;27246:72;27314:2;27303:9;27299:18;27290:6;27246:72;:::i;:::-;27328;27396:2;27385:9;27381:18;27372:6;27328:72;:::i;:::-;27410;27478:2;27467:9;27463:18;27454:6;27410:72;:::i;:::-;27530:9;27524:4;27520:20;27514:3;27503:9;27499:19;27492:49;27558:76;27629:4;27620:6;27558:76;:::i;:::-;27550:84;;26890:751;;;;;;;;:::o;27647:373::-;27790:4;27828:2;27817:9;27813:18;27805:26;;27877:9;27871:4;27867:20;27863:1;27852:9;27848:17;27841:47;27905:108;28008:4;27999:6;27905:108;:::i;:::-;27897:116;;27647:373;;;;:::o;28026:634::-;28247:4;28285:2;28274:9;28270:18;28262:26;;28334:9;28328:4;28324:20;28320:1;28309:9;28305:17;28298:47;28362:108;28465:4;28456:6;28362:108;:::i;:::-;28354:116;;28517:9;28511:4;28507:20;28502:2;28491:9;28487:18;28480:48;28545:108;28648:4;28639:6;28545:108;:::i;:::-;28537:116;;28026:634;;;;;:::o;28666:210::-;28753:4;28791:2;28780:9;28776:18;28768:26;;28804:65;28866:1;28855:9;28851:17;28842:6;28804:65;:::i;:::-;28666:210;;;;:::o;28882:313::-;28995:4;29033:2;29022:9;29018:18;29010:26;;29082:9;29076:4;29072:20;29068:1;29057:9;29053:17;29046:47;29110:78;29183:4;29174:6;29110:78;:::i;:::-;29102:86;;28882:313;;;;:::o;29201:419::-;29367:4;29405:2;29394:9;29390:18;29382:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29482:131;29608:4;29482:131;:::i;:::-;29474:139;;29201:419;;;:::o;29626:::-;29792:4;29830:2;29819:9;29815:18;29807:26;;29879:9;29873:4;29869:20;29865:1;29854:9;29850:17;29843:47;29907:131;30033:4;29907:131;:::i;:::-;29899:139;;29626:419;;;:::o;30051:::-;30217:4;30255:2;30244:9;30240:18;30232:26;;30304:9;30298:4;30294:20;30290:1;30279:9;30275:17;30268:47;30332:131;30458:4;30332:131;:::i;:::-;30324:139;;30051:419;;;:::o;30476:::-;30642:4;30680:2;30669:9;30665:18;30657:26;;30729:9;30723:4;30719:20;30715:1;30704:9;30700:17;30693:47;30757:131;30883:4;30757:131;:::i;:::-;30749:139;;30476:419;;;:::o;30901:::-;31067:4;31105:2;31094:9;31090:18;31082:26;;31154:9;31148:4;31144:20;31140:1;31129:9;31125:17;31118:47;31182:131;31308:4;31182:131;:::i;:::-;31174:139;;30901:419;;;:::o;31326:::-;31492:4;31530:2;31519:9;31515:18;31507:26;;31579:9;31573:4;31569:20;31565:1;31554:9;31550:17;31543:47;31607:131;31733:4;31607:131;:::i;:::-;31599:139;;31326:419;;;:::o;31751:::-;31917:4;31955:2;31944:9;31940:18;31932:26;;32004:9;31998:4;31994:20;31990:1;31979:9;31975:17;31968:47;32032:131;32158:4;32032:131;:::i;:::-;32024:139;;31751:419;;;:::o;32176:::-;32342:4;32380:2;32369:9;32365:18;32357:26;;32429:9;32423:4;32419:20;32415:1;32404:9;32400:17;32393:47;32457:131;32583:4;32457:131;:::i;:::-;32449:139;;32176:419;;;:::o;32601:::-;32767:4;32805:2;32794:9;32790:18;32782:26;;32854:9;32848:4;32844:20;32840:1;32829:9;32825:17;32818:47;32882:131;33008:4;32882:131;:::i;:::-;32874:139;;32601:419;;;:::o;33026:::-;33192:4;33230:2;33219:9;33215:18;33207:26;;33279:9;33273:4;33269:20;33265:1;33254:9;33250:17;33243:47;33307:131;33433:4;33307:131;:::i;:::-;33299:139;;33026:419;;;:::o;33451:::-;33617:4;33655:2;33644:9;33640:18;33632:26;;33704:9;33698:4;33694:20;33690:1;33679:9;33675:17;33668:47;33732:131;33858:4;33732:131;:::i;:::-;33724:139;;33451:419;;;:::o;33876:::-;34042:4;34080:2;34069:9;34065:18;34057:26;;34129:9;34123:4;34119:20;34115:1;34104:9;34100:17;34093:47;34157:131;34283:4;34157:131;:::i;:::-;34149:139;;33876:419;;;:::o;34301:::-;34467:4;34505:2;34494:9;34490:18;34482:26;;34554:9;34548:4;34544:20;34540:1;34529:9;34525:17;34518:47;34582:131;34708:4;34582:131;:::i;:::-;34574:139;;34301:419;;;:::o;34726:::-;34892:4;34930:2;34919:9;34915:18;34907:26;;34979:9;34973:4;34969:20;34965:1;34954:9;34950:17;34943:47;35007:131;35133:4;35007:131;:::i;:::-;34999:139;;34726:419;;;:::o;35151:::-;35317:4;35355:2;35344:9;35340:18;35332:26;;35404:9;35398:4;35394:20;35390:1;35379:9;35375:17;35368:47;35432:131;35558:4;35432:131;:::i;:::-;35424:139;;35151:419;;;:::o;35576:::-;35742:4;35780:2;35769:9;35765:18;35757:26;;35829:9;35823:4;35819:20;35815:1;35804:9;35800:17;35793:47;35857:131;35983:4;35857:131;:::i;:::-;35849:139;;35576:419;;;:::o;36001:::-;36167:4;36205:2;36194:9;36190:18;36182:26;;36254:9;36248:4;36244:20;36240:1;36229:9;36225:17;36218:47;36282:131;36408:4;36282:131;:::i;:::-;36274:139;;36001:419;;;:::o;36426:::-;36592:4;36630:2;36619:9;36615:18;36607:26;;36679:9;36673:4;36669:20;36665:1;36654:9;36650:17;36643:47;36707:131;36833:4;36707:131;:::i;:::-;36699:139;;36426:419;;;:::o;36851:222::-;36944:4;36982:2;36971:9;36967:18;36959:26;;36995:71;37063:1;37052:9;37048:17;37039:6;36995:71;:::i;:::-;36851:222;;;;:::o;37079:332::-;37200:4;37238:2;37227:9;37223:18;37215:26;;37251:71;37319:1;37308:9;37304:17;37295:6;37251:71;:::i;:::-;37332:72;37400:2;37389:9;37385:18;37376:6;37332:72;:::i;:::-;37079:332;;;;;:::o;37417:129::-;37451:6;37478:20;;:::i;:::-;37468:30;;37507:33;37535:4;37527:6;37507:33;:::i;:::-;37417:129;;;:::o;37552:75::-;37585:6;37618:2;37612:9;37602:19;;37552:75;:::o;37633:311::-;37710:4;37800:18;37792:6;37789:30;37786:56;;;37822:18;;:::i;:::-;37786:56;37872:4;37864:6;37860:17;37852:25;;37932:4;37926;37922:15;37914:23;;37633:311;;;:::o;37950:::-;38027:4;38117:18;38109:6;38106:30;38103:56;;;38139:18;;:::i;:::-;38103:56;38189:4;38181:6;38177:17;38169:25;;38249:4;38243;38239:15;38231:23;;37950:311;;;:::o;38267:307::-;38328:4;38418:18;38410:6;38407:30;38404:56;;;38440:18;;:::i;:::-;38404:56;38478:29;38500:6;38478:29;:::i;:::-;38470:37;;38562:4;38556;38552:15;38544:23;;38267:307;;;:::o;38580:132::-;38647:4;38670:3;38662:11;;38700:4;38695:3;38691:14;38683:22;;38580:132;;;:::o;38718:114::-;38785:6;38819:5;38813:12;38803:22;;38718:114;;;:::o;38838:98::-;38889:6;38923:5;38917:12;38907:22;;38838:98;;;:::o;38942:99::-;38994:6;39028:5;39022:12;39012:22;;38942:99;;;:::o;39047:113::-;39117:4;39149;39144:3;39140:14;39132:22;;39047:113;;;:::o;39166:184::-;39265:11;39299:6;39294:3;39287:19;39339:4;39334:3;39330:14;39315:29;;39166:184;;;;:::o;39356:168::-;39439:11;39473:6;39468:3;39461:19;39513:4;39508:3;39504:14;39489:29;;39356:168;;;;:::o;39530:169::-;39614:11;39648:6;39643:3;39636:19;39688:4;39683:3;39679:14;39664:29;;39530:169;;;;:::o;39705:305::-;39745:3;39764:20;39782:1;39764:20;:::i;:::-;39759:25;;39798:20;39816:1;39798:20;:::i;:::-;39793:25;;39952:1;39884:66;39880:74;39877:1;39874:81;39871:107;;;39958:18;;:::i;:::-;39871:107;40002:1;39999;39995:9;39988:16;;39705:305;;;;:::o;40016:96::-;40053:7;40082:24;40100:5;40082:24;:::i;:::-;40071:35;;40016:96;;;:::o;40118:90::-;40152:7;40195:5;40188:13;40181:21;40170:32;;40118:90;;;:::o;40214:149::-;40250:7;40290:66;40283:5;40279:78;40268:89;;40214:149;;;:::o;40369:126::-;40406:7;40446:42;40439:5;40435:54;40424:65;;40369:126;;;:::o;40501:77::-;40538:7;40567:5;40556:16;;40501:77;;;:::o;40584:154::-;40668:6;40663:3;40658;40645:30;40730:1;40721:6;40716:3;40712:16;40705:27;40584:154;;;:::o;40744:307::-;40812:1;40822:113;40836:6;40833:1;40830:13;40822:113;;;40921:1;40916:3;40912:11;40906:18;40902:1;40897:3;40893:11;40886:39;40858:2;40855:1;40851:10;40846:15;;40822:113;;;40953:6;40950:1;40947:13;40944:101;;;41033:1;41024:6;41019:3;41015:16;41008:27;40944:101;40793:258;40744:307;;;:::o;41057:320::-;41101:6;41138:1;41132:4;41128:12;41118:22;;41185:1;41179:4;41175:12;41206:18;41196:81;;41262:4;41254:6;41250:17;41240:27;;41196:81;41324:2;41316:6;41313:14;41293:18;41290:38;41287:84;;;41343:18;;:::i;:::-;41287:84;41108:269;41057:320;;;:::o;41383:281::-;41466:27;41488:4;41466:27;:::i;:::-;41458:6;41454:40;41596:6;41584:10;41581:22;41560:18;41548:10;41545:34;41542:62;41539:88;;;41607:18;;:::i;:::-;41539:88;41647:10;41643:2;41636:22;41426:238;41383:281;;:::o;41670:233::-;41709:3;41732:24;41750:5;41732:24;:::i;:::-;41723:33;;41778:66;41771:5;41768:77;41765:103;;;41848:18;;:::i;:::-;41765:103;41895:1;41888:5;41884:13;41877:20;;41670:233;;;:::o;41909:180::-;41957:77;41954:1;41947:88;42054:4;42051:1;42044:15;42078:4;42075:1;42068:15;42095:180;42143:77;42140:1;42133:88;42240:4;42237:1;42230:15;42264:4;42261:1;42254:15;42281:180;42329:77;42326:1;42319:88;42426:4;42423:1;42416:15;42450:4;42447:1;42440:15;42467:180;42515:77;42512:1;42505:88;42612:4;42609:1;42602:15;42636:4;42633:1;42626:15;42653:183;42688:3;42726:1;42708:16;42705:23;42702:128;;;42764:1;42761;42758;42743:23;42786:34;42817:1;42811:8;42786:34;:::i;:::-;42779:41;;42702:128;42653:183;:::o;42842:117::-;42951:1;42948;42941:12;42965:117;43074:1;43071;43064:12;43088:117;43197:1;43194;43187:12;43211:117;43320:1;43317;43310:12;43334:117;43443:1;43440;43433:12;43457:117;43566:1;43563;43556:12;43580:102;43621:6;43672:2;43668:7;43663:2;43656:5;43652:14;43648:28;43638:38;;43580:102;;;:::o;43688:106::-;43732:8;43781:5;43776:3;43772:15;43751:36;;43688:106;;;:::o;43800:239::-;43940:34;43936:1;43928:6;43924:14;43917:58;44009:22;44004:2;43996:6;43992:15;43985:47;43800:239;:::o;44045:227::-;44185:34;44181:1;44173:6;44169:14;44162:58;44254:10;44249:2;44241:6;44237:15;44230:35;44045:227;:::o;44278:167::-;44418:19;44414:1;44406:6;44402:14;44395:43;44278:167;:::o;44451:230::-;44591:34;44587:1;44579:6;44575:14;44568:58;44660:13;44655:2;44647:6;44643:15;44636:38;44451:230;:::o;44687:225::-;44827:34;44823:1;44815:6;44811:14;44804:58;44896:8;44891:2;44883:6;44879:15;44872:33;44687:225;:::o;44918:223::-;45058:34;45054:1;45046:6;45042:14;45035:58;45127:6;45122:2;45114:6;45110:15;45103:31;44918:223;:::o;45147:228::-;45287:34;45283:1;45275:6;45271:14;45264:58;45356:11;45351:2;45343:6;45339:15;45332:36;45147:228;:::o;45381:224::-;45521:34;45517:1;45509:6;45505:14;45498:58;45590:7;45585:2;45577:6;45573:15;45566:32;45381:224;:::o;45611:237::-;45751:34;45747:1;45739:6;45735:14;45728:58;45820:20;45815:2;45807:6;45803:15;45796:45;45611:237;:::o;45854:157::-;45994:9;45990:1;45982:6;45978:14;45971:33;45854:157;:::o;46017:222::-;46157:34;46153:1;46145:6;46141:14;46134:58;46226:5;46221:2;46213:6;46209:15;46202:30;46017:222;:::o;46245:229::-;46385:34;46381:1;46373:6;46369:14;46362:58;46454:12;46449:2;46441:6;46437:15;46430:37;46245:229;:::o;46480:161::-;46620:13;46616:1;46608:6;46604:14;46597:37;46480:161;:::o;46647:182::-;46787:34;46783:1;46775:6;46771:14;46764:58;46647:182;:::o;46835:228::-;46975:34;46971:1;46963:6;46959:14;46952:58;47044:11;47039:2;47031:6;47027:15;47020:36;46835:228;:::o;47069:::-;47209:34;47205:1;47197:6;47193:14;47186:58;47278:11;47273:2;47265:6;47261:15;47254:36;47069:228;:::o;47303:227::-;47443:34;47439:1;47431:6;47427:14;47420:58;47512:10;47507:2;47499:6;47495:15;47488:35;47303:227;:::o;47536:220::-;47676:34;47672:1;47664:6;47660:14;47653:58;47745:3;47740:2;47732:6;47728:15;47721:28;47536:220;:::o;47762:711::-;47801:3;47839:4;47821:16;47818:26;47815:39;;;47847:5;;47815:39;47876:20;;:::i;:::-;47951:1;47933:16;47929:24;47926:1;47920:4;47905:49;47984:4;47978:11;48083:16;48076:4;48068:6;48064:17;48061:39;48028:18;48020:6;48017:30;48001:113;47998:146;;;48129:5;;;;47998:146;48175:6;48169:4;48165:17;48211:3;48205:10;48238:18;48230:6;48227:30;48224:43;;;48260:5;;;;;;48224:43;48308:6;48301:4;48296:3;48292:14;48288:27;48367:1;48349:16;48345:24;48339:4;48335:35;48330:3;48327:44;48324:57;;;48374:5;;;;;;;48324:57;48391;48439:6;48433:4;48429:17;48421:6;48417:30;48411:4;48391:57;:::i;:::-;48464:3;48457:10;;47805:668;;;;;47762:711;;:::o;48479:122::-;48552:24;48570:5;48552:24;:::i;:::-;48545:5;48542:35;48532:63;;48591:1;48588;48581:12;48532:63;48479:122;:::o;48607:116::-;48677:21;48692:5;48677:21;:::i;:::-;48670:5;48667:32;48657:60;;48713:1;48710;48703:12;48657:60;48607:116;:::o;48729:120::-;48801:23;48818:5;48801:23;:::i;:::-;48794:5;48791:34;48781:62;;48839:1;48836;48829:12;48781:62;48729:120;:::o;48855:122::-;48928:24;48946:5;48928:24;:::i;:::-;48921:5;48918:35;48908:63;;48967:1;48964;48957:12;48908:63;48855:122;:::o

Swarm Source

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