false
false

Contract Address Details

0x1F5F2dDEbA15Ba7E91892c9D1E44141dfA3D212d

Contract Name
cityGPT
Creator
0x864f78–c6436b at 0xe9d408–0d9b79
Balance
0
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
16042484
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
cityGPT




Optimization enabled
true
Compiler version
v0.8.0+commit.c7dfd78e




Optimization runs
200
EVM Version
default




Verified at
2024-09-12T09:27:29.600150Z

Contract source code

Sol2uml
new
pragma solidity ^0.8.0;

contract cityGPT {
    struct KnowledgeEntry {
        string content;
        address contributor;
        uint256 timestamp;
        bool verified;
    }

    struct Contributor {
        bool isRegistered;
        bool isTrusted;
    }

    address public cityAdmin;
    mapping(bytes32 => KnowledgeEntry) public knowledgeBase;
    mapping(address => Contributor) public contributors;
    bytes32[] public entryKeys;

    event ContributorRegistered(address indexed contributor, bool isTrusted);
    event KnowledgeAdded(bytes32 indexed entryId, address indexed contributor);
    event KnowledgeVerified(bytes32 indexed entryId);
    event KnowledgeUpdated(bytes32 indexed entryId, address indexed contributor);

    modifier onlyCityAdmin() {
        require(msg.sender == cityAdmin, "Only city admin can call this function");
        _;
    }

    modifier onlyRegisteredContributor() {
        require(contributors[msg.sender].isRegistered, "Only registered contributors can call this function");
        _;
    }

    constructor() {
        cityAdmin = msg.sender;
    }

    function registerContributor(address _contributor, bool _isTrusted) public onlyCityAdmin {
        require(!contributors[_contributor].isRegistered, "Contributor already registered");
        contributors[_contributor] = Contributor(true, _isTrusted);
        emit ContributorRegistered(_contributor, _isTrusted);
    }

    function addKnowledge(string memory _content, string memory _category) public onlyRegisteredContributor {
        bytes32 entryId = keccak256(abi.encodePacked(_content, _category, block.timestamp));
        knowledgeBase[entryId] = KnowledgeEntry(_content, msg.sender, block.timestamp, contributors[msg.sender].isTrusted);
        entryKeys.push(entryId);
        emit KnowledgeAdded(entryId, msg.sender);
    }

    function verifyKnowledge(bytes32 _entryId) public onlyCityAdmin {
        require(!knowledgeBase[_entryId].verified, "Entry already verified");
        knowledgeBase[_entryId].verified = true;
        emit KnowledgeVerified(_entryId);
    }

    function updateKnowledge(bytes32 _entryId, string memory _newContent) public {
        require(msg.sender == knowledgeBase[_entryId].contributor || msg.sender == cityAdmin, "Unauthorized to update");
        knowledgeBase[_entryId].content = _newContent;
        knowledgeBase[_entryId].timestamp = block.timestamp;
        knowledgeBase[_entryId].verified = contributors[msg.sender].isTrusted;
        emit KnowledgeUpdated(_entryId, msg.sender);
    }

    function getKnowledgeEntry(bytes32 _entryId) public view returns (string memory, address, uint256, bool) {
        KnowledgeEntry memory entry = knowledgeBase[_entryId];
        return (entry.content, entry.contributor, entry.timestamp, entry.verified);
    }

    function getEntryCount() public view returns (uint256) {
        return entryKeys.length;
    }

    function getEntryByIndex(uint256 _index) public view returns (bytes32) {
        require(_index < entryKeys.length, "Index out of bounds");
        return entryKeys[_index];
    }

    function searchKnowledge(string memory _keyword) public view returns (bytes32[] memory) {
        bytes32[] memory results = new bytes32[](entryKeys.length);
        uint256 count = 0;

        for (uint256 i = 0; i < entryKeys.length; i++) {
            if (contains(knowledgeBase[entryKeys[i]].content, _keyword)) {
                results[count] = entryKeys[i];
                count++;
            }
        }

        // Resize the array to the actual number of results
        bytes32[] memory finalResults = new bytes32[](count);
        for (uint256 i = 0; i < count; i++) {
            finalResults[i] = results[i];
        }

        return finalResults;
    }

    function contains(string memory _haystack, string memory _needle) internal pure returns (bool) {
        bytes memory haystackBytes = bytes(_haystack);
        bytes memory needleBytes = bytes(_needle);

        for (uint256 i = 0; i <= haystackBytes.length - needleBytes.length; i++) {
            bool found = true;
            for (uint256 j = 0; j < needleBytes.length; j++) {
                if (haystackBytes[i + j] != needleBytes[j]) {
                    found = false;
                    break;
                }
            }
            if (found) {
                return true;
            }
        }
        return false;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ContributorRegistered","inputs":[{"type":"address","name":"contributor","internalType":"address","indexed":true},{"type":"bool","name":"isTrusted","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"KnowledgeAdded","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true},{"type":"address","name":"contributor","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KnowledgeUpdated","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true},{"type":"address","name":"contributor","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KnowledgeVerified","inputs":[{"type":"bytes32","name":"entryId","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addKnowledge","inputs":[{"type":"string","name":"_content","internalType":"string"},{"type":"string","name":"_category","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"cityAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isRegistered","internalType":"bool"},{"type":"bool","name":"isTrusted","internalType":"bool"}],"name":"contributors","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"entryKeys","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getEntryByIndex","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEntryCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"}],"name":"getKnowledgeEntry","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"content","internalType":"string"},{"type":"address","name":"contributor","internalType":"address"},{"type":"uint256","name":"timestamp","internalType":"uint256"},{"type":"bool","name":"verified","internalType":"bool"}],"name":"knowledgeBase","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerContributor","inputs":[{"type":"address","name":"_contributor","internalType":"address"},{"type":"bool","name":"_isTrusted","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"searchKnowledge","inputs":[{"type":"string","name":"_keyword","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateKnowledge","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"},{"type":"string","name":"_newContent","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"verifyKnowledge","inputs":[{"type":"bytes32","name":"_entryId","internalType":"bytes32"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055611193806100326000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063be7fe8eb11610071578063be7fe8eb14610163578063c2797a3114610178578063c793fa061461018b578063c9430c001461019e578063e8cc846d146101b1578063eedffb54146101c4576100b4565b80631f6d4942146100b957806358cd8389146100e3578063702fb5d8146100f857806377b11201146101185780637a360e651461013b5780638fc80ccd14610150575b600080fd5b6100cc6100c7366004610cd0565b6101d7565b6040516100da929190610eb2565b60405180910390f35b6100f66100f1366004610d43565b6101f5565b005b61010b610106366004610d88565b6102e3565b6040516100da9190610e63565b61012b610126366004610d2b565b61056c565b6040516100da9493929190610ecd565b610143610679565b6040516100da9190610ec4565b61014361015e366004610d2b565b61067f565b61016b6106d6565b6040516100da9190610e4f565b610143610186366004610d2b565b6106e5565b6100f6610199366004610d2b565b610706565b6100f66101ac366004610cf1565b6107ab565b6100f66101bf366004610dc3565b61089e565b61012b6101d2366004610d2b565b6109fc565b60026020526000908152604090205460ff8082169161010090041682565b600082815260016020819052604090912001546001600160a01b031633148061022857506000546001600160a01b031633145b61024d5760405162461bcd60e51b81526004016102449061104c565b60405180910390fd5b6000828152600160209081526040909120825161026c92840190610b9f565b50600082815260016020818152604080842042600280830191909155338087529084528286205488875294909352600301805460ff191661010090940460ff161515939093179092559051909184917f89c0d92099158b14347f45708d39d0288d4a5f198bb279790c925f9f8a1369769190a35050565b60035460609060009067ffffffffffffffff81111561031257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561033b578160200160208202803683370190505b5090506000805b60035481101561049b5761041f600160006003848154811061037457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020600001805461039b906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906110db565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505086610abb565b15610489576003818154811061044557634e487b7160e01b600052603260045260246000fd5b906000526020600020015483838151811061047057634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161048581611116565b9250505b8061049381611116565b915050610342565b5060008167ffffffffffffffff8111156104c557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156104ee578160200160208202803683370190505b50905060005b828110156105615783818151811061051c57634e487b7160e01b600052603260045260246000fd5b602002602001015182828151811061054457634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061055981611116565b9150506104f4565b50925050505b919050565b6060600080600080600160008781526020019081526020016000206040518060800160405290816000820180546105a2906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce906110db565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b505050918352505060018201546001600160a01b0316602080830191909152600283015460408084019190915260039093015460ff161515606092830152835190840151928401519390910151909991985091965090945092505050565b60035490565b60035460009082106106a35760405162461bcd60e51b81526004016102449061101f565b600382815481106106c457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b031681565b600381815481106106f557600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146107305760405162461bcd60e51b815260040161024490610fa9565b60008181526001602052604090206003015460ff16156107625760405162461bcd60e51b815260040161024490610fef565b6000818152600160208190526040808320600301805460ff19169092179091555182917f3c8c30ce680635c6e3fc8a2d6bf0b6297b34621c97c66b9dc3a85755ba01544391a250565b6000546001600160a01b031633146107d55760405162461bcd60e51b815260040161024490610fa9565b6001600160a01b03821660009081526002602052604090205460ff161561080e5760405162461bcd60e51b815260040161024490610f72565b6040805180820182526001815282151560208083019182526001600160a01b038616600081815260029092529084902092518354925115156101000261ff001991151560ff1990941693909317169190911790915590517ff3f0d25f6afbac328f2b1ef4cc4b9167f2c393b211885a1174d68c6d0cea165a90610892908490610ea7565b60405180910390a25050565b3360009081526002602052604090205460ff166108cd5760405162461bcd60e51b815260040161024490610f1f565b60008282426040516020016108e493929190610e1a565b60408051808303601f19018152828252805160209182012060808401835286845233828501819052428585015260009081526002835283812054610100900460ff1615156060860152818152600183529290922083518051939550909261094e9284920190610b9f565b506020820151600182810180546001600160a01b0319166001600160a01b039093169290921790915560408084015160028401556060909301516003928301805460ff19169115159190911790558154908101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390559051339183917f97c6a4ce290c17bfc896dc236ce71bc1166d13f30e824f99d51b60f52b07af3f9190a3505050565b600160205260009081526040902080548190610a17906110db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906110db565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b505050506001830154600284015460039094015492936001600160a01b039091169290915060ff1684565b60008282825b81518351610acf9190611094565b8111610b9157600160005b8351811015610b6a57838181518110610b0357634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191685610b1d838661107c565b81518110610b3b57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191614610b585760009150610b6a565b80610b6281611116565b915050610ada565b508015610b7e576001945050505050610b99565b5080610b8981611116565b915050610ac1565b506000925050505b92915050565b828054610bab906110db565b90600052602060002090601f016020900481019282610bcd5760008555610c13565b82601f10610be657805160ff1916838001178555610c13565b82800160010185558215610c13579182015b82811115610c13578251825591602001919060010190610bf8565b50610c1f929150610c23565b5090565b5b80821115610c1f5760008155600101610c24565b80356001600160a01b038116811461056757600080fd5b600082601f830112610c5f578081fd5b813567ffffffffffffffff80821115610c7a57610c7a611147565b604051601f8301601f191681016020018281118282101715610c9e57610c9e611147565b604052828152848301602001861015610cb5578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ce1578081fd5b610cea82610c38565b9392505050565b60008060408385031215610d03578081fd5b610d0c83610c38565b915060208301358015158114610d20578182fd5b809150509250929050565b600060208284031215610d3c578081fd5b5035919050565b60008060408385031215610d55578182fd5b82359150602083013567ffffffffffffffff811115610d72578182fd5b610d7e85828601610c4f565b9150509250929050565b600060208284031215610d99578081fd5b813567ffffffffffffffff811115610daf578182fd5b610dbb84828501610c4f565b949350505050565b60008060408385031215610dd5578182fd5b823567ffffffffffffffff80821115610dec578384fd5b610df886838701610c4f565b93506020850135915080821115610e0d578283fd5b50610d7e85828601610c4f565b60008451610e2c8184602089016110ab565b845190830190610e408183602089016110ab565b01928352505060200192915050565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015610e9b57835183529284019291840191600101610e7f565b50909695505050505050565b901515815260200190565b91151582521515602082015260400190565b90815260200190565b6000608082528551806080840152610eec8160a0850160208a016110ab565b6001600160a01b039590951660208301525060408101929092521515606082015260a0601f909201601f19160101919050565b60208082526033908201527f4f6e6c79207265676973746572656420636f6e7472696275746f72732063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b6020808252601e908201527f436f6e7472696275746f7220616c726561647920726567697374657265640000604082015260600190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b602080825260169082015275115b9d1c9e48185b1c9958591e481d995c9a599a595960521b604082015260600190565b602080825260139082015272496e646578206f7574206f6620626f756e647360681b604082015260600190565b602080825260169082015275556e617574686f72697a656420746f2075706461746560501b604082015260600190565b6000821982111561108f5761108f611131565b500190565b6000828210156110a6576110a6611131565b500390565b60005b838110156110c65781810151838201526020016110ae565b838111156110d5576000848401525b50505050565b6002810460018216806110ef57607f821691505b6020821081141561111057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561112a5761112a611131565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122008e8ecda6ef7288b095545672ddf8d017950c78d53659b6240877ff5d684814264736f6c63430008000033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063be7fe8eb11610071578063be7fe8eb14610163578063c2797a3114610178578063c793fa061461018b578063c9430c001461019e578063e8cc846d146101b1578063eedffb54146101c4576100b4565b80631f6d4942146100b957806358cd8389146100e3578063702fb5d8146100f857806377b11201146101185780637a360e651461013b5780638fc80ccd14610150575b600080fd5b6100cc6100c7366004610cd0565b6101d7565b6040516100da929190610eb2565b60405180910390f35b6100f66100f1366004610d43565b6101f5565b005b61010b610106366004610d88565b6102e3565b6040516100da9190610e63565b61012b610126366004610d2b565b61056c565b6040516100da9493929190610ecd565b610143610679565b6040516100da9190610ec4565b61014361015e366004610d2b565b61067f565b61016b6106d6565b6040516100da9190610e4f565b610143610186366004610d2b565b6106e5565b6100f6610199366004610d2b565b610706565b6100f66101ac366004610cf1565b6107ab565b6100f66101bf366004610dc3565b61089e565b61012b6101d2366004610d2b565b6109fc565b60026020526000908152604090205460ff8082169161010090041682565b600082815260016020819052604090912001546001600160a01b031633148061022857506000546001600160a01b031633145b61024d5760405162461bcd60e51b81526004016102449061104c565b60405180910390fd5b6000828152600160209081526040909120825161026c92840190610b9f565b50600082815260016020818152604080842042600280830191909155338087529084528286205488875294909352600301805460ff191661010090940460ff161515939093179092559051909184917f89c0d92099158b14347f45708d39d0288d4a5f198bb279790c925f9f8a1369769190a35050565b60035460609060009067ffffffffffffffff81111561031257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561033b578160200160208202803683370190505b5090506000805b60035481101561049b5761041f600160006003848154811061037457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548152602001908152602001600020600001805461039b906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906110db565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505086610abb565b15610489576003818154811061044557634e487b7160e01b600052603260045260246000fd5b906000526020600020015483838151811061047057634e487b7160e01b600052603260045260246000fd5b60209081029190910101528161048581611116565b9250505b8061049381611116565b915050610342565b5060008167ffffffffffffffff8111156104c557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156104ee578160200160208202803683370190505b50905060005b828110156105615783818151811061051c57634e487b7160e01b600052603260045260246000fd5b602002602001015182828151811061054457634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061055981611116565b9150506104f4565b50925050505b919050565b6060600080600080600160008781526020019081526020016000206040518060800160405290816000820180546105a2906110db565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce906110db565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b505050918352505060018201546001600160a01b0316602080830191909152600283015460408084019190915260039093015460ff161515606092830152835190840151928401519390910151909991985091965090945092505050565b60035490565b60035460009082106106a35760405162461bcd60e51b81526004016102449061101f565b600382815481106106c457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000546001600160a01b031681565b600381815481106106f557600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146107305760405162461bcd60e51b815260040161024490610fa9565b60008181526001602052604090206003015460ff16156107625760405162461bcd60e51b815260040161024490610fef565b6000818152600160208190526040808320600301805460ff19169092179091555182917f3c8c30ce680635c6e3fc8a2d6bf0b6297b34621c97c66b9dc3a85755ba01544391a250565b6000546001600160a01b031633146107d55760405162461bcd60e51b815260040161024490610fa9565b6001600160a01b03821660009081526002602052604090205460ff161561080e5760405162461bcd60e51b815260040161024490610f72565b6040805180820182526001815282151560208083019182526001600160a01b038616600081815260029092529084902092518354925115156101000261ff001991151560ff1990941693909317169190911790915590517ff3f0d25f6afbac328f2b1ef4cc4b9167f2c393b211885a1174d68c6d0cea165a90610892908490610ea7565b60405180910390a25050565b3360009081526002602052604090205460ff166108cd5760405162461bcd60e51b815260040161024490610f1f565b60008282426040516020016108e493929190610e1a565b60408051808303601f19018152828252805160209182012060808401835286845233828501819052428585015260009081526002835283812054610100900460ff1615156060860152818152600183529290922083518051939550909261094e9284920190610b9f565b506020820151600182810180546001600160a01b0319166001600160a01b039093169290921790915560408084015160028401556060909301516003928301805460ff19169115159190911790558154908101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390559051339183917f97c6a4ce290c17bfc896dc236ce71bc1166d13f30e824f99d51b60f52b07af3f9190a3505050565b600160205260009081526040902080548190610a17906110db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906110db565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b505050506001830154600284015460039094015492936001600160a01b039091169290915060ff1684565b60008282825b81518351610acf9190611094565b8111610b9157600160005b8351811015610b6a57838181518110610b0357634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191685610b1d838661107c565b81518110610b3b57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191614610b585760009150610b6a565b80610b6281611116565b915050610ada565b508015610b7e576001945050505050610b99565b5080610b8981611116565b915050610ac1565b506000925050505b92915050565b828054610bab906110db565b90600052602060002090601f016020900481019282610bcd5760008555610c13565b82601f10610be657805160ff1916838001178555610c13565b82800160010185558215610c13579182015b82811115610c13578251825591602001919060010190610bf8565b50610c1f929150610c23565b5090565b5b80821115610c1f5760008155600101610c24565b80356001600160a01b038116811461056757600080fd5b600082601f830112610c5f578081fd5b813567ffffffffffffffff80821115610c7a57610c7a611147565b604051601f8301601f191681016020018281118282101715610c9e57610c9e611147565b604052828152848301602001861015610cb5578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215610ce1578081fd5b610cea82610c38565b9392505050565b60008060408385031215610d03578081fd5b610d0c83610c38565b915060208301358015158114610d20578182fd5b809150509250929050565b600060208284031215610d3c578081fd5b5035919050565b60008060408385031215610d55578182fd5b82359150602083013567ffffffffffffffff811115610d72578182fd5b610d7e85828601610c4f565b9150509250929050565b600060208284031215610d99578081fd5b813567ffffffffffffffff811115610daf578182fd5b610dbb84828501610c4f565b949350505050565b60008060408385031215610dd5578182fd5b823567ffffffffffffffff80821115610dec578384fd5b610df886838701610c4f565b93506020850135915080821115610e0d578283fd5b50610d7e85828601610c4f565b60008451610e2c8184602089016110ab565b845190830190610e408183602089016110ab565b01928352505060200192915050565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015610e9b57835183529284019291840191600101610e7f565b50909695505050505050565b901515815260200190565b91151582521515602082015260400190565b90815260200190565b6000608082528551806080840152610eec8160a0850160208a016110ab565b6001600160a01b039590951660208301525060408101929092521515606082015260a0601f909201601f19160101919050565b60208082526033908201527f4f6e6c79207265676973746572656420636f6e7472696275746f72732063616e6040820152721031b0b636103a3434b990333ab731ba34b7b760691b606082015260800190565b6020808252601e908201527f436f6e7472696275746f7220616c726561647920726567697374657265640000604082015260600190565b60208082526026908201527f4f6e6c7920636974792061646d696e2063616e2063616c6c20746869732066756040820152653731ba34b7b760d11b606082015260800190565b602080825260169082015275115b9d1c9e48185b1c9958591e481d995c9a599a595960521b604082015260600190565b602080825260139082015272496e646578206f7574206f6620626f756e647360681b604082015260600190565b602080825260169082015275556e617574686f72697a656420746f2075706461746560501b604082015260600190565b6000821982111561108f5761108f611131565b500190565b6000828210156110a6576110a6611131565b500390565b60005b838110156110c65781810151838201526020016110ae565b838111156110d5576000848401525b50505050565b6002810460018216806110ef57607f821691505b6020821081141561111057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561112a5761112a611131565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122008e8ecda6ef7288b095545672ddf8d017950c78d53659b6240877ff5d684814264736f6c63430008000033