Contract 0xf77586b7abfb5a0af44d80e333d2d1290c75adfb

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9260d47f86961886d1aa7a2a8e667bdd7fbf33958b85867d8760b26b8d14ceffMint293739232022-11-28 1:45:078 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.005754094842 31.991364821
0xa1e68a86cf68379f165eb88bd4e6ab20d24a6ade4745fe667e9a639e97abd626Mint293739212022-11-28 1:44:578 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.005754094842 31.991364821
0xe02bf2ef35560bb662450aac99756a136ff1f04f75d16e365c7dc1ae4c9a3c7aMint293739182022-11-28 1:44:428 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.005754094842 31.991364821
0xba6227fdce76f47084e471e0ff9867ab86d4c4af63df2175def8bc8f40981fddMint293739122022-11-28 1:44:128 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0x62bc61447354d8a7e5f1b180e6412cfa2ca874005a90377f5f1e4b8988bc4cf2Mint293739122022-11-28 1:44:128 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0x569bfaf7a924355dc7ffb07a4495108ba4f7554749cae5bc03a7b0dabc79ef26Mint293739122022-11-28 1:44:128 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0x6e361722a07ef5058aa11cf3c60c2da9c024b866f4dda21450336150c0aaf276Mint293739082022-11-28 1:43:528 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0xd6523adc53a7c85413a5a8bb5cc0fcdaab5d4cac7eaec21765e404a7ea9a213cMint293739082022-11-28 1:43:528 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0xa9babd74c8fefa5287f6a6757152f0e5a1149ccd1e22dd5eb7e7ba20641152ebMint293739032022-11-28 1:43:278 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00581366427 32.320400001
0x38d9d1aac2728c564e996c6465ad04f8f7ae110f0e355f7ab63074efe605d392Mint293739022022-11-28 1:43:228 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.005754478738 31.99136482
0xac7ff2e463e5aed5b00f85645ed715488563c89202e45b474ac976d9c80efdd9Mint293738922022-11-28 1:42:328 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0x9fc326a01d781651635a50d2e8058c3b221c82ee0d2901baf9e2432161c80264Mint293738922022-11-28 1:42:328 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0xcb329fd3cf346eede15b79763d74a4fea0ca27de4054c04c9f7053b17dc4d312Mint293738912022-11-28 1:42:278 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.980000001
0x4046cdddf82a56b3e47baaadad1fed330e8e03402d7c74960506d070780be670Mint293738882022-11-28 1:42:128 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.980000001
0xa0106438e664eae433117ba516799e0e3fb4a26f60f542f20c675cfd8425a089Mint293738822022-11-28 1:41:418 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0xdbbbf5ca7b66442e9f8aa662f485261ab9c73de279156525ac4d878894ef729cMint293738802022-11-28 1:41:318 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0xf309d19f37b5eab48faf26f4a31925126569792a5175abd091f98400e3389520Mint293738752022-11-28 1:41:068 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0xf302af1c18ed88f9e53a49c22edf58e454a514eeee6a0f5fce83490fa5f651a5Mint293738752022-11-28 1:41:068 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0x9836f4abff6b1632d7d937bd82193f220e348bcd524e44a0f4571ce112e6af85Mint293738722022-11-28 1:40:518 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0xc0726f2e2dce62e7cd328d4652072ff82fe18aef59f3ba4de6d4a764077d325aMint293738692022-11-28 1:40:368 days 23 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.00593231048 32.98
0x5f91cf3465bf58af059f2bada62db0b0be1333d3e1e7f6d09ce43b2d5b55408fMint293151782022-11-24 15:01:0412 days 10 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.000236290623 1.313718275
0xda05c33bbf6c623264958ecca3f3c2395b00f6949ce3fb457ff87f08ecde5f30Mint293151762022-11-24 15:00:5412 days 10 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.000236290623 1.313718276
0xa22c1388ce61c858ed8edb7b19b3b2b937185dd55b60eb01a8fce10ff5ab98b0Mint293151752022-11-24 15:00:4912 days 10 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.000236290623 1.313718276
0xa33dc4b65fc47dd589742ac39e79b00ae3a401c439cdfcf147c4137432894212Mint293151732022-11-24 15:00:3912 days 10 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.000236306388 1.313718273
0x37843e7b6d67857c6fbbd797b558cf9bb2c5c06ec00460e8f101876d5d258481Mint293151692022-11-24 15:00:1912 days 10 hrs ago0xffc8742bc545261febbd51aa64a2b36c045e37d5 IN  0xf77586b7abfb5a0af44d80e333d2d1290c75adfb0 MATIC0.000236306387 1.313718272
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xF90FBee3791b3304d3257FCa4BB24874a075259B

Contract Name:
FTERC1155

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-11-07
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;


