Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Config
- Optimization enabled
- true
- Compiler version
- v0.8.23+commit.f704f362
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2024-06-14T19:19:03.855586Z
Constructor Arguments
0x000000000000000000000000ecff74da7b590b733f9a8a08ea6ed31e75734e20
Arg [0] (address) : 0xecff74da7b590b733f9a8a08ea6ed31e75734e20
contracts/audited/Config.sol
// SPDX-License-Identifier: UNLICENSED
// ©Copyright, 2023, AlexNa Holdings, Inc, All Rights Reserved
// SAVVA ecosystem environment variables
// by @AlexNa
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/IConfig.sol";
contract Config is IConfig, Ownable {
mapping(bytes32 => string) public config;
mapping(bytes32 => uint256) public configUint;
mapping(bytes32 => address) public configAddress;
constructor(address _initialOwner) Ownable(_initialOwner) {
configUint[bytes32("authorShare")] = 400; // share of the author in the content fund in percents * 100 ( 100 = 1%)
configUint[bytes32("nftOwnerCut")] = 200; // NFT owner's cut in percents * 100 ( 100 = 1%)
configUint[bytes32("minContribution")] = 1 ether; // minimum contribution to the content fund in SAVVA tokens
configUint[bytes32("timeForRound")] = 3 days; // how long is the round of the content fund in seconds
configUint[bytes32("winnerShare")] = 30; // round prize share of the fund in percents
configUint[bytes32("minFundToShare")] = 100 ether; // minimum fund to share in SAVVA tokens
configUint[bytes32("staking_withdraw_delay")] = 14 days; // staking cooldown time in seconds
configUint[bytes32("contentNFT_mintPrice")] = 10000 ether; // price to mint a content NFT
configUint[bytes32("sac_min_deposit")] = 10000 ether; // minimum deposit to sac for SAVVA tokens
configUint[bytes32("patron_payment_period")] = 7 days; // period of patron payments in seconds
configUint[bytes32("gov_proposal_price")] = 1000 ether; // price to create a proposal
configAddress[bytes32("contract_savvaToken")] = address(0); // SAVVA token contract
configAddress[bytes32("contract_randomOracle")] = address(0); // random oracle (0 - no oracle)
configAddress[bytes32("contract_staking")] = address(0); // Staking contract
configAddress[bytes32("contract_userProfile")] = address(0); // Staking contract
configAddress[bytes32("contract_contentNFT")] = address(0); // Content NFT contract
configAddress[bytes32("contract_contentFund")] = address(0); // Content Fund contract
configAddress[bytes32("contract_governance")] = address(0); // Governance contract
configAddress[bytes32("contract_contentRegistry")] = address(0); // Content Registry contract
configAddress[bytes32("contract_savvaFaucet")] = address(0); // SAVVA Faucet contract
configAddress[bytes32("contract_nftMarketplace")] = address(0); // NFT Market Place contract
configAddress[bytes32("contract_promo")] = address(0); // Promo contract
configAddress[bytes32("contract_buyBurn")] = address(0); // Buy&Burn contract
configAddress[bytes32("contract_listMarket")] = address(0); // List Market contract
configAddress[bytes32("contract_authorOfTheMonth")] = address(0); // Author of the Month contract
// Buy & Burn parameters
configAddress[bytes32("pulsex_factory")] = address(
0x29eA7545DEf87022BAdc76323F373EA1e707C523 // Buy&Burn PulseX factory contract
);
configAddress[bytes32("WPLS")] = address(
0xA1077a294dDE1B09bB078844df40758a5D0f9a27 // WETH contract (WPLS)
);
configUint[bytes32("pulsex_slippage")] = 10; // slippage tolerance ( reserve/amount min)
// Minimum staked amounts
configUint[bytes32("min_staked_to_post")] = 5000 ether; // minimum staked amount to post content
}
event ConfigSet(bytes32 key, string value);
event ConfigUintSet(bytes32 key, uint256 value);
event ConfigAddressSet(bytes32 key, address value);
function set(bytes32 key, string memory value) public override {
require(
_msgSender() == owner() ||
_msgSender() == configAddress[bytes32("contract_governance")],
"Config: caller is not the owner or governance"
);
config[key] = value;
emit ConfigSet(key, value);
}
function get(bytes32 key) public view override returns (string memory) {
return config[key];
}
function setUInt(bytes32 key, uint256 value) public override {
require(
_msgSender() == owner() ||
_msgSender() == configAddress[bytes32("contract_governance")],
"Config: caller is not the owner or governance"
);
configUint[key] = value;
emit ConfigUintSet(key, value);
}
function getUInt(bytes32 key) public view override returns (uint256) {
return configUint[key];
}
function setAddr(bytes32 key, address value) public override {
require(
_msgSender() == owner() ||
_msgSender() == configAddress[bytes32("contract_governance")],
"Config: caller is not the owner or governance"
);
configAddress[key] = value;
emit ConfigAddressSet(key, value);
}
function getAddr(bytes32 key) public view override returns (address) {
return configAddress[key];
}
}
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
contracts/interfaces/IConfig.sol
// SPDX-License-Identifier: UNLICENSED
// ©Copyright, 2023, AlexNa Holdings, Inc, All Rights Reserved
// Config contract interface
// by AlexNa
pragma solidity ^0.8.18;
interface IConfig {
function get(bytes32 key) external view returns (string memory);
function getUInt(bytes32 key) external view returns (uint256);
function getAddr(bytes32 key) external view returns (address);
function set(bytes32 key, string memory value) external;
function setUInt(bytes32 key, uint256 value) external;
function setAddr(bytes32 key, address value) external;
}
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_initialOwner","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"ConfigAddressSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"address","name":"value","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ConfigSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"string","name":"value","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ConfigUintSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"config","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"configAddress","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"configUint","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"get","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAddr","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUInt","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"string","name":"value","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAddr","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"address","name":"value","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setUInt","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5060405161103438038061103483398101604081905261002f91610588565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006781610538565b50506101907fe82f4dc6acd7163eed06bcb03b7783e1cb7f11cf389fca63170111ab7dba774a5560c87fd6091c3a496137fad5dcf61b9505f5488512cf5043739c41ccfa977231c014bd55670de0b6b3a76400007f603609b2c2bb017d39fc13b1acac7e9071c509508049b9d437d2b8ab9258d21c556203f4807f71af2c92516b5a9cd62fcea203091fd00db25777a829204e681a610d632b4a6155601e7f145c9b183db5871a1f1134e8574bcb81e0c534747ff73e19c8d06fd9031fdf1d5568056bc75e2d631000007f4402a146191f98f03503061e60f4930c614adc376a00e1570929af57d72146c955621275007ff5b377329cf0862e53e74aa2a9e602ebfd867eca8304e2bfb1c79a248287d9a15569021e19e0c9bab24000007f0185a557c2e340e8faca46143badb71fbdd5945f1528a07c8d3e9326e39bbf8d8190557fb3c8adeec1cd709170af8d40afaffa16036d22c2239d1e8db4e6cf130c4d8ea75562093a807f2f342517fbbb18ff068ae91609869ce0255e783d1c23d689b0005f359c34a9f155683635c9adc5dea000007f9705b021a3cac36d6c3a5463937b2a6acdac2d269a436bf547a496e0e4e01b61557f59849912ec13f3e1d95003b4df71a78fdf5ff3f4d56620e488fc4897bc5cd13f80546001600160a01b03199081169091557f75b0e8f1636d6ffce857d19250594fc7652f2284701ca59081ea1bdcbbd0a0b88054821690557ffdcbff1dec12e373b2c8106ba54caf4945fd5e4f7e669856757e6540d41798258054821690557f7bdc2df71ea2f77fdad38621e9c4d4b71849cd396623ce414da88191fd2cb84f8054821690557fd75cf8e0f90f7c4105be3afd8f4fe5683bcacd42c22deefdcb239b788d768f968054821690557f9debec972be40180b8a1a3403915ea069cc5e62d344ad834db2f20dd8afc2c448054821690557f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b211958054821690557fa56d8c8e614d28d9fad2d0fcb06bd8be488f7f9ac3003e6b8821dd637445e3ef8054821690557fb1cedc34c4521f324d7c6a0c5b48484fcb80a050f1036c845f9dc06356a4749e8054821690557f26a9aad8893a1a66a4639a83575abc8189845f077e135ec437b8b761af468ce68054821690557f0dcbe77190c4365155ad352e498042663dd8421f160ff69ab40604b1b672b0f98054821690557f5d57400de72fc973ca563950a2b8dec9078edc813c2fac84a217b1c6d2cb61c28054821690557f9f3baa1b3e0576da46abd0fc48e2a5b38d7c7e2194ef571f2bf65d2904fc749d8054821690557f6d5f6dc3eef010e9dba3350eba24c58ce644701c6e9547e9fc10413ab7ca6c498054821690557f82a5463334d9fc019140882ee41d1c1fc77911c33e0d7a77f984119bb9eee22a805482167329ea7545def87022badc76323f373ea1e707c5231790557fea22e330469ea483c306b6591e13e96cd90083fbb78a104593db5a3d59c0b3ee805490911673a1077a294dde1b09bb078844df40758a5d0f9a271790556002602052600a7f9f72a11af3a1f9ec537ef017bdf7dc30b30e9607c1f9bf6dbf29f9dd359ba50a55711b5a5b97dcdd185ad95917dd1bd7dc1bdcdd60721b60005269010f0cf064dd592000007fc55d7162b5b323ab2b48479c9eb159240586ac4c1a396569f9d52be2f23ccf78556105b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561059a57600080fd5b81516001600160a01b03811681146105b157600080fd5b9392505050565b610a6d806105c76000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b480003311610071578063b48000331461017b578063cc718f761461018e578063d1497974146101a1578063d5fa2b00146101c1578063f2fde38b146101d4578063f6ab6d99146101e757600080fd5b80634ccee9b6146100b95780635aec6259146100ff5780636ca402aa1461012d578063715018a6146101425780638da5cb5b1461014a5780638eaa6ac01461015b575b600080fd5b6100e26100c73660046106af565b6000908152600360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b61011f61010d3660046106af565b60009081526002602052604090205490565b6040519081526020016100f6565b61014061013b3660046106c8565b610210565b005b6101406102ef565b6000546001600160a01b03166100e2565b61016e6101693660046106af565b610303565b6040516100f69190610730565b610140610189366004610760565b6103a5565b61016e61019c3660046106af565b610475565b61011f6101af3660046106af565b60026020526000908152604090205481565b6101406101cf366004610837565b61050f565b6101406101e2366004610863565b6105f4565b6100e26101f53660046106af565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061027a575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61029f5760405162461bcd60e51b81526004016102969061087e565b60405180910390fd5b60008281526002602090815260409182902083905581518481529081018390527f6fa0b3b1f0c099a6546524f51cfe670b8d7d2fd04d92b23947bc31f6d6d39d4891015b60405180910390a15050565b6102f7610632565b610301600061065f565b565b6000818152600160205260409020805460609190610320906108cb565b80601f016020809104026020016040519081016040528092919081815260200182805461034c906108cb565b80156103995780601f1061036e57610100808354040283529160200191610399565b820191906000526020600020905b81548152906001019060200180831161037c57829003601f168201915b50505050509050919050565b6000546001600160a01b031633148061040f575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61042b5760405162461bcd60e51b81526004016102969061087e565b60008281526001602052604090206104438282610956565b507ffaa64e5c84378932cdde82210614c85e045b50036f1845d76065b3df58ff642e82826040516102e3929190610a16565b6001602052600090815260409020805461048e906108cb565b80601f01602080910402602001604051908101604052809291908181526020018280546104ba906108cb565b80156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b505050505081565b6000546001600160a01b0316331480610579575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b6105955760405162461bcd60e51b81526004016102969061087e565b60008281526003602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251858152918201527fc49a1532a3a86c7c2959f79966bf474864dd28e1af8910c0ab29cf86232d870291016102e3565b6105fc610632565b6001600160a01b03811661062657604051631e4fbdf760e01b815260006004820152602401610296565b61062f8161065f565b50565b6000546001600160a01b031633146103015760405163118cdaa760e01b8152336004820152602401610296565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156106c157600080fd5b5035919050565b600080604083850312156106db57600080fd5b50508035926020909101359150565b6000815180845260005b81811015610710576020818501810151868301820152016106f4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061074360208301846106ea565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561077357600080fd5b82359150602083013567ffffffffffffffff8082111561079257600080fd5b818501915085601f8301126107a657600080fd5b8135818111156107b8576107b861074a565b604051601f8201601f19908116603f011681019083821181831017156107e0576107e061074a565b816040528281528860208487010111156107f957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80356001600160a01b038116811461083257600080fd5b919050565b6000806040838503121561084a57600080fd5b8235915061085a6020840161081b565b90509250929050565b60006020828403121561087557600080fd5b6107438261081b565b6020808252602d908201527f436f6e6669673a2063616c6c6572206973206e6f7420746865206f776e65722060408201526c6f7220676f7665726e616e636560981b606082015260800190565b600181811c908216806108df57607f821691505b6020821081036108ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610951576000816000526020600020601f850160051c8101602086101561092e5750805b601f850160051c820191505b8181101561094d5782815560010161093a565b5050505b505050565b815167ffffffffffffffff8111156109705761097061074a565b6109848161097e84546108cb565b84610905565b602080601f8311600181146109b957600084156109a15750858301515b600019600386901b1c1916600185901b17855561094d565b600085815260208120601f198616915b828110156109e8578886015182559484019460019091019084016109c9565b5085821015610a065787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000610a2f60408301846106ea565b94935050505056fea2646970667358221220ee71ceb279011ef432ef88bfb1b895f40ce9162a93be9089ed8ee0f96509fac864736f6c63430008170033000000000000000000000000ecff74da7b590b733f9a8a08ea6ed31e75734e20
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b480003311610071578063b48000331461017b578063cc718f761461018e578063d1497974146101a1578063d5fa2b00146101c1578063f2fde38b146101d4578063f6ab6d99146101e757600080fd5b80634ccee9b6146100b95780635aec6259146100ff5780636ca402aa1461012d578063715018a6146101425780638da5cb5b1461014a5780638eaa6ac01461015b575b600080fd5b6100e26100c73660046106af565b6000908152600360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b61011f61010d3660046106af565b60009081526002602052604090205490565b6040519081526020016100f6565b61014061013b3660046106c8565b610210565b005b6101406102ef565b6000546001600160a01b03166100e2565b61016e6101693660046106af565b610303565b6040516100f69190610730565b610140610189366004610760565b6103a5565b61016e61019c3660046106af565b610475565b61011f6101af3660046106af565b60026020526000908152604090205481565b6101406101cf366004610837565b61050f565b6101406101e2366004610863565b6105f4565b6100e26101f53660046106af565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061027a575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61029f5760405162461bcd60e51b81526004016102969061087e565b60405180910390fd5b60008281526002602090815260409182902083905581518481529081018390527f6fa0b3b1f0c099a6546524f51cfe670b8d7d2fd04d92b23947bc31f6d6d39d4891015b60405180910390a15050565b6102f7610632565b610301600061065f565b565b6000818152600160205260409020805460609190610320906108cb565b80601f016020809104026020016040519081016040528092919081815260200182805461034c906108cb565b80156103995780601f1061036e57610100808354040283529160200191610399565b820191906000526020600020905b81548152906001019060200180831161037c57829003601f168201915b50505050509050919050565b6000546001600160a01b031633148061040f575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61042b5760405162461bcd60e51b81526004016102969061087e565b60008281526001602052604090206104438282610956565b507ffaa64e5c84378932cdde82210614c85e045b50036f1845d76065b3df58ff642e82826040516102e3929190610a16565b6001602052600090815260409020805461048e906108cb565b80601f01602080910402602001604051908101604052809291908181526020018280546104ba906108cb565b80156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b505050505081565b6000546001600160a01b0316331480610579575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b6105955760405162461bcd60e51b81526004016102969061087e565b60008281526003602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251858152918201527fc49a1532a3a86c7c2959f79966bf474864dd28e1af8910c0ab29cf86232d870291016102e3565b6105fc610632565b6001600160a01b03811661062657604051631e4fbdf760e01b815260006004820152602401610296565b61062f8161065f565b50565b6000546001600160a01b031633146103015760405163118cdaa760e01b8152336004820152602401610296565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156106c157600080fd5b5035919050565b600080604083850312156106db57600080fd5b50508035926020909101359150565b6000815180845260005b81811015610710576020818501810151868301820152016106f4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061074360208301846106ea565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561077357600080fd5b82359150602083013567ffffffffffffffff8082111561079257600080fd5b818501915085601f8301126107a657600080fd5b8135818111156107b8576107b861074a565b604051601f8201601f19908116603f011681019083821181831017156107e0576107e061074a565b816040528281528860208487010111156107f957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80356001600160a01b038116811461083257600080fd5b919050565b6000806040838503121561084a57600080fd5b8235915061085a6020840161081b565b90509250929050565b60006020828403121561087557600080fd5b6107438261081b565b6020808252602d908201527f436f6e6669673a2063616c6c6572206973206e6f7420746865206f776e65722060408201526c6f7220676f7665726e616e636560981b606082015260800190565b600181811c908216806108df57607f821691505b6020821081036108ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610951576000816000526020600020601f850160051c8101602086101561092e5750805b601f850160051c820191505b8181101561094d5782815560010161093a565b5050505b505050565b815167ffffffffffffffff8111156109705761097061074a565b6109848161097e84546108cb565b84610905565b602080601f8311600181146109b957600084156109a15750858301515b600019600386901b1c1916600185901b17855561094d565b600085815260208120601f198616915b828110156109e8578886015182559484019460019091019084016109c9565b5085821015610a065787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000610a2f60408301846106ea565b94935050505056fea2646970667358221220ee71ceb279011ef432ef88bfb1b895f40ce9162a93be9089ed8ee0f96509fac864736f6c63430008170033