interface IERC165 {
    
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC1155 is IERC165 {
    
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    
    event URI(string value, uint256 indexed id);

    
    function balanceOf(address account, uint256 id) external view returns (uint256);

    
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    
    function setApprovalForAll(address operator, bool approved) external;

    
    function isApprovedForAll(address account, address operator) external view returns (bool);

    
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

interface IERC1155Receiver is IERC165 {
    
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC1155MetadataURI is IERC1155 {
    
    function uri(uint256 id) external view returns (string memory);
}

library Address {
    
    function isContract(address account) internal view returns (bool) {
        
        
        

        return account.code.length > 0;
    }

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

    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                

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

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

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

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

contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    
    mapping(uint256 => mapping(address => uint256)) private _balances;

    
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    
    string private _uri;

    
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

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

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

    
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

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

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

    
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

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

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

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

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

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

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

interface IAccessControl {
    
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    
    function hasRole(bytes32 role, address account) external view returns (bool);

    
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    
    function grantRole(bytes32 role, address account) external;

    
    function revokeRole(bytes32 role, address account) external;

    
    function renounceRole(bytes32 role, address account) external;
}

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

    
    function toString(uint256 value) internal pure returns (string memory) {
        
        

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

    
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    
    constructor() {
        _transferOwnership(_msgSender());
    }

    
    function owner() public view virtual returns (address) {
        return _owner;
    }

    
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            
            
            
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

abstract contract Initializable {
    
    bool private _initialized;

    
    bool private _initializing;

    
    modifier initializer() {
        
        
        
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !Address.isContract(address(this));
    }
}

struct ContractAttributes {
    string contractUri;
    bool isTransferable;
    bool isBurnable;
    uint256 startDate;
    uint256 endDate;
}

contract FTERC1155 is ERC1155, AccessControl, ERC1155Burnable, Ownable {
    using SafeMath for uint256;

    bytes32 public constant URI_SETTER_ROLE = keccak256('URI_SETTER_ROLE');
    bytes32 public constant MINTER_ROLE = keccak256('MINTER_ROLE');

    string public name;
    string public symbol;

    event UpdateNameEvent(string oldName, string newName);
    event UpdateSymbolEvent(string oldSymbol, string newSymbol);


    
    uint256 private _nextTokenIdToMint;

    
    ContractAttributes private _contractAttributes;

    
    mapping(uint256 => string) private _tokenURIs;

    
    mapping(uint256 => address) private _owners;

    
    constructor(
        string memory initName,
        string memory initSymbol,
        string memory contractUri,
        bool isTransferable,
        bool isBurnable,
        uint256 startDate,
        uint256 endDate
    ) ERC1155(contractUri) AccessControl() ERC1155Burnable() Ownable() {
        _contractAttributes = ContractAttributes({
            contractUri: contractUri,
            isTransferable: isTransferable,
            isBurnable: isBurnable,
            startDate: startDate,
            endDate: endDate
        });

        name = initName;
        symbol = initSymbol;

        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(URI_SETTER_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
    }

    

    
    function getNextTokenIdToMint() public view returns (uint256) {
        return _nextTokenIdToMint;
    }

    
    function contractURI() public view returns (string memory) {
        return _contractAttributes.contractUri;
    }

    
    function uri(uint256 tokenId) public view override returns (string memory) {
        return _tokenURIs[tokenId];
    }

    
    function getContractAttributes()
        public
        view
        returns (
            string memory,
            bool,
            bool,
            uint256,
            uint256
        )
    {
        return (
            _contractAttributes.contractUri,
            _contractAttributes.isTransferable,
            _contractAttributes.isBurnable,
            _contractAttributes.startDate,
            _contractAttributes.endDate
        );
    }

    
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC1155: invalid token ID");
        return owner;
    }

    

    

    function updateName(string memory newName) public onlyRole(DEFAULT_ADMIN_ROLE) {
        string memory oldName = name;
        name = newName;
        emit UpdateNameEvent(oldName, name);
    }

    function updateSymbol(string memory newSymbol) public onlyRole(DEFAULT_ADMIN_ROLE) {
        string memory oldSymbol = symbol;
        symbol = newSymbol;
        emit UpdateSymbolEvent(oldSymbol, symbol);
    }

    
    function setContractAttributes(
        string calldata contractUri,
        bool isTransferable,
        bool isBurnable,
        uint256 startDate,
        uint256 endDate
    ) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _contractAttributes.contractUri = contractUri;
        _contractAttributes.isTransferable = isTransferable;
        _contractAttributes.isBurnable = isBurnable;
        _contractAttributes.startDate = startDate;
        _contractAttributes.endDate = endDate;
    }

    
    function mint(
        address account,
        uint256 tokenId,
        string calldata tokenUri,
        uint256 amount
    ) public onlyRole(MINTER_ROLE) {
        uint256 tokenIdToMint;
        if (tokenId == type(uint256).max || tokenId == _nextTokenIdToMint) {
            tokenIdToMint = _nextTokenIdToMint;
            _nextTokenIdToMint += 1;
        } else {
            require(tokenId < _nextTokenIdToMint, 'invalid id');
            tokenIdToMint = tokenId;
        }

        _mintTo(account, tokenIdToMint, tokenUri, amount);
    }

    

    
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override {
        bool isTransferable = _contractAttributes.isTransferable;
        bool isBurnable = _contractAttributes.isBurnable;
        bool isValidStartDate = _contractAttributes.startDate != 0 && from == address(0) ? _contractAttributes.startDate <= block.timestamp : true; 
        bool isValidEndDate = _contractAttributes.endDate != 0 && from == address(0) ? _contractAttributes.endDate >= block.timestamp : true;

        require(isValidStartDate && isValidEndDate, "not valid");

        if(to == address(0)) {
            require(isBurnable, "cannot burn");
        }

        bool isZeroAddress = from == address(0) || to == address(0);
        if(!isZeroAddress) {
            require(isTransferable, "cannot transfer");
        }
    }
    

    

    

    
    function _mintTo(
        address account,
        uint256 tokenId,
        string calldata tokenUri,
        uint256 amount
    ) internal {
        if (bytes(_tokenURIs[tokenId]).length == 0) {
            require(bytes(tokenUri).length > 0, 'empty uri.');
            _tokenURIs[tokenId] = tokenUri;
        }

        _owners[tokenId] = account;

        _mint(account, tokenId, amount, '');
    }

    
    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        for(uint i; i < ids.length; i = i.add(1)){
            require(ids[i] == _nextTokenIdToMint);
            _nextTokenIdToMint = _nextTokenIdToMint.add(1);
            _owners[ids[i]] = to;
        }
        _mintBatch(to, ids, amounts, data);
    }

    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(AccessControl, ERC1155)
        returns (bool)
    {
        return interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);

    }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"initName","type":"string"},{"internalType":"string","name":"initSymbol","type":"string"},{"internalType":"string","name":"contractUri","type":"string"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"bool","name":"isBurnable","type":"bool"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldName","type":"string"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"UpdateNameEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"newSymbol","type":"string"}],"name":"UpdateSymbolEvent","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractAttributes","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenIdToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenUri","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"string","name":"contractUri","type":"string"},{"internalType":"bool","name":"isTransferable","type":"bool"},{"internalType":"bool","name":"isBurnable","type":"bool"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"setContractAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"updateSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162006063380380620060638339818101604052810190620000379190620006d1565b846200004981620001c560201b60201c565b506200006a6200005e620001e160201b60201c565b620001e960201b60201c565b6040518060a00160405280868152602001851515815260200184151581526020018381526020018281525060086000820151816000019080519060200190620000b59291906200040c565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160010160016101000a81548160ff02191690831515021790555060608201518160020155608082015181600301559050508660059080519060200190620001259291906200040c565b5085600690805190602001906200013e9291906200040c565b50620001546000801b33620002af60201b60201c565b620001867f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c33620002af60201b60201c565b620001b87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620002af60201b60201c565b5050505050505062000845565b8060029080519060200190620001dd9291906200040c565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c18282620003a160201b60201c565b6200039d5760016003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000342620001e160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200041a9062000810565b90600052602060002090601f0160209004810192826200043e57600085556200048a565b82601f106200045957805160ff19168380011785556200048a565b828001600101855582156200048a579182015b82811115620004895782518255916020019190600101906200046c565b5b5090506200049991906200049d565b5090565b5b80821115620004b85760008160009055506001016200049e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200052582620004da565b810181811067ffffffffffffffff82111715620005475762000546620004eb565b5b80604052505050565b60006200055c620004bc565b90506200056a82826200051a565b919050565b600067ffffffffffffffff8211156200058d576200058c620004eb565b5b6200059882620004da565b9050602081019050919050565b60005b83811015620005c5578082015181840152602081019050620005a8565b83811115620005d5576000848401525b50505050565b6000620005f2620005ec846200056f565b62000550565b905082815260208101848484011115620006115762000610620004d5565b5b6200061e848285620005a5565b509392505050565b600082601f8301126200063e576200063d620004d0565b5b815162000650848260208601620005db565b91505092915050565b60008115159050919050565b620006708162000659565b81146200067c57600080fd5b50565b600081519050620006908162000665565b92915050565b6000819050919050565b620006ab8162000696565b8114620006b757600080fd5b50565b600081519050620006cb81620006a0565b92915050565b600080600080600080600060e0888a031215620006f357620006f2620004c6565b5b600088015167ffffffffffffffff811115620007145762000713620004cb565b5b620007228a828b0162000626565b975050602088015167ffffffffffffffff811115620007465762000745620004cb565b5b620007548a828b0162000626565b965050604088015167ffffffffffffffff811115620007785762000777620004cb565b5b620007868a828b0162000626565b9550506060620007998a828b016200067f565b9450506080620007ac8a828b016200067f565b93505060a0620007bf8a828b01620006ba565b92505060c0620007d28a828b01620006ba565b91505092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200082957607f821691505b6020821081036200083f576200083e620007e1565b5b50919050565b61580e80620008556000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063715018a61161010f578063ac3dc8b3116100a2578063e985e9c511610071578063e985e9c514610594578063f242432a146105c4578063f2fde38b146105e0578063f5298aca146105fc576101ef565b8063ac3dc8b31461051e578063d53913931461053c578063d547741f1461055a578063e8a3d48514610576576101ef565b806391d14854116100de57806391d148541461049657806395d89b41146104c6578063a217fddf146104e4578063a22cb46514610502576101ef565b8063715018a6146104345780637f3457101461043e57806384da92a71461045c5780638da5cb5b14610478576101ef565b80632f2ff15d11610187578063537f531211610156578063537f5312146103b05780635aebced3146103cc5780636352211e146103e85780636b20c45414610418576101ef565b80632f2ff15d1461032657806336568abe146103425780633c6462321461035e5780634e1273f414610380576101ef565b80630e89341c116101c35780630e89341c1461028e5780631f7fdffa146102be578063248a9ca3146102da5780632eb2c2d61461030a576101ef565b8062fdd58e146101f457806301ffc9a71461022457806306fdde031461025457806308a8d7aa14610272575b600080fd5b61020e60048036038101906102099190613804565b610618565b60405161021b9190613853565b60405180910390f35b61023e600480360381019061023991906138c6565b6106e0565b60405161024b919061390e565b60405180910390f35b61025c6107c2565b60405161026991906139c2565b60405180910390f35b61028c60048036038101906102879190613a49565b610850565b005b6102a860048036038101906102a39190613ad1565b61093a565b6040516102b591906139c2565b60405180910390f35b6102d860048036038101906102d39190613cf1565b6109df565b005b6102f460048036038101906102ef9190613de2565b610afc565b6040516103019190613e1e565b60405180910390f35b610324600480360381019061031f9190613e39565b610b1c565b005b610340600480360381019061033b9190613f08565b610bbd565b005b61035c60048036038101906103579190613f08565b610be6565b005b610366610c69565b604051610377959493929190613f48565b60405180910390f35b61039a60048036038101906103959190614065565b610d45565b6040516103a7919061419b565b60405180910390f35b6103ca60048036038101906103c5919061425e565b610e5e565b005b6103e660048036038101906103e191906142d3565b610f58565b005b61040260048036038101906103fd9190613ad1565b610fd9565b60405161040f919061437c565b60405180910390f35b610432600480360381019061042d9190614397565b61108a565b005b61043c611127565b005b6104466111af565b6040516104539190613e1e565b60405180910390f35b6104766004803603810190610471919061425e565b6111d3565b005b6104806112cd565b60405161048d919061437c565b60405180910390f35b6104b060048036038101906104ab9190613f08565b6112f7565b6040516104bd919061390e565b60405180910390f35b6104ce611362565b6040516104db91906139c2565b60405180910390f35b6104ec6113f0565b6040516104f99190613e1e565b60405180910390f35b61051c60048036038101906105179190614422565b6113f7565b005b61052661140d565b6040516105339190613853565b60405180910390f35b610544611417565b6040516105519190613e1e565b60405180910390f35b610574600480360381019061056f9190613f08565b61143b565b005b61057e611464565b60405161058b91906139c2565b60405180910390f35b6105ae60048036038101906105a99190614462565b6114f9565b6040516105bb919061390e565b60405180910390f35b6105de60048036038101906105d991906144a2565b61158d565b005b6105fa60048036038101906105f59190614539565b61162e565b005b61061660048036038101906106119190614566565b611725565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067f9061462b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ab57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107bb57506107ba826117c2565b5b9050919050565b600580546107cf9061467a565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb9061467a565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b505050505081565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108828161087d61183c565b611844565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8614806108b3575060075486145b156108dc5760075490506001600760008282546108d091906146da565b92505081905550610924565b6007548610610920576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109179061477c565b60405180910390fd5b8590505b61093187828787876118e1565b50505050505050565b6060600c6000838152602001908152602001600020805461095a9061467a565b80601f01602080910402602001604051908101604052809291908181526020018280546109869061467a565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a1181610a0c61183c565b611844565b60005b8451811015610ae857600754858281518110610a3357610a3261479c565b5b602002602001015114610a4557600080fd5b610a5b60016007546119e690919063ffffffff16565b60078190555085600d6000878481518110610a7957610a7861479c565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ae16001826119e690919063ffffffff16565b9050610a14565b50610af5858585856119fc565b5050505050565b600060036000838152602001908152602001600020600101549050919050565b610b2461183c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b6a5750610b6985610b6461183c565b6114f9565b5b610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061483d565b60405180910390fd5b610bb68585858585611c19565b5050505050565b610bc682610afc565b610bd781610bd261183c565b611844565b610be18383611f2c565b505050565b610bee61183c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c52906148cf565b60405180910390fd5b610c65828261200d565b5050565b60606000806000806008600001600860010160009054906101000a900460ff16600860010160019054906101000a900460ff16600860020154600860030154848054610cb49061467a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce09061467a565b8015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b50505050509450945094509450945094509091929394565b60608151835114610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8290614961565b60405180910390fd5b6000835167ffffffffffffffff811115610da857610da7613afe565b5b604051908082528060200260200182016040528015610dd65781602001602082028036833780820191505090505b50905060005b8451811015610e5357610e23858281518110610dfb57610dfa61479c565b5b6020026020010151858381518110610e1657610e1561479c565b5b6020026020010151610618565b828281518110610e3657610e3561479c565b5b60200260200101818152505080610e4c90614981565b9050610ddc565b508091505092915050565b6000801b610e7381610e6e61183c565b611844565b600060068054610e829061467a565b80601f0160208091040260200160405190810160405280929190818152602001828054610eae9061467a565b8015610efb5780601f10610ed057610100808354040283529160200191610efb565b820191906000526020600020905b815481529060010190602001808311610ede57829003601f168201915b505050505090508260069080519060200190610f18929190613633565b507f5344d4d433345406ae6b78f1be2f3317b44670bb31b729561391004fbdf99cc7816006604051610f4b929190614a5e565b60405180910390a1505050565b6000801b610f6d81610f6861183c565b611844565b868660086000019190610f819291906136b9565b5084600860010160006101000a81548160ff02191690831515021790555083600860010160016101000a81548160ff021916908315150217905550826008600201819055508160086003018190555050505050505050565b600080600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890614ae1565b60405180910390fd5b80915050919050565b61109261183c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806110d857506110d7836110d261183c565b6114f9565b5b611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90614b73565b60405180910390fd5b6111228383836120ef565b505050565b61112f61183c565b73ffffffffffffffffffffffffffffffffffffffff1661114d6112cd565b73ffffffffffffffffffffffffffffffffffffffff16146111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614bdf565b60405180910390fd5b6111ad600061239f565b565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b6000801b6111e8816111e361183c565b611844565b6000600580546111f79061467a565b80601f01602080910402602001604051908101604052809291908181526020018280546112239061467a565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b50505050509050826005908051906020019061128d929190613633565b507f7c792b0935c1aad589d60c776f75efe6bea81bce17fda35401dad37cf9bff7ed8160056040516112c0929190614a5e565b60405180910390a1505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6006805461136f9061467a565b80601f016020809104026020016040519081016040528092919081815260200182805461139b9061467a565b80156113e85780601f106113bd576101008083540402835291602001916113e8565b820191906000526020600020905b8154815290600101906020018083116113cb57829003601f168201915b505050505081565b6000801b81565b61140961140261183c565b8383612465565b5050565b6000600754905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61144482610afc565b6114558161145061183c565b611844565b61145f838361200d565b505050565b6060600860000180546114769061467a565b80601f01602080910402602001604051908101604052809291908181526020018280546114a29061467a565b80156114ef5780601f106114c4576101008083540402835291602001916114ef565b820191906000526020600020905b8154815290600101906020018083116114d257829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61159561183c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806115db57506115da856115d561183c565b6114f9565b5b61161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190614b73565b60405180910390fd5b61162785858585856125d1565b5050505050565b61163661183c565b73ffffffffffffffffffffffffffffffffffffffff166116546112cd565b73ffffffffffffffffffffffffffffffffffffffff16146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190614bdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171090614c71565b60405180910390fd5b6117228161239f565b50565b61172d61183c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061177357506117728361176d61183c565b6114f9565b5b6117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990614b73565b60405180910390fd5b6117bd838383612852565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611835575061183482612a6e565b5b9050919050565b600033905090565b61184e82826112f7565b6118dd576118738173ffffffffffffffffffffffffffffffffffffffff166014612b50565b6118818360001c6020612b50565b604051602001611892929190614d65565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d491906139c2565b60405180910390fd5b5050565b6000600c600086815260200190815260200160002080546119019061467a565b905003611972576000838390501161194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194590614deb565b60405180910390fd5b8282600c600087815260200190815260200160002091906119709291906136b9565b505b84600d600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119df85858360405180602001604052806000815250612d8c565b5050505050565b600081836119f491906146da565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290614e7d565b60405180910390fd5b8151835114611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690614f0f565b60405180910390fd5b6000611ab961183c565b9050611aca81600087878787612f21565b60005b8451811015611b8357838181518110611ae957611ae861479c565b5b6020026020010151600080878481518110611b0757611b0661479c565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6991906146da565b925050819055508080611b7b90614981565b915050611acd565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bfb929190614f2f565b60405180910390a4611c128160008787878761317e565b5050505050565b8151835114611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614f0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc390614fd8565b60405180910390fd5b6000611cd661183c565b9050611ce6818787878787612f21565b60005b8451811015611e97576000858281518110611d0757611d0661479c565b5b602002602001015190506000858381518110611d2657611d2561479c565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe9061506a565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7c91906146da565b9250508190555050505080611e9090614981565b9050611ce9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f0e929190614f2f565b60405180910390a4611f2481878787878761317e565b505050505050565b611f3682826112f7565b6120095760016003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fae61183c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61201782826112f7565b156120eb5760006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061209061183c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361215e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612155906150fc565b60405180910390fd5b80518251146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990614f0f565b60405180910390fd5b60006121ac61183c565b90506121cc81856000868660405180602001604052806000815250612f21565b60005b83518110156123195760008482815181106121ed576121ec61479c565b5b60200260200101519050600084838151811061220c5761220b61479c565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061518e565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061231190614981565b9150506121cf565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612391929190614f2f565b60405180910390a450505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca90615220565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125c4919061390e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263790614fd8565b60405180910390fd5b600061264a61183c565b905061266a81878761265b88613355565b61266488613355565b87612f21565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f89061506a565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b691906146da565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612833929190615240565b60405180910390a46128498288888888886133cf565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b8906150fc565b60405180910390fd5b60006128cb61183c565b90506128fb818560006128dd87613355565b6128e687613355565b60405180602001604052806000815250612f21565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129899061518e565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612a5f929190615240565b60405180910390a45050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b3957507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b495750612b48826135a6565b5b9050919050565b606060006002836002612b639190615269565b612b6d91906146da565b67ffffffffffffffff811115612b8657612b85613afe565b5b6040519080825280601f01601f191660200182016040528015612bb85781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612bf057612bef61479c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c5457612c5361479c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612c949190615269565b612c9e91906146da565b90505b6001811115612d3e577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ce057612cdf61479c565b5b1a60f81b828281518110612cf757612cf661479c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d37906152c3565b9050612ca1565b5060008414612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990615338565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df290614e7d565b60405180910390fd5b6000612e0561183c565b9050612e2681600087612e1788613355565b612e2088613355565b87612f21565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e8591906146da565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612f03929190615240565b60405180910390a4612f1a816000878787876133cf565b5050505050565b6000600860010160009054906101000a900460ff1690506000600860010160019054906101000a900460ff16905060008060086002015414158015612f925750600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b612f9d576001612fa7565b4260086002015411155b905060008060086003015414158015612fec5750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b612ff7576001613001565b4260086003015410155b905081801561300d5750805b61304c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613043906153a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036130c157826130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b790615410565b60405180910390fd5b5b60008073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614806131295750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b9050806131715784613170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131679061547c565b60405180910390fd5b5b5050505050505050505050565b61319d8473ffffffffffffffffffffffffffffffffffffffff16613610565b1561334d578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016131e39594939291906154f1565b6020604051808303816000875af192505050801561321f57506040513d601f19601f8201168201806040525081019061321c919061556e565b60015b6132c45761322b6155a8565b806308c379a003613287575061323f6155ca565b8061324a5750613289565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327e91906139c2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bb906156cc565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461334b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133429061575e565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561337457613373613afe565b5b6040519080825280602002602001820160405280156133a25781602001602082028036833780820191505090505b50905082816000815181106133ba576133b961479c565b5b60200260200101818152505080915050919050565b6133ee8473ffffffffffffffffffffffffffffffffffffffff16613610565b1561359e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161343495949392919061577e565b6020604051808303816000875af192505050801561347057506040513d601f19601f8201168201806040525081019061346d919061556e565b60015b6135155761347c6155a8565b806308c379a0036134d857506134906155ca565b8061349b57506134da565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf91906139c2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c906156cc565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461359c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135939061575e565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461363f9061467a565b90600052602060002090601f01602090048101928261366157600085556136a8565b82601f1061367a57805160ff19168380011785556136a8565b828001600101855582156136a8579182015b828111156136a757825182559160200191906001019061368c565b5b5090506136b5919061373f565b5090565b8280546136c59061467a565b90600052602060002090601f0160209004810192826136e7576000855561372e565b82601f1061370057803560ff191683800117855561372e565b8280016001018555821561372e579182015b8281111561372d578235825591602001919060010190613712565b5b50905061373b919061373f565b5090565b5b80821115613758576000816000905550600101613740565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061379b82613770565b9050919050565b6137ab81613790565b81146137b657600080fd5b50565b6000813590506137c8816137a2565b92915050565b6000819050919050565b6137e1816137ce565b81146137ec57600080fd5b50565b6000813590506137fe816137d8565b92915050565b6000806040838503121561381b5761381a613766565b5b6000613829858286016137b9565b925050602061383a858286016137ef565b9150509250929050565b61384d816137ce565b82525050565b60006020820190506138686000830184613844565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138a38161386e565b81146138ae57600080fd5b50565b6000813590506138c08161389a565b92915050565b6000602082840312156138dc576138db613766565b5b60006138ea848285016138b1565b91505092915050565b60008115159050919050565b613908816138f3565b82525050565b600060208201905061392360008301846138ff565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613963578082015181840152602081019050613948565b83811115613972576000848401525b50505050565b6000601f19601f8301169050919050565b600061399482613929565b61399e8185613934565b93506139ae818560208601613945565b6139b781613978565b840191505092915050565b600060208201905081810360008301526139dc8184613989565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613a0957613a086139e4565b5b8235905067ffffffffffffffff811115613a2657613a256139e9565b5b602083019150836001820283011115613a4257613a416139ee565b5b9250929050565b600080600080600060808688031215613a6557613a64613766565b5b6000613a73888289016137b9565b9550506020613a84888289016137ef565b945050604086013567ffffffffffffffff811115613aa557613aa461376b565b5b613ab1888289016139f3565b93509350506060613ac4888289016137ef565b9150509295509295909350565b600060208284031215613ae757613ae6613766565b5b6000613af5848285016137ef565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b3682613978565b810181811067ffffffffffffffff82111715613b5557613b54613afe565b5b80604052505050565b6000613b6861375c565b9050613b748282613b2d565b919050565b600067ffffffffffffffff821115613b9457613b93613afe565b5b602082029050602081019050919050565b6000613bb8613bb384613b79565b613b5e565b90508083825260208201905060208402830185811115613bdb57613bda6139ee565b5b835b81811015613c045780613bf088826137ef565b845260208401935050602081019050613bdd565b5050509392505050565b600082601f830112613c2357613c226139e4565b5b8135613c33848260208601613ba5565b91505092915050565b600080fd5b600067ffffffffffffffff821115613c5c57613c5b613afe565b5b613c6582613978565b9050602081019050919050565b82818337600083830152505050565b6000613c94613c8f84613c41565b613b5e565b905082815260208101848484011115613cb057613caf613c3c565b5b613cbb848285613c72565b509392505050565b600082601f830112613cd857613cd76139e4565b5b8135613ce8848260208601613c81565b91505092915050565b60008060008060808587031215613d0b57613d0a613766565b5b6000613d19878288016137b9565b945050602085013567ffffffffffffffff811115613d3a57613d3961376b565b5b613d4687828801613c0e565b935050604085013567ffffffffffffffff811115613d6757613d6661376b565b5b613d7387828801613c0e565b925050606085013567ffffffffffffffff811115613d9457613d9361376b565b5b613da087828801613cc3565b91505092959194509250565b6000819050919050565b613dbf81613dac565b8114613dca57600080fd5b50565b600081359050613ddc81613db6565b92915050565b600060208284031215613df857613df7613766565b5b6000613e0684828501613dcd565b91505092915050565b613e1881613dac565b82525050565b6000602082019050613e336000830184613e0f565b92915050565b600080600080600060a08688031215613e5557613e54613766565b5b6000613e63888289016137b9565b9550506020613e74888289016137b9565b945050604086013567ffffffffffffffff811115613e9557613e9461376b565b5b613ea188828901613c0e565b935050606086013567ffffffffffffffff811115613ec257613ec161376b565b5b613ece88828901613c0e565b925050608086013567ffffffffffffffff811115613eef57613eee61376b565b5b613efb88828901613cc3565b9150509295509295909350565b60008060408385031215613f1f57613f1e613766565b5b6000613f2d85828601613dcd565b9250506020613f3e858286016137b9565b9150509250929050565b600060a0820190508181036000830152613f628188613989565b9050613f7160208301876138ff565b613f7e60408301866138ff565b613f8b6060830185613844565b613f986080830184613844565b9695505050505050565b600067ffffffffffffffff821115613fbd57613fbc613afe565b5b602082029050602081019050919050565b6000613fe1613fdc84613fa2565b613b5e565b90508083825260208201905060208402830185811115614004576140036139ee565b5b835b8181101561402d578061401988826137b9565b845260208401935050602081019050614006565b5050509392505050565b600082601f83011261404c5761404b6139e4565b5b813561405c848260208601613fce565b91505092915050565b6000806040838503121561407c5761407b613766565b5b600083013567ffffffffffffffff81111561409a5761409961376b565b5b6140a685828601614037565b925050602083013567ffffffffffffffff8111156140c7576140c661376b565b5b6140d385828601613c0e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614112816137ce565b82525050565b60006141248383614109565b60208301905092915050565b6000602082019050919050565b6000614148826140dd565b61415281856140e8565b935061415d836140f9565b8060005b8381101561418e5781516141758882614118565b975061418083614130565b925050600181019050614161565b5085935050505092915050565b600060208201905081810360008301526141b5818461413d565b905092915050565b600067ffffffffffffffff8211156141d8576141d7613afe565b5b6141e182613978565b9050602081019050919050565b60006142016141fc846141bd565b613b5e565b90508281526020810184848401111561421d5761421c613c3c565b5b614228848285613c72565b509392505050565b600082601f830112614245576142446139e4565b5b81356142558482602086016141ee565b91505092915050565b60006020828403121561427457614273613766565b5b600082013567ffffffffffffffff8111156142925761429161376b565b5b61429e84828501614230565b91505092915050565b6142b0816138f3565b81146142bb57600080fd5b50565b6000813590506142cd816142a7565b92915050565b60008060008060008060a087890312156142f0576142ef613766565b5b600087013567ffffffffffffffff81111561430e5761430d61376b565b5b61431a89828a016139f3565b9650965050602061432d89828a016142be565b945050604061433e89828a016142be565b935050606061434f89828a016137ef565b925050608061436089828a016137ef565b9150509295509295509295565b61437681613790565b82525050565b6000602082019050614391600083018461436d565b92915050565b6000806000606084860312156143b0576143af613766565b5b60006143be868287016137b9565b935050602084013567ffffffffffffffff8111156143df576143de61376b565b5b6143eb86828701613c0e565b925050604084013567ffffffffffffffff81111561440c5761440b61376b565b5b61441886828701613c0e565b9150509250925092565b6000806040838503121561443957614438613766565b5b6000614447858286016137b9565b9250506020614458858286016142be565b9150509250929050565b6000806040838503121561447957614478613766565b5b6000614487858286016137b9565b9250506020614498858286016137b9565b9150509250929050565b600080600080600060a086880312156144be576144bd613766565b5b60006144cc888289016137b9565b95505060206144dd888289016137b9565b94505060406144ee888289016137ef565b93505060606144ff888289016137ef565b925050608086013567ffffffffffffffff8111156145205761451f61376b565b5b61452c88828901613cc3565b9150509295509295909350565b60006020828403121561454f5761454e613766565b5b600061455d848285016137b9565b91505092915050565b60008060006060848603121561457f5761457e613766565b5b600061458d868287016137b9565b935050602061459e868287016137ef565b92505060406145af868287016137ef565b9150509250925092565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614615602b83613934565b9150614620826145b9565b604082019050919050565b6000602082019050818103600083015261464481614608565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061469257607f821691505b6020821081036146a5576146a461464b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e5826137ce565b91506146f0836137ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614725576147246146ab565b5b828201905092915050565b7f696e76616c696420696400000000000000000000000000000000000000000000600082015250565b6000614766600a83613934565b915061477182614730565b602082019050919050565b6000602082019050818103600083015261479581614759565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614827603283613934565b9150614832826147cb565b604082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006148b9602f83613934565b91506148c48261485d565b604082019050919050565b600060208201905081810360008301526148e8816148ac565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061494b602983613934565b9150614956826148ef565b604082019050919050565b6000602082019050818103600083015261497a8161493e565b9050919050565b600061498c826137ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149be576149bd6146ab565b5b600182019050919050565b60008190508160005260206000209050919050565b600081546149eb8161467a565b6149f58186613934565b94506001821660008114614a105760018114614a2257614a55565b60ff1983168652602086019350614a55565b614a2b856149c9565b60005b83811015614a4d57815481890152600182019150602081019050614a2e565b808801955050505b50505092915050565b60006040820190508181036000830152614a788185613989565b90508181036020830152614a8c81846149de565b90509392505050565b7f455243313135353a20696e76616c696420746f6b656e20494400000000000000600082015250565b6000614acb601983613934565b9150614ad682614a95565b602082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614b5d602983613934565b9150614b6882614b01565b604082019050919050565b60006020820190508181036000830152614b8c81614b50565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bc9602083613934565b9150614bd482614b93565b602082019050919050565b60006020820190508181036000830152614bf881614bbc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c5b602683613934565b9150614c6682614bff565b604082019050919050565b60006020820190508181036000830152614c8a81614c4e565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614cd2601783614c91565b9150614cdd82614c9c565b601782019050919050565b6000614cf382613929565b614cfd8185614c91565b9350614d0d818560208601613945565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614d4f601183614c91565b9150614d5a82614d19565b601182019050919050565b6000614d7082614cc5565b9150614d7c8285614ce8565b9150614d8782614d42565b9150614d938284614ce8565b91508190509392505050565b7f656d707479207572692e00000000000000000000000000000000000000000000600082015250565b6000614dd5600a83613934565b9150614de082614d9f565b602082019050919050565b60006020820190508181036000830152614e0481614dc8565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e67602183613934565b9150614e7282614e0b565b604082019050919050565b60006020820190508181036000830152614e9681614e5a565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614ef9602883613934565b9150614f0482614e9d565b604082019050919050565b60006020820190508181036000830152614f2881614eec565b9050919050565b60006040820190508181036000830152614f49818561413d565b90508181036020830152614f5d818461413d565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614fc2602583613934565b9150614fcd82614f66565b604082019050919050565b60006020820190508181036000830152614ff181614fb5565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615054602a83613934565b915061505f82614ff8565b604082019050919050565b6000602082019050818103600083015261508381615047565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150e6602383613934565b91506150f18261508a565b604082019050919050565b60006020820190508181036000830152615115816150d9565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615178602483613934565b91506151838261511c565b604082019050919050565b600060208201905081810360008301526151a78161516b565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061520a602983613934565b9150615215826151ae565b604082019050919050565b60006020820190508181036000830152615239816151fd565b9050919050565b60006040820190506152556000830185613844565b6152626020830184613844565b9392505050565b6000615274826137ce565b915061527f836137ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152b8576152b76146ab565b5b828202905092915050565b60006152ce826137ce565b9150600082036152e1576152e06146ab565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615322602083613934565b915061532d826152ec565b602082019050919050565b6000602082019050818103600083015261535181615315565b9050919050565b7f6e6f742076616c69640000000000000000000000000000000000000000000000600082015250565b600061538e600983613934565b915061539982615358565b602082019050919050565b600060208201905081810360008301526153bd81615381565b9050919050565b7f63616e6e6f74206275726e000000000000000000000000000000000000000000600082015250565b60006153fa600b83613934565b9150615405826153c4565b602082019050919050565b60006020820190508181036000830152615429816153ed565b9050919050565b7f63616e6e6f74207472616e736665720000000000000000000000000000000000600082015250565b6000615466600f83613934565b915061547182615430565b602082019050919050565b6000602082019050818103600083015261549581615459565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154c38261549c565b6154cd81856154a7565b93506154dd818560208601613945565b6154e681613978565b840191505092915050565b600060a082019050615506600083018861436d565b615513602083018761436d565b8181036040830152615525818661413d565b90508181036060830152615539818561413d565b9050818103608083015261554d81846154b8565b90509695505050505050565b6000815190506155688161389a565b92915050565b60006020828403121561558457615583613766565b5b600061559284828501615559565b91505092915050565b60008160e01c9050919050565b600060033d11156155c75760046000803e6155c460005161559b565b90505b90565b600060443d10615657576155dc61375c565b60043d036004823e80513d602482011167ffffffffffffffff82111715615604575050615657565b808201805167ffffffffffffffff8111156156225750505050615657565b80602083010160043d03850181111561563f575050505050615657565b61564e82602001850186613b2d565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006156b6603483613934565b91506156c18261565a565b604082019050919050565b600060208201905081810360008301526156e5816156a9565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615748602883613934565b9150615753826156ec565b604082019050919050565b600060208201905081810360008301526157778161573b565b9050919050565b600060a082019050615793600083018861436d565b6157a0602083018761436d565b6157ad6040830186613844565b6157ba6060830185613844565b81810360808301526157cc81846154b8565b9050969550505050505056fea2646970667358221220e4e6fd62a3dc541486fec981e215254733678a8d5a00dc004478c91f4a88c0a664736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002254455354202d20546f6f6c73202d20416c6c6f77207570646174652073796d626f6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b534b494c4c53504c4943450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042697066733a2f2f6261666b726569677563686678716e706c6d3568706a67357a3761327a6e6f6d6161343473797672377775776c6f737469366d6477636c66727969000000000000000000000000000000000000000000000000000000000000

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